ARP をフレームで見る
このラボはVM上で動きます
2つのネットワークネームスペースを作って、ホスト2台として使います。vethペア1組が、2台をつなぐケーブルです。すべて1台のVMの中ですが、カーネルから見れば本物の2台です。
目標
IPアドレスをMACアドレスに変換するARPをフレーム単位で捕まえ、ネイバーテーブルを読み、静的エントリを入れて、間違ったMACが通信をどう止めるかを確認します。
なぜ重要なのか
同じサブネット内の通信は、IPではなくMACで届きます。IPは「誰に」を示し、実際のフレームはMACを見て配達されます。その2つをつなぐのがARPで、その結果がネイバーテーブル(ARPキャッシュ)です。そのため、IPの設定がすべて合っているのに通信できないときは、まずネイバーテーブルを見ます。古いエントリ、重複IP、誤った静的エントリが、そこにあります。クラウドやKubernetesがARPを隠していても、土台は同じです。
ステップ
- ネームスペース
aliceとbobを作成してください。 - vethペア
va・vbを作成し、vaをaliceに、vbをbobに入れてください。 aliceのvaに10.10.0.1/24を、bobのvbに10.10.0.2/24を付け、loまでUPにして、aliceからbobへpingが通るようにしてください。- pingのあと、
aliceのネイバーテーブル(ip -n alice neigh)を/root/arp/neigh.txtに保存してください。bobのMACが表示されている必要があります。 aliceのネイバーテーブルを空にし、tcpdumpでvaのARPを捕まえながらarpingを送って、リクエストとレスポンスのフレームを/root/arp/capture.txtに保存してください。aliceにbobのMACを静的(permanent)なネイバーエントリとして入れてください。- 静的エントリを間違ったMACに変えて、pingが止まる様子を
/root/arp/broken.txtに残し、そのあと正しいMACの静的エントリに戻してください。 /root/arp/report.mdに、bob_mac=の1行と、ARPリクエストがなぜブロードキャストなのか、間違った静的エントリがなぜIP層では見えないのかを書いてください。
参考
- ネームスペース内でのコマンド実行:
ip netns exec alice <명령>。ipコマンドだけならip -n alice ...です(プレースホルダーはコマンドです)。 ip link add va type veth peer name vbがケーブル1組を作ります。ip link set va netns aliceで移します。- ネイバーテーブル:
ip -n alice neigh。空にするにはip -n alice neigh flush all。静的エントリ:ip -n alice neigh replace 10.10.0.2 lladdr <MAC> dev va nud permanent。 - キャプチャは
ip netns exec alice timeout 6 tcpdump -i va -nn -l arp > 파일 2>&1 &のようにバックグラウンドで起動しておき、arpingを送ったあとで待ちます(プレースホルダーはファイル名です)。 - よくある間違い:
loを上げ忘れることです。ネームスペースのloは、デフォルトでDOWNです。
ホスト2台
ネームスペースaliceとbobを作成してください。
ip netns add aliceのように作成します。ip netns listで確認してください。ネームスペース1つが、独立したネットワークスタック(インターフェース・アドレス・ルーティング・ネイバーテーブル)一式です。
ケーブルをつなぐ
vethペアva・vbを作成し、vaをaliceに、vbをbobに入れてください。
ip link add va type veth peer name vbでペアを作成し、ip link set va netns aliceとip link set vb netns bobでそれぞれ移します。移したあとは、ルートネームスペースからは見えません。
アドレスを付けてping
aliceのvaに10.10.0.1/24を、bobのvbに10.10.0.2/24を付け、loまでUPにして、aliceからbobへpingが通るようにしてください。
ip -n alice addr add 10.10.0.1/24 dev va、ip -n alice link set va up、ip -n alice link set lo upを実行します。bobも同じ要領です。そのあとip netns exec alice ping -c 2 10.10.0.2を実行します。
ネイバーテーブルを読む
pingのあと、aliceのネイバーテーブル(ip -n alice neigh)を /root/arp/neigh.txt に保存してください。bobのMACが表示されている必要があります。
pingが1往復すると、カーネルがARPの結果をネイバーテーブルに入れます。ip -n alice neighのlladdrの後ろがMAC、最後が状態(REACHABLE・STALEなど)です。bobのMACはip -n bob link show vbと突き合わせてください。
ARPをフレームで見る
aliceのネイバーテーブルを空にし、tcpdumpでvaのARPを捕まえながらarpingを送って、リクエストとレスポンスのフレームを /root/arp/capture.txt に保存してください。
先にキャプチャをバックグラウンドで起動しておきます: ip netns exec alice timeout 6 tcpdump -i va -nn -l arp > /root/arp/capture.txt 2>&1 &。そのあとip -n alice neigh flush allを実行し、ip netns exec alice arping -I va -c 1 10.10.0.2を実行します。ファイルにRequest who-hasとReply … is-atの2行がある必要があります。
静的ネイバーエントリ
aliceにbobのMACを静的(permanent)なネイバーエントリとして入れてください。
ip -n alice neigh replace 10.10.0.2 lladdr <bob의 MAC> dev va nud permanent(プレースホルダーはbobのMACです)。ip -n alice neighにPERMANENTと表示されている必要があります。静的エントリは時間が経っても消えず、ARPも送りません。
MACが間違っていたら
静的エントリを間違ったMACに変え、そのときのネイバーエントリと止まったpingを /root/arp/broken.txt にまとめて残したあと、正しいMACの静的エントリに戻してください。
lladdr 02:00:00:00:00:01のような偽のMACでneigh replace … nud permanentを実行したあと、ip -n alice neigh show 10.10.0.2とping -c 1 -W 1の結果(100% packet loss)を1つのファイルに保存します。pingの統計だけでは、ケーブルが抜けている場合と区別できないので、どのMACを書き込んだかも一緒に必要です。終わったらステップ6のように、本物のMACで再度replaceしてください。採点ツールが、元に戻したかも確認します。
学んだこと
/root/arp/report.md に、bob_mac=の1行と、ARPリクエストがなぜブロードキャストなのか、間違った静的エントリがなぜIP層では見えないのかを書いてください。
bob_macはip -n bob link show vbの値です。ブロードキャストなのは、相手のMACを知らない状態で尋ねるからで、IP層で見えないのは、捨てられる場所が相手のNICなのでエラーが何も返ってこないからです。