概要
『体験しながら学ぶネットワーク技術入門』を読み進めながら学んだことをまとめるメモ
本ページは第2章の分。
座学
イーサーネット
- プリアンブル
- 「これからイーサーネットを送るぞ」という合図
- 先頭に「10101010」 * 7 + 「10101011」 * 1
- 送信先/送信元MACアドレス
- 6バイト + 6バイト
- タイプ
- ネットワーク層でどんなプロトコルを使用しているか
- IPv4なら 0x0800
- IPv6なら0x86DD
- ネットワーク層でどんなプロトコルを使用しているか
- イーサーネットペイロード
- ネットワークそうのデータそのもの
- FCS
- イーサーネットフレームが壊れていないかを確認
- 末尾4バイト
- チェックサム的な値
- MACアドレスの構成要素
- OUI (Organizationally Unique Identifier)
- IEEEが割り当てる
- NICを製造しているベンダーのリスト
- https://standards-oui.ieee.org/oui/oui.txt
- 自分のmacbookのMACアドレスのOUIを確認すると、確かにApple, Inc.だった。
- UAA (Universally Administered Address)
- 各ベンダーがNICに割り当てる
- OUI (Organizationally Unique Identifier)
<h1>実践編</h1>
ifconfig net0
: macアドレス確認
root@cl1:/# ifconfig net0 net0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.11.1 netmask 255.255.255.0 broadcast 192.168.11.255 ether 02:42:ac:01:10:01 txqueuelen 1000 (Ethernet) RX packets 342 bytes 86022 (86.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 467 bytes 56094 (56.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@cl2:/# ifconfig net0 net0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.11.2 netmask 255.255.255.0 broadcast 192.168.11.255 ether 02:42:ac:01:10:02 txqueuelen 1000 (Ethernet) RX packets 81 bytes 16602 (16.6 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 62 bytes 10104 (10.1 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
etherの値がmacアドレス
mac環境で実行しているので、公式の補足に従い、tcpdumpによる保存ファイルの拡張子を差し替える。
https://sbcr-dl-and-idea.s3.ap-northeast-1.amazonaws.com/2024-01-11-18599-%E4%BD%93%E9%A8%93%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80/tinet_mac_m.pdf
# だめなコマンド root@cl2:/# tcpdump -i net0 -w /tmp/tinet/ethernet.pcapng ether host 02:42:ac:01:10:01 tcpdump: Couldn't change ownership of savefile # 有効なコマンド root@cl2:/# tcpdump -i net0 -w /tmp/tinet/ethernet.pcap ether host 02:42:ac:01:10:01 tcpdump: listening on net0, link-type EN10MB (Ethernet), capture size 262144 bytes
pingで適当に2回パケットを送信してみる。
宛先はipアドレスで指定することになるので、ipconfig net0で確認した時のinetの値を指定する。
root@cl1:/# ping 192.168.11.2 -c 2 PING 192.168.11.2 (192.168.11.2) 56(84) bytes of data. 64 bytes from 192.168.11.2: icmp_seq=1 ttl=64 time=3.83 ms # <- リプライパケットを受け取れていることがわかる 64 bytes from 192.168.11.2: icmp_seq=2 ttl=64 time=0.265 ms --- 192.168.11.2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1031ms rtt min/avg/max/mdev = 0.265/2.046/3.828/1.781 ms
受信側のtcpdumpを停止。受信できたpacket数が確認できる。
root@cl2:/# tcpdump -i net0 -w /tmp/tinet/ethernet.pcap ether host 02:42:ac:01:10:01 tcpdump: listening on net0, link-type EN10MB (Ethernet), capture size 262144 bytes ^C4 packets captured 4 packets received by filter 0 packets dropped by kernel
パケットをwiresharkで解析
これからわかること
- パケットは4つ表示されている
- cl1からcl2に送信したのは2つであり、残り2つは対応するリプライパケット。
- Ethernet II, Src: 02:42:ac:01:10:01 (02:42:ac:01:10:01), Dst: 02:42:ac:01:10:02 (02:42:ac:01:10:02)
- イーサーネットⅡを使っている
- 送信元アドレス(Src) は02:42:ac:01:10:01
- 送信先アドレス(Dst) は02:42:ac:01:10:02
- ここからはわからないこと
- プリアンブルの値
- tcpdumpでキャプチャする前に取り外されるので。
- FCS
- デフォルトでは表示されないので。
- プリアンブルの値
Wiresharkのパケットダイアグラム機能
パケットの構造をビットの配列をフォーマット図風に表示することが可能。わかりやすい。
ARP (Address Resolution Protocol)
- アドレスにはMACアドレスとIPアドレスしかない
- MACアドレス: NICに対するアドレス
- IPアドレス: OSに設定するアドレス
- ARPは、MACアドレスとIPアドレスを紐づけるもの
- 宛先IPアドレスから宛先MACアドレスを求める
- ARPテーブルを埋めるために、ARP requestを送信する。
- ARP requestでは、目標Macアドレスはダミー(00:00:00:00:00:00)である
- 目標IPが自分と同じネットワークの中に存在する事はどうやって判断するのか?
- ARP replyが来ないこと…?
- ARP requestはブロードキャストを使用する
- ARP replyはユニキャストを使用する
- IPアドレス・macアドレスを持つ要素ごとにARPテーブルを管理している
- ARPテーブルの値はキャッシュされている。時々ユニキャストで疎通が取れるかを確認している
実践編
ARPテーブルのキャッシュ削除とレコード確認
# cl3のifconfigを確認
root@cl3:/# ifconfig net0
net0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 02:42:ac:01:11:00 txqueuelen 1000 (Ethernet)
RX packets 12 bytes 1928 (1.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 560 (560.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@cl3:/#
# rt1のifconfigを確認
root@rt1:/# ifconfig net1
net1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.254 netmask 255.255.255.0 broadcast 0.0.0.0
ether 02:42:ac:01:12:54 txqueuelen 1000 (Ethernet)
RX packets 6 bytes 1452 (1.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 1452 (1.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# cl3のARPテーブルを確認
root@cl3:/# ip neigh flush all
root@cl3:/# ip neigh
# rt1のARPテーブルを確認
# なんかいた
root@rt1:/# ip neigh
192.168.11.2 dev net1 lladdr 02:42:ac:01:10:02 STALE
192.168.11.1 dev net1 lladdr 02:42:ac:01:10:01 STALE
root@rt1:/# ip neigh flush all
# 消せた
root@rt1:/# ip neigh
root@rt1:/#
# cl3のARPテーブルを確認
root@cl3:/# ip neigh flush all
root@cl3:/# ip neigh
# rt1のARPテーブルを確認
# なんかいた
root@rt1:/# ip neigh
192.168.11.2 dev net1 lladdr 02:42:ac:01:10:02 STALE
192.168.11.1 dev net1 lladdr 02:42:ac:01:10:01 STALE
root@rt1:/# ip neigh flush all
# 消せた
root@rt1:/# ip neigh
root@rt1:/#
# cl3のARPテーブルを確認すると、rt1のレコードが存在
root@cl3:/# ip neigh
192.168.11.254 dev net0 lladdr 02:42:ac:01:12:54 STALE
# rt1のARPテーブルを確認すると、cl3のレコードが存在
root@rt1:/# ip neigh
192.168.11.100 dev net1 lladdr 02:42:ac:01:11:00 STALE
ちなみに、書籍ではpingの送信回数は2としてあるが、 pingを10回投げたとしてもパケットの内容は変わらなかった。すなわちARPのrequest, replyは、pingの回数に関係なく1回ずつ実行されていることになる。