⏱ 約 60 分 · ARP request / reply を観察
Part 2Chapter 02/ネットワーク基礎

ARP と MAC:tcpdump で同じセグメント内の通信を捕まえる

Chapter 1 で読んだ IP と経路表の下で、実際には MAC アドレスへの変換が毎回働いています。learner01 から l3router01 のゲートウェイへ通信し、ARP request はブロードキャスト、reply はユニキャストで返ることを tcpdump で確認します。

所要時間約 60 分
章タイプstandard
前提知識Part 2 Chapter 1(IP / サブネット / 経路表)/ Part 1 Chapter 4(grep とパイプ)/ Part 1 Chapter 7(sudo の考え方)
使用機材workstation01ssh student@learner01、VLAN10: 172.16.10.20/24、GW: l3router01 172.16.10.1
関連章前: Chapter 1「IP・サブネット・ルーティング」/ 次: Chapter 3「Linux Bridge と VLAN」

IP の下で、表札を引いてから届ける

Chapter 1 では ip addrip route で、「自分の住所」と「町の外へ出る出口」を読みました。この章ではその一段下、同じ VLAN10 の中で相手の MAC アドレスをどう知るかを見ます。

通信先が同じセグメントにいるとき、Linux はいきなり IP パケットを相手へ投げません。まず ARP で「172.16.10.1 の MAC を知っている人は?」と同じセグメント全体へ聞きます。l3router01 が「それは私です」と返すと、learner01 は宛先 MAC を埋めてフレームを送れます。

この章で見る範囲
VLAN10 (172.16.10.0/24)

  learner01 172.16.10.20
      |
      |  ARP request: who-has 172.16.10.1 tell 172.16.10.20
      |  ARP reply:   172.16.10.1 is-at GW の MAC
      |
  l3router01 172.16.10.1  = default gateway

VLAN10 の中では L2 の MAC、VLAN10 の外へ出る判断は L3 の経路表。
この章のゴール: learner01 上で ip neighsudo arpingsudo tcpdump -i any -nn -e arp を使い、ARP request がブロードキャスト、ARP reply がユニキャストで返ることを説明できる。

この章を終えるとできること

ARP / MAC を読む 4 動作を、すべて learner01 上で練習します。

$ ip -br link
ens18 UP
bc:24:11:..:..:..
① 読む
自分の NIC の
MAC アドレスを見る
ip link
$ ip neigh
172.16.10.1
lladdr REACHABLE
② 見る
IP と MAC の対応を
隣人帳として読む
ip neigh
$ sudo arping
172.16.10.1
Unicast reply
③ 起こす
ICMP ではなく
ARP だけを発生させる
arping
tcpdump
| grep $GW_MAC
Reply is-at
④ 捕まえる
Part 1 Ch4 のパイプで
見たい MAC だけ絞る
tcpdump | grep

MAC、ARP、L2 と L3 を分けて考える

1. MAC は同じセグメント内で使う名札

IP アドレスは「どのネットワークにいるか」を含む住所です。MAC アドレスは NIC の名札で、同じ L2 セグメントの中でフレームを届けるために使います。VLAN10 の learner01 が l3router01 へ届くとき、最後は l3router01 の VLAN10 側 MAC へ Ethernet フレームを送ります。

項目IPMAC
役割どのネットワークにいるかを示す住所同じ L2 内で届けるための NIC の名札
172.16.10.1bc:24:11:aa:bb:cc
見るコマンドip addr / ip routeip -br link / ip neigh
対応する層L3(IP / ルーティング)L2(Ethernet / ARP)

2. ARP request はブロードキャスト、reply はユニキャスト

ARP の会話は単純です。まず質問者が「誰か知っている?」と VLAN10 全体へ聞きます。これはブロードキャストです。該当する IP を持つ相手だけが「私です」と質問者へ返します。これはユニキャストです。

learner01172.16.10.20
l3router01 の MAC をまだ知らない
broadcast
VLAN10 全体ff:ff:ff:ff:ff:ff
同じセグメント全員へ届く
l3router01172.16.10.1
自分の IP なので返事する
unicast
learner01ip neigh に GW の MAC が入る

requestwho-has 172.16.10.1 tell 172.16.10.20宛先 MAC はブロードキャスト

reply172.16.10.1 is-at xx:xx:xx:xx:xx:xx宛先 MAC は learner01

3. L2 は「隣町の中」、L3 は「町の外への道」

Chapter 1 の ip route は L3 の話でした。default via 172.16.10.1 は「VLAN10 の外へ出るなら l3router01 に渡す」という判断です。ただし、その l3router01 へ渡す直前には、L2 の ARP で 172.16.10.1 の MAC を引きます。

切り分けの言葉: ip route に道があるのに ip neighINCOMPLETE なら、「L3 の道はあるが、L2 の相手の名札が取れていない」と説明できます。

learner01 で ARP を捕まえる

演習の安全範囲

この章のコマンドは learner01 上で実行します。sudo arpingsudo tcpdump はパケットを直接扱うため sudo が必要です。ip neigh flush は GW 1件だけを消し、ARP を再発生させるために使います。Ch5 で扱う iptables / tc の sudo 操作より前に、sudo が必要な観察系コマンドに慣れる位置づけです。

ARP の流れをライブビューで見る

STEP 01 · learner01 に入り、VLAN10 の NIC を確認する

受講者の出発点は workstation01 です。そこから ssh student@learner01 で入り、VLAN10 の IP が付いた NIC を探します。例では ens18 とします。

bash · learner01
ssh student@learner01
hostname
ip -br addr
ip -br link
IF=ens18
ip -br addr show dev $IF

172.16.10.x/24 が付いている NIC がこの章の観察対象です。ip -br link の 3列目に出る bc:24:11:... が learner01 側の MAC です。

STEP 02 · ゲートウェイへ ping して ARP テーブルを見る

VLAN10 の default gateway は l3router01 172.16.10.1 です。まず ping で通信し、ip neigh に GW の MAC が入ることを確認します。

bash · learner01
GW=172.16.10.1
ping -c 3 $GW
ip neigh show $GW
GW_MAC=$(ip neigh show $GW | awk '/lladdr/{print $5; exit}')
echo GW_MAC=$GW_MAC
期待する見え方
172.16.10.1 dev ens18 lladdr bc:24:11:aa:bb:cc REACHABLE
GW_MAC=bc:24:11:aa:bb:cc

lladdr の後ろが、l3router01 の VLAN10 側 MAC です。状態は REACHABLE または STALE なら問題ありません。

STEP 03 · arping で ARP だけを起こす

ping は ICMP ですが、arping は ARP だけを発生させます。sudo が必要です。

bash · learner01
sudo arping -c 3 -I $IF $GW
出力例
ARPING 172.16.10.1 from 172.16.10.20 ens18
Unicast reply from 172.16.10.1 [bc:24:11:aa:bb:cc]  0.733ms
Unicast reply from 172.16.10.1 [bc:24:11:aa:bb:cc]  0.681ms

Unicast reply と MAC が見えれば、ARP request に対して GW が返事した証拠です。

STEP 04 · tcpdump で request と reply を捕まえる

tcpdump を短時間だけバックグラウンドで動かし、GW の ARP エントリを消してから ping します。-i any は NIC 名の指定ミスを避けるため、-e は Ethernet の送信元/宛先 MAC を見るために付けます。

bash · learner01
sudo timeout 12 tcpdump -i any -nn -e arp > /tmp/ch2-arp.log 2>&1 &
TCPDUMP_PID=$!
sleep 1
sudo ip neigh flush $GW dev $IF || true
ping -c 2 $GW
wait $TCPDUMP_PID || true
grep -i -E 'who-has|is-at|ff:ff:ff:ff:ff:ff|arp' /tmp/ch2-arp.log
読めれば成功の行
ARP, Request who-has 172.16.10.1 tell 172.16.10.20, length 28
ARP, Reply 172.16.10.1 is-at bc:24:11:aa:bb:cc, length 28

1行目は request、2行目は reply です。request は「誰か知っている?」なのでブロードキャスト、reply は「私です」なので learner01 へ返るユニキャストです。

STEP 05 · Part 1 Ch4 の grep とパイプで MAC を絞る

最後に、捕まえたログから GW の MAC だけを抜き出します。これは Part 1 Chapter 4 の grep| の再利用です。ネットワーク調査でも、長い出力をそのまま読まず、見たい文字列で絞ります。

bash · learner01
echo $GW_MAC
grep -i "$GW_MAC" /tmp/ch2-arp.log
sudo timeout 8 tcpdump -i any -nn -e arp | grep --line-buffered -i "$GW_MAC"
rm -f /tmp/ch2-arp.log

保存済みログを見るなら grep "$GW_MAC" /tmp/ch2-arp.log、流れているパケットをその場で絞るなら tcpdump ... | grep "$GW_MAC" です。後者は 8 秒だけ待ちます。動きをもう一度見たい場合は、別ターミナルで sudo arping -c 3 -I $IF $GW を打つと絞り込み結果が出ます。

この読み方は、「全部見る」のではなく「必要な行だけ拾う」現場の基本です。以後の章では、ルーティング、ファイアウォール、遅延の出力でも同じ絞り込みを使います。

見えないときの切り分け

1. まず NIC と VLAN10 の IP を確認する

tcpdump -i ens18 で見えない原因の多くは、NIC 名の思い込みです。この章では -i any を基本にしていますが、NIC を指定する場合は必ず ip -br addr172.16.10.x/24 が付いたインターフェースを確認します。

bash · learner01
ip -br addr
ip route
ip neigh show 172.16.10.1

2. tcpdump と arping は sudo が必要

tcpdump: You don't have permission to capture on that device のような表示なら、コマンドの前に sudo が足りません。arping も raw socket を使うため sudo が必要です。

bash · learner01
sudo tcpdump -i any -nn arp
sudo arping -c 3 -I $IF 172.16.10.1

3. ARP が見えないのは、すでに覚えているからかもしれない

ip neighREACHABLE のままだと、次の ping では新しい ARP request が出ないことがあります。観察したい相手だけを flush してから再試行します。

bash · learner01
sudo ip neigh flush 172.16.10.1 dev $IF || true
ping -c 2 172.16.10.1
ip neigh show 172.16.10.1

AI に相談

AI ARP と MAC の読み方を質問する

詰まったら、出力を貼って「request は見えるが reply がない」「ip neigh が INCOMPLETE のまま」など、見えている事実から質問してください。

この章の ARP・MAC・tcpdump を前提に説明します

修了確認

問 1 · ARP request と reply を見分ける

tcpdump に次の 2 行が出ました。どちらがブロードキャストで、どちらがユニキャストですか?理由も 1 行で答えてください。

tcpdump 出力
ARP, Request who-has 172.16.10.1 tell 172.16.10.20, length 28
ARP, Reply 172.16.10.1 is-at bc:24:11:aa:bb:cc, length 28
解答を見る
Request は「誰か知っている?」なので VLAN10 全体へ投げるブロードキャストです。Reply は l3router01 が learner01 に返す返事なのでユニキャストです。

問 2 · L2 と L3 のどちらを見るか

ip route には default via 172.16.10.1 dev ens18 があるのに、ping 172.16.10.1 が失敗し、ip neigh show 172.16.10.1INCOMPLETE です。どの層の問題として切り分けますか?

解答を見る
経路表には出口があるので、L3 の経路そのものより先に L2 の ARP を疑います。INCOMPLETE は「MAC を問い合わせたが返事がない」状態なので、同じ VLAN10 上の接続、相手の稼働、NIC/VLAN 設定を確認します。

修了確認の段階ヒント(問 1・問 2 共通)

段階ヒント 1 段目:単語をそのまま読む
who-has は質問、is-at は答えです。質問は相手が分からないから全員に聞き、答えは質問者だけに返します。
段階ヒント 2 段目:見るコマンドを分ける
L3 の道は ip route、L2 の名札解決は ip neightcpdump arp で見ます。ip route が正しくても ip neighINCOMPLETE なら ARP 側です。
段階ヒント 3 段目:Ch1 の言葉に戻す
Ch1 の経路表は「どの出口へ渡すか」です。この章の ARP は「その出口の MAC をどう知るか」です。出口の住所と出口の表札は別物です。

次は Linux Bridge と VLAN

この章では、VLAN10 の中で learner01 が l3router01 の MAC を引き、同じセグメント内の相手へフレームを届ける仕組みを見ました。ARP は 同じ L2 セグメントの中でだけ意味を持つ、というのが重要です。

次の Chapter 3 では、その「同じセグメント」を作る側へ進みます。Linux Bridge と VLAN によって、どこまでが同じ L2 で、どこからが別セグメントなのかを自分で区切ります。

Chapter 3: Linux Bridge と VLAN
  • Linux Bridge は仮想スイッチとして動く
  • VLAN タグで同じ物理配線の中に複数の L2 セグメントを作る
  • ARP が届く範囲と届かない範囲を、bridge / VLAN の設定から説明する