土日の勉強ノート

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

VirtualBoxのネットワークの理解(VirtualBox+Ubuntu 22.04)

今回からネットワークの理解を進めていきます。

今回は、VirtualBox + Ubuntu 22.04 で、環境構築していきます。

それでは、やっていきます。

はじめに

まずは、パケットキャプチャするために、Wireshark をインストールします。

その後、いろんなツールを使って、VirtualBox のネットワークが、どういう構成になっているのかを調べていきたいと思います。

Wiresharkのインストール

コマンドラインからインストールしていきます。

$ sudo apt update
$ sudo apt install wireshark

次のような画面になります。root権限ではなくても、Wireshark のグループのメンバに、パケットをキャプチャさせるかどうかを聞いています。

その方が便利なので、はいを選択します。

Wiresharkの設定
Wiresharkの設定

インストールが完了したら、現在のユーザを Wireshark のグループに追加します。

$ sudo usermod -a -G wireshark daisuke

早速、Wireshark を起動してみましたが、Wireshark のグループ追加が反映されてませんでした。再起動します。

再起動したら、起動してみます。

Wiresharkを起動する
Wiresharkを起動する

enp0s8 は、VirtualBox のホストオンリーアダプタで、enp0s3 がインターネットに繋がる方のアドレスです。ここでは、enp0s3 を見たいので、ダブルクリックします。

キャプチャするインタフェースを選択する
キャプチャするインタフェースを選択する

たくさん受信しています。フィルタを入れてみます。選択した enp0s3 の IP アドレスは、10.0.2.15 なので、同じネットワークから送信されたパケットだけを見てみます。

フィルタに、`ip.src == 10.0.2.0/24' を入力します。自分自身が送信したパケットばかりが見えています。

ちなみに、図の赤枠で囲ったところの左端のブックマークのアイコン?を押すと、いくつかのフィルタの例が見れますし、何度も入力するフィルタを保存したりできるようです。

フィルタを入力した
フィルタを入力した

正しく動作しているようなので、Wireshark のインストールは以上となります。

VirtualBoxのネットワークについて調べる

Windows10 にインストールした VirtualBox は、仮想マシンとして、Ubuntu 22.04 が動作しています。

その Ubuntu 22.04 で、ネットワークについて調査します。

手動でいくつかのコマンドを実行してみる

まずは、ifconfig コマンドを確認して、その後、route コマンドで確認します。

$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:58:d5:1e:0b  txqueuelen 0  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::eb16:b65:e9c5:ddc9  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:54:d5:cb  txqueuelen 1000  (イーサネット)
        RX packets 294  bytes 327933 (327.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 231  bytes 28292 (28.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::2d19:efaa:a12d:f974  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:c0:67:7d  txqueuelen 1000  (イーサネット)
        RX packets 207  bytes 29245 (29.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 166  bytes 26916 (26.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 270  bytes 31265 (31.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 270  bytes 31265 (31.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         _gateway        0.0.0.0         UG    100    0        0 enp0s3
10.0.2.0        0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 enp0s3
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.56.0    0.0.0.0         255.255.255.0   U     101    0        0 enp0s8

Ubuntu 22.04 のインターネットに繋がるのが、10.0.2.15 です。

他に、VirtualBox のホストオンリーアダプターと、Docker のインタフェースがありますが、今回は、10.0.2.15 に注目します。

先ほどの Wireshark で、10.0.0.0/24 の先頭あたりに ping を実行したときの様子を確認します。

フィルタを以下にします。10.0.2.1 は、ping の応答がありません。10.0.2.2 から 10.0.2.4 の 3つのアドレスは、ping の応答があります。

ip.addr == 10.0.2.1 or ip.addr == 10.0.2.2 or ip.addr == 10.0.2.3 or ip.addr == 10.0.2.4

10.0.2.1から10.0.2.4までのアドレスにフィルタを設定した
10.0.2.1から10.0.2.4までのアドレスにフィルタを設定した

ARP コマンドを実行してみます。

$ arp 10.0.2.1
アドレス               HWタイプ  HWアドレス         フラグ マスク インタフェース
10.0.2.1                         (不完全)                               enp0s3
$ arp 10.0.2.2
アドレス               HWタイプ  HWアドレス         フラグ マスク インタフェース
_gateway                 ether   52:54:00:12:35:02   C                     enp0s3
$ arp 10.0.2.3
アドレス               HWタイプ  HWアドレス         フラグ マスク インタフェース
10.0.2.3                 ether   52:54:00:12:35:03   C                     enp0s3
$ arp 10.0.2.4
アドレス               HWタイプ  HWアドレス         フラグ マスク インタフェース
10.0.2.4                 ether   52:54:00:12:35:04   C                     enp0s3

route コマンドに表示されていた _gateway に対して、ping を実行してみます。

$ ping _gateway
PING _gateway (10.0.2.2) 56(84) bytes of data.
64 bytes from _gateway (10.0.2.2): icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from _gateway (10.0.2.2): icmp_seq=2 ttl=64 time=0.187 ms
^C

10.0.2.2 がルーターのようです。

DHCP関係を調べる

ネットワークをオフ→オンして、DHCP サーバから IP アドレスが再配布されるところを、Wireshark で確認してみます。

Ubuntu 22.04 のネットワークをコマンドラインでオフ→オンする方法を調べたんですが、いろいろ書かれていて、自分の状況とは違って、よく分かりませんでした。

なので、GUI で単純にネットワークをオフ→オンしたいと思います。

Wireshark を起動して、キャプチャを開始しておきます。

次に、ネットワークをオフ→オンします。

ネットワークのオフ→オンはここで行う
ネットワークのオフ→オンはここで行う

以下はそのときの Wireshark のキャプチャ結果です。10.0.2.2 から DHCP に関する応答が返ってきてるようです。

Wiresharkのキャプチャ結果
Wiresharkのキャプチャ結果

10.0.2.2 はルーターであり、DHCP サーバも兼ねているということのようです。

DNS関係を調べる

続いて、DNS 関係を調べます。nslookup コマンドと、dig コマンドを使います。

$ nslookup www.yahoo.co.jp
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
www.yahoo.co.jp canonical name = edge12.g.yimg.jp.
Name:   edge12.g.yimg.jp
Address: 182.22.16.123

$ dig www.yahoo.co.jp

; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> www.yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62763
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.yahoo.co.jp.               IN      A

;; ANSWER SECTION:
www.yahoo.co.jp.        481     IN      CNAME   edge12.g.yimg.jp.
edge12.g.yimg.jp.       40      IN      A       182.22.25.124

;; AUTHORITY SECTION:
g.yimg.jp.              12      IN      NS      gns02.yahoo.co.jp.
g.yimg.jp.              12      IN      NS      gns12.yahoo.co.jp.

;; ADDITIONAL SECTION:
gns02.yahoo.co.jp.      520     IN      A       118.151.254.148
gns12.yahoo.co.jp.      520     IN      A       124.83.255.100

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Jul 14 19:51:27 JST 2024
;; MSG SIZE  rcvd: 160

なるほど、特に VirtualBox で DNS サーバを持っているというわけではなさそうです。

netdiscoverコマンドを使ってみる

さて、行き詰ったので、いろいろ調べてみると、netdiscover コマンドという便利なコマンドがあるようです。

なお、このコマンドは、指定したネットワークに対して、単純に arp コマンドを投げまくるツールらしいので、他の人の迷惑にならないところで使わないといけません。今回は、VirtualBox 内のネットワークに対して使用します。

まず、netdiscover コマンドをインストールします。

$ sudo apt install netdiscover

無事にインストール出来たので、早速使ってみます。

-r オプションで、ネットワークの範囲を指定して実行するのが、一般的な使い方のようです。

$ sudo netdiscover -r 10.0.2.0/24

 Currently scanning: Finished!   |   Screen View: Unique Hosts

 4 Captured ARP Req/Rep packets, from 3 hosts.   Total size: 240
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname
 -----------------------------------------------------------------------------
 10.0.2.2        52:54:00:12:35:02      2     120  Unknown vendor
 10.0.2.3        52:54:00:12:35:03      1      60  Unknown vendor
 10.0.2.4        52:54:00:12:35:04      1      60  Unknown vendor

3つのホストが見つかりました。手動で ping を実行した結果と同じですね。

nmapコマンドを使ってみる

ホストが絞り込めたので、次はそれぞれに対して、nmap コマンドによるポートスキャンを行ってみます。

この nmap コマンドも、自分の管理する範囲内での使用に留める必要があります。他の管理者が管理するネットワークで使用すると、ログからスキャンしてることが分かりますので、注意が必要です。

では、まず nmap コマンドをインストールします。

$ sudo apt install nmap

無事にインストールが完了したので、早速使っていきます。

まず、ルータと思われる 10.0.0.2 に対して実行します。

$ sudo nmap -sT 10.0.2.2
Starting Nmap 7.80 ( https://nmap.org ) at 2024-07-14 20:50 JST
Nmap scan report for _gateway (10.0.2.2)
Host is up (0.0092s latency).
Not shown: 992 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
135/tcp  open  msrpc
445/tcp  open  microsoft-ds
808/tcp  open  ccproxy-http
5357/tcp open  wsdapi
9010/tcp open  sdr
9080/tcp open  glrpc
9100/tcp open  jetdirect
MAC Address: 52:54:00:12:35:02 (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 4.49 seconds

オープンしてるポート番号が表示されます。

残り2つのホストに対しても実行してみます。

$ sudo nmap -sT 10.0.2.3
Starting Nmap 7.80 ( https://nmap.org ) at 2024-07-14 20:52 JST
Nmap scan report for 10.0.2.3
Host is up (0.0094s latency).
Not shown: 992 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
135/tcp  open  msrpc
445/tcp  open  microsoft-ds
808/tcp  open  ccproxy-http
5357/tcp open  wsdapi
9010/tcp open  sdr
9080/tcp open  glrpc
9100/tcp open  jetdirect
MAC Address: 52:54:00:12:35:03 (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 5.21 seconds

$ sudo nmap -sT 10.0.2.4
Starting Nmap 7.80 ( https://nmap.org ) at 2024-07-14 20:52 JST
Nmap scan report for 10.0.2.4
Host is up (0.010s latency).
Not shown: 992 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
135/tcp  open  msrpc
445/tcp  open  microsoft-ds
808/tcp  open  ccproxy-http
5357/tcp open  wsdapi
9010/tcp open  sdr
9080/tcp open  glrpc
9100/tcp open  jetdirect
MAC Address: 52:54:00:12:35:04 (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 5.42 seconds

3つのホストで結果がほぼ同じになりました。どういうことなんでしょうか。

もう少し詳細に nmap コマンドを使います。だいぶ時間がかかります。

$ sudo nmap -sC -sV -Pn -p- 10.0.2.2 -oN router.txt
Starting Nmap 7.80 ( https://nmap.org ) at 2024-07-21 22:26 JST
Nmap scan report for _gateway (10.0.2.2)
Host is up (0.018s latency).
Not shown: 65512 filtered ports
PORT      STATE SERVICE       VERSION
22/tcp    open  ssh           OpenSSH for_Windows_8.1 (protocol 2.0)
| ssh-hostkey:
|   3072 60:1b:23:e8:a2:36:eb:21:00:b5:8b:27:f9:0c:29:64 (RSA)
|   256 d1:82:35:e8:d0:17:ef:0e:5d:03:5b:2e:52:9d:00:cd (ECDSA)
|_  256 af:5b:0a:48:bc:03:4f:d0:9b:39:83:4d:db:c9:a9:48 (ED25519)
135/tcp   open  msrpc         Microsoft Windows RPC
445/tcp   open  microsoft-ds?
808/tcp   open  mc-nmf        .NET Message Framing
2869/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Service Unavailable
5357/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Service Unavailable
7680/tcp  open  pando-pub?
9010/tcp  open  websocket     WebSocket++ 0.8.2
9080/tcp  open  glrpc?
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, Help, RPCCheck, RTSPRequest, SSLSessionReq, TerminalServerCookie:
|     HTTP/1.0 400 Bad Request
|     Content-Length: 89
|     Content-Type: text/html
|     <html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>
|   GetRequest, HTTPOptions:
|     HTTP/1.0 404 Not Found
|     Content-Length: 85
|     Content-Type: text/html
|_    <html><head><title>Not Found</title></head><body><h1>404 Not Found</h1></body></html>
9100/tcp  open  jetdirect?
9180/tcp  open  unknown
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, Help, RPCCheck, RTSPRequest, SSLSessionReq, TerminalServerCookie:
|     HTTP/1.0 400 Bad Request
|     Content-Length: 89
|     Content-Type: text/html
|     <html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>
|   GetRequest, HTTPOptions:
|     HTTP/1.0 404 Not Found
|     Content-Length: 85
|     Content-Type: text/html
|_    <html><head><title>Not Found</title></head><body><h1>404 Not Found</h1></body></html>
45654/tcp open  websocket     WebSocket++ 0.8.2
45769/tcp open  unknown
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49671/tcp open  msrpc         Microsoft Windows RPC
49772/tcp open  http          Node.js Express framework
|_http-cors: GET POST
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
59392/tcp open  tcpwrapped
65001/tcp open  unknown
2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
(省略)

かなり細かい情報が出ましたが、読み解くのも大変そうです。

今回は以上になります。

おわりに

今回は、VirtualBox のネットワークについて調べてみました。

あまり、有益な情報は無かったかもしれませんが、理解は深まりました。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。