はじめに
tcpdump
に触る機会があったので、色々と見てみようかと思いここにまとめておきます…
環境
前の記事で作成したdocker環境を流用して、2つのPC間の通信を見てみたいと思います。
実際には片方のコンテナにアタッチして仮想ネットワーク内の通信を除く感じでやっていきます。
インストール
下記のコマンドで簡単に入ります…
*MAC
とかは標準で入っているみたいですね。
apt install tcpdump
コマンド
tcpdump
のコマンドは結構単純でネットワーク上のTCPプロトコルをみること、ファイルに書き込むことしか出来ない様子。
tcpdump -i eth0
*この場合はインターフェイスをeth0
に規定しています
試してみる
ping
片方のコンテナにアタッチして、中からping
要求を出してみます。
ifconfig
#eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
# inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255
# ether 02:42:ac:13:00:02 txqueuelen 0 (Ethernet)
# RX packets 410 bytes 528949 (528.9 KB)
# RX errors 0 dropped 0 overruns 0 frame 0
# TX packets 241 bytes 14126 (14.1 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
# loop txqueuelen 1 (Local Loopback)
# RX packets 12 bytes 1126 (1.1 KB)
# RX errors 0 dropped 0 overruns 0 frame 0
# TX packets 12 bytes 1126 (1.1 KB)
# TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tcpdump -i eth0
#....
ping 172.19.0.2 -c 1
#64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.181 ms
#00:59:06.976543 IP 666c78f910c9.pinet > 7bfa751bb19e: ICMP echo request, id 12, seq 1, length 64
#00:59:06.976594 IP 7bfa751bb19e > 666c78f910c9.pinet: ICMP echo reply, id 12, seq 1, length 64
うん…分からない…
内容を読み解く
1行目のメッセージを見てみましょう。
00:59:06.976543 # 時間
IP # IP or IPv6
666c78f910c9.pinet > # 送り元?
7bfa751bb19e: # 送り先?
ICMP # pingはicmpってプロトコル使っていると聞いたことが…
echo # ここからデータかな?
request, # コマンド内容?
id 12, # id...
seq 1, # シーケンス1
length 64 # データ長?
tcpdumpの使い方
を参考にさせていただくと、どうやらコマンドでもう少し見やすく出来るっぽい…
記事を参考に下記の2つのオプションを付与してみます。
-nn アドレスやポート番号を名前に変換しないで表示します。
06:35:15.821137 IP 172.19.0.3 > 172.19.0.2: ICMP echo request, id 12, seq 1, length 64
06:35:15.821207 IP 172.19.0.2 > 172.19.0.3: ICMP echo reply, id 12, seq 1, length 64
これで、何となくですが下記のような通信が見えてきました。
-
172.19.0.3
(コンテナB)が172.19.0.2
(コンテナA)にICMP
のecho request
コマンドを発行 -
172.19.0.2
(コンテナA)が172.19.0.3
(コンテナB)にICMP
のecho reply
コマンドを発行
Internet Control Message Protocol(Wikipedia)によるとICMPに規定されている通信の種類がいくつかあり、0 - Echo Reply Message
と8 - Echo Message
の二種類を利用して通信しているっぽい…
その他
これを試しているときに、別のコマンドが入ったので少し調べてみました。
arp
有名なARPってやつですね…
08:46:03.348573 ARP, Request who-has 172.19.0.3 tell 172.19.0.2, length 28
08:46:03.348599 ARP, Reply 172.19.0.3 is-at 02:42:ac:13:00:03, length 28
-
arp
で172.19.0.3
のMAC Addres
を172.19.0.2
が聞く -
arp
で172.19.0.3
のMAC Addres
で02:42:ac:13:00:03
であることが解答される
という感じっぽいです。
Router Advertisement
こちらは、IPv6でアドレスを自動決定するときに利用するプロトコルらしいです…
IPv6ではDHCPとは違う仕組みでアドレスを決定するようですね。
08:46:35.515383 IP6 fe80::a477:c6ff:fe0c:1892 > ff02::2: ICMP6, router solicitation, length 16