iptables で守り、tc netem で揺らす
Ch4 で届くようになった webserver01 への通信を、learner01 側であえて遅らせたり、ICMP だけ止めたりします。ping が通らない理由を「経路断」だけで片づけず、遅延、ロス、ファイアウォールを結果から切り分けられるようにします。
| 所要時間 | 約 60 分 |
|---|---|
| 章タイプ | standard |
| 前提知識 | Part 2 Chapter 4(VLAN10 から VLAN20 の webserver01 へ届く状態)/ Part 1 Chapter 7(sudo)/ Chapter 8(リダイレクト) |
| 使用機材 | workstation01 → ssh student@learner01、到達先: webserver01 172.16.20.10 |
| 関連章 | 前: Chapter 4「ルーティング / OSPF」/ 次: Chapter 6「修了演習」 |
通らない原因を1つに決めつけない
この章でできるようになることは、ping が通らないときに「ネットワーク全体の障害」と即断せず、どの種類の失敗かを分けて説明できることです。Ch4 で learner01 から webserver01 172.16.20.10 へ届く道を確認しました。この章では、その同じ道を題材にします。
受講者が操作するのは learner01 だけです。tc netem で遅延とロスを入れ、iptables で ICMP だけを落とします。どちらも sudo が必要ですが、変更対象は自分の演習VMの一時設定です。
VLAN10 (172.16.10.0/24)
learner01 / 受講者VM
|
| tc netem: delay 100ms / loss 5%
| iptables OUTPUT: ICMP だけ DROP
|
l3router01 172.16.10.1 / 172.16.20.1
|
VLAN20 (172.16.20.0/24)
webserver01 172.16.20.10 ← ping / curl の相手
ping も curl も成功delay 100ms / loss 5%RTT 増加 / 一部 drop / curl が引っかかるdefault GW はそのままOUTPUT icmp DROPping 失敗 / curl は成功tc で遅延とロスを入れて戻し、iptables で ICMP だけを落として戻します。最後に before/after の .txt を見比べ、「変えたら戻す」を自分の手順として残します。この章を終えるとできること
守る、揺らす、戻す、切り分けるの 4 動作を身につけます。
NIC 名を読む
実測値に出す
HTTP と分ける
証拠を残す
iptables と tc netem の考え方
1. 守る=iptables:パケットに対する関所
iptables は、Linux のファイアウォールを操作する代表的なコマンドです。この章では filter テーブルだけ扱います。NAT やポート転送は Part 4 以降に回します。
| 用語 | この章での読み方 |
|---|---|
INPUT | learner01 に入ってくる通信の関所 |
OUTPUT | learner01 から出ていく通信の関所。この章で ICMP を落とす場所 |
FORWARD | 別のホストへ中継する通信の関所。router 章や Part 4 以降で深掘り |
ACCEPT / DROP | 通す / 捨てる、というターゲット |
最初は sudo iptables -L -n -v や sudo iptables -S OUTPUT で読みます。Part 1 Chapter 4 の grep と組み合わせれば、DROP だけを探すこともできます。
2. 揺らす=tc netem:送信キューに遅延やロスを入れる
tc は Linux の traffic control を扱うコマンドです。netem は network emulator の略で、NIC の qdisc(キューイング規律)に delay や loss を足せます。
| 操作 | 意味 | 見え方 |
|---|---|---|
delay 100ms | 送信時に 100ms の遅延を入れる | ping の time= が大きくなる |
loss 5% | 一定割合でパケットを落とす | ping で一部 drop、curl が引っかかる |
rate / reorder | 帯域制限 / 順序入れ替え | この章では紹介だけ |
3. なぜ実機でやるのか
この演習の delay と loss は、画面上の表示だけを変える疑似値ではありません。learner01 の NIC から出るパケットの送信タイミングや欠落が実際に変わり、Proxmox と物理スイッチを通った後の ping / curl の体感に出ます。
重要:
pingが失敗しても、原因は1つではありません。道がない、ICMP だけ捨てている、遅延やロスが大きい、相手の HTTP だけ落ちている、などに分かれます。この章では「ping 不通=サーバ障害」と決めつけない練習をします。
演習:8手で遅延・ロス・ICMP block を入れて戻す
| 項目 | 値 |
|---|---|
| 操作ホスト | learner01(受講者VM / VLAN10 / 172.16.10.20/24) |
| 接続方法 | workstation01 から ssh student@learner01 |
| 確認先 | webserver01 172.16.20.10 |
| 必要権限 | tc と iptables は sudo が必要です。デフォルトでは learner01 上で受講者が実行できる前提です。 |
| 保存する証拠 | ~/netem-before.txt / ~/ping-before.txt / ~/netem-after.txt / ~/ping-after.txt |
learner01 に入っていない場合は、workstation01 から ssh student@learner01 で入ります。以下の STEP 01 からは、すべて learner01 上で実行します。STEP 01 · ip a で NIC 名を特定する
tc は「どの NIC の送信キューを揺らすか」を指定します。まず ip a で、172.16.10.x/24 が付いている NIC 名を見つけます。例では ens18 とします。
hostname ip a IF=ens18 ip -br addr show dev $IF # 例: ens18 UP 172.16.10.20/24
ens18 以外が表示された場合は、以降の IF=ens18 を自分の NIC 名に置き換えます。
STEP 02 · before を .txt に残す
何かを変える前に、今の qdisc と ping の状態をファイルに残します。Part 1 Chapter 8 のリダイレクトの回収です。
tc qdisc show dev $IF > ~/netem-before.txt ping -c5 172.16.20.10 > ~/ping-before.txt cat ~/netem-before.txt tail -n 2 ~/ping-before.txt
~/ping-before.txt の末尾に packet loss と RTT の統計が残ります。この値が、あとで復帰したかを見る基準です。
STEP 03 · tc netem で 100ms 遅延を入れる
root qdisc に netem delay 100ms を足します。直後に ping すると、time= が通常よりおおむね 100ms 台へ跳ねます。
learner01 の NIC 全体にかかるため、SSH のキー入力や表示も少しもたつきます。異常ではありません。STEP 05 で tc を解除すれば元に戻ります。sudo tc qdisc add dev $IF root netem delay 100ms tc qdisc show dev $IF ping -c5 172.16.20.10 # → time= が通常よりおおむね 100ms 分大きくなります
Exclusivity flag on, cannot modify などが出たら、前回の qdisc が残っています。STEP 05 または章末の「全部戻す」を実行してから、もう一度この STEP に戻ります。STEP 04 · loss 5% を足して curl の引っかかりを見る
次は qdisc を change して、遅延に加えて loss 5% を入れます。ping は一部 drop し、curl は TCP の再送により一瞬引っかかることがあります。
sudo tc qdisc change dev $IF root netem delay 100ms loss 5% tc qdisc show dev $IF ping -c5 172.16.20.10 curl http://172.16.20.10/ # → ping は一部 drop、curl は TCP 再送で遅く感じることがあります
curl は ICMP ではなく TCP/80 です。多少のロスがあっても、TCP は再送しながら取りにいくため、遅くても成功することがあります。
STEP 05 · tc を解除して復帰を保存する
入れた netem を消して、ping が通常の RTT に戻るかを見ます。ここで after の qdisc と ping もファイルに残します。
sudo tc qdisc del dev $IF root tc qdisc show dev $IF > ~/netem-after.txt ping -c5 172.16.20.10 > ~/ping-after.txt cat ~/netem-after.txt tail -n 2 ~/ping-after.txt
sudo tc qdisc del dev $IF root を実行すると、RTNETLINK answers: No such file or directory が出ることがあります。解除済みという意味なら正常です。STEP 06 · iptables で ICMP だけ落とす
ここでは OUTPUT に 1 ルールだけ足し、webserver01 宛ての ICMP を落とします。ping は失敗しますが、HTTP の curl は成功します。つまり「ping が通らない=相手サーバが落ちている」ではありません。
sudo iptables -A OUTPUT -p icmp -d 172.16.20.10 -j DROP sudo iptables -S OUTPUT ping -c5 172.16.20.10 curl http://172.16.20.10/ # → ping は失敗、curl は HTTP で成功します
道はあります。ICMP だけを learner01 の出口で捨てています。curl が成功するなら、L3 経路と Web サービスは生きています。
STEP 07 · iptables の同じ指定を -D で消す
-A で足したルールは、同じ条件を -D に変えて削除します。解除後に ping が戻れば、ICMP block だったと説明できます。
sudo iptables -D OUTPUT -p icmp -d 172.16.20.10 -j DROP sudo iptables -S OUTPUT ping -c5 172.16.20.10 # → 64 bytes from 172.16.20.10 ... に戻ります
-D を実行すると、iptables: Bad rule (does a matching rule exist in that chain?) のように表示されます。対象ルールが残っていない、という意味なら正常です。STEP 08 · before/after を見比べて、変えたら戻す
最後に、STEP 02 と STEP 05 で保存したファイルを見比べます。戻した後の qdisc が before と同じ状態に戻っていること、ping の RTT が通常に近いことを確認します。
cat ~/netem-before.txt cat ~/netem-after.txt diff -u ~/netem-before.txt ~/netem-after.txt || true tail -n 2 ~/ping-before.txt tail -n 2 ~/ping-after.txt
tc で遅延とロスを入れて戻し、iptables で ICMP だけ止めて戻しました。ping 失敗、curl 成功、RTT 増加、packet loss を別々の現象として説明できます。つまずきポイントと全部戻す手順
NIC 名が ens18 ではない
環境によって NIC 名は変わります。ip a または ip -br addr で 172.16.10.x/24 が付いている行を探し、その先頭の名前を IF に入れます。
ip -br addr IF=ens18 ip -br addr show dev $IF
tc qdisc del が No such file になる
RTNETLINK answers: No such file or directory は、「消す対象の qdisc がもうない」という意味です。STEP 05 やリセット手順で出るなら、解除済みとして正常です。
ただし、直後の tc qdisc show dev $IF に netem が残っている場合は、NIC 名を間違えている可能性があります。
iptables -D は -A と同じ指定で消す
削除時は、追加した条件をそのまま使います。この章では OUTPUT、-p icmp、-d 172.16.20.10、-j DROP を同じ順で指定します。
sudo iptables -S OUTPUT sudo iptables -D OUTPUT -p icmp -d 172.16.20.10 -j DROP
既に消えている場合は Bad rule 系のメッセージが出ます。sudo iptables -S OUTPUT に該当ルールがなければ、残りはありません。
章末リセット:全部戻す
演習を終える前、または途中で状態が分からなくなったときは、次を実行して learner01 側の変更を戻します。
sudo tc qdisc del dev $IF root 2>/dev/null || true sudo iptables -D OUTPUT -p icmp -d 172.16.20.10 -j DROP 2>/dev/null || true tc qdisc show dev $IF sudo iptables -S OUTPUT ping -c3 172.16.20.10 curl -I http://172.16.20.10/
2>/dev/null || true は、既に解除済みのときに止まらないための書き方です。確認として netem が残っていないこと、ICMP DROP ルールが残っていないこと、ping と curl が戻っていることを見ます。
AI に相談
修了確認
この章で見た遅延、ロス、ICMP block を 2 問だけ確認します。
問 1 · ping 失敗と curl 成功を説明する
sudo iptables -A OUTPUT -p icmp -d 172.16.20.10 -j DROP を入れた後、ping 172.16.20.10 は失敗しましたが、curl http://172.16.20.10/ は成功しました。何が分かりますか?
解答を見る
learner01 の OUTPUT で ICMP だけを捨てています。HTTP は TCP/80 なので、このルールでは落ちません。
したがって、ping 失敗だけで「経路が壊れた」「webserver01 が落ちた」とは言えません。curl が成功するなら、少なくとも L3 経路と HTTP サービスは生きています。
問 2 · tc netem を戻したか確認する
sudo tc qdisc del dev $IF root を実行したら、RTNETLINK answers: No such file or directory が出ました。この表示をどう判断しますか?また、最後に何を確認しますか?
解答を見る
消す対象の qdisc が既にない、という意味です。解除済みの状態で出たなら正常です。
最後に tc qdisc show dev $IF で netem が残っていないこと、ping -c3 172.16.20.10 の RTT が通常に戻っていることを確認します。
💡 修了確認の段階ヒント(問 1・問 2 共通)
💡 段階ヒント 1 段目:まずプロトコルを分ける
ping は ICMP、curl は HTTP over TCP です。iptables のルールが -p icmp なら、落とす対象は ICMP だけです。💡 段階ヒント 2 段目:見る場所を分ける
tc qdisc show、ICMP block を見るなら sudo iptables -S OUTPUT です。ping の結果だけで両方を判断しません。💡 段階ヒント 3 段目:戻すコマンドを言えるようにする
tc は sudo tc qdisc del dev $IF root、iptables は追加時と同じ指定で -D OUTPUT -p icmp -d 172.16.20.10 -j DROP です。消す対象が既になければエラー表示でも解除済みです。次は修了演習へ
この章では、Ch4 で届くようになった webserver01 への通信を、あえて遅らせたり、ロスさせたり、ICMP だけ止めたりしました。次の Chapter 6 では、Part 2 の各章を 1 本につなぎ、⑨ tc と ⑩ iptables も含めて curl のゴールまで進みます。
- VLAN10 の learner01 から VLAN20 の webserver01 へ届く道を自分で確認します
- OSPF の観察パネル、tc の遅延、iptables の ICMP block を統合します
- 最後に
curl http://172.16.20.10/で nginx のゴール出力を取ります