Posted at

tcpdumpでping要求をみる


はじめに

tcpdumpに触る機会があったので、色々と見てみようかと思いここにまとめておきます…


環境

前の記事で作成したdocker環境を流用して、2つのPC間の通信を見てみたいと思います。

実際には片方のコンテナにアタッチして仮想ネットワーク内の通信を除く感じでやっていきます。


インストール

下記のコマンドで簡単に入ります…

MACとかは標準で入っているみたいですね。

apt install tcpdump


コマンド

tcpdumpのコマンドは結構単純でネットワーク上のTCPプロトコルをみること、ファイルに書き込むことしか出来ない様子。

tcpdump -i eth0

*この場合はインターフェイスをeth0に規定しています


試してみる


ping

片方のコンテナにアタッチして、中からping要求を出してみます。


コンテナA

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
#....


コンテナB

ping 172.19.0.2 -c 1

#64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.181 ms


コンテナA

#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 アドレスやポート番号を名前に変換しないで表示します。


コンテナA

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

これで、何となくですが下記のような通信が見えてきました。



  1. 172.19.0.3(コンテナB)が172.19.0.2(コンテナA)にICMPecho requestコマンドを発行


  2. 172.19.0.2(コンテナA)が172.19.0.3(コンテナB)にICMPecho replyコマンドを発行

Internet Control Message Protocol(Wikipedia)によるとICMPに規定されている通信の種類がいくつかあり、0 - Echo Reply Message8 - Echo Messageの二種類を利用して通信しているっぽい…


その他

これを試しているときに、別のコマンドが入ったので少し調べてみました。


arp

有名なARPってやつですね…


コンテナA

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



  1. arp172.19.0.3MAC Addres172.19.0.2が聞く


  2. arp172.19.0.3MAC Addres02: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