TT Lab
はじめる
学ぶ 学習パス コース

ネットワーク基礎 — Linux VM で手を動かす

ARP をフレームで見る

TT Labで続きを見る

このラボはVM上で動きます

2つのネットワークネームスペースを作って、ホスト2台として使います。vethペア1組が、2台をつなぐケーブルです。すべて1台のVMの中ですが、カーネルから見れば本物の2台です。

目標

IPアドレスをMACアドレスに変換するARPをフレーム単位で捕まえ、ネイバーテーブルを読み、静的エントリを入れて、間違ったMACが通信をどう止めるかを確認します。

なぜ重要なのか

同じサブネット内の通信は、IPではなくMACで届きます。IPは「誰に」を示し、実際のフレームはMACを見て配達されます。その2つをつなぐのがARPで、その結果がネイバーテーブル(ARPキャッシュ)です。そのため、IPの設定がすべて合っているのに通信できないときは、まずネイバーテーブルを見ます。古いエントリ、重複IP、誤った静的エントリが、そこにあります。クラウドやKubernetesがARPを隠していても、土台は同じです。

ステップ

  1. ネームスペースaliceとbobを作成してください。
  2. vethペアva・vbを作成し、vaをaliceに、vbをbobに入れてください。
  3. aliceのvaに10.10.0.1/24を、bobのvbに10.10.0.2/24を付け、loまでUPにして、aliceからbobへpingが通るようにしてください。
  4. pingのあと、aliceのネイバーテーブル(ip -n alice neigh)を /root/arp/neigh.txt に保存してください。bobのMACが表示されている必要があります。
  5. aliceのネイバーテーブルを空にし、tcpdumpでvaのARPを捕まえながらarpingを送って、リクエストとレスポンスのフレームを /root/arp/capture.txt に保存してください。
  6. aliceにbobのMACを静的(permanent)なネイバーエントリとして入れてください。
  7. 静的エントリを間違ったMACに変えて、pingが止まる様子を /root/arp/broken.txt に残し、そのあと正しいMACの静的エントリに戻してください。
  8. /root/arp/report.md に、bob_mac=の1行と、ARPリクエストがなぜブロードキャストなのか、間違った静的エントリがなぜIP層では見えないのかを書いてください。

参考

ホスト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なのでエラーが何も返ってこないからです。