今回からネットワークの理解を進めていきます。
今回は、VirtualBox + Ubuntu 22.04 で、環境構築していきます。
それでは、やっていきます。
はじめに
まずは、パケットキャプチャするために、Wireshark をインストールします。
その後、いろんなツールを使って、VirtualBox のネットワークが、どういう構成になっているのかを調べていきたいと思います。
Wiresharkのインストール
コマンドラインからインストールしていきます。
$ sudo apt update
$ sudo apt install wireshark
次のような画面になります。root権限ではなくても、Wireshark のグループのメンバに、パケットをキャプチャさせるかどうかを聞いています。
その方が便利なので、はいを選択します。
インストールが完了したら、現在のユーザを Wireshark のグループに追加します。
$ sudo usermod -a -G wireshark daisuke
早速、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
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 に関する応答が返ってきてるようです。
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 のネットワークについて調べてみました。
あまり、有益な情報は無かったかもしれませんが、理解は深まりました。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。