⏱ 約 60 分 · iptables と tc netem
Part 2Chapter 05/ネットワーク基礎

iptables で守り、tc netem で揺らす

Ch4 で届くようになった webserver01 への通信を、learner01 側であえて遅らせたり、ICMP だけ止めたりします。ping が通らない理由を「経路断」だけで片づけず、遅延、ロス、ファイアウォールを結果から切り分けられるようにします。

所要時間約 60 分
章タイプstandard
前提知識Part 2 Chapter 4(VLAN10 から VLAN20 の webserver01 へ届く状態)/ Part 1 Chapter 7(sudo)/ Chapter 8(リダイレクト)
使用機材workstation01ssh 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 も成功
tc netemdelay 100ms / loss 5%
見え方RTT 増加 / 一部 drop / curl が引っかかる
道はあるdefault GW はそのまま
iptablesOUTPUT icmp DROP
見え方ping 失敗 / curl は成功
この章のゴール: tc で遅延とロスを入れて戻し、iptables で ICMP だけを落として戻します。最後に before/after の .txt を見比べ、「変えたら戻す」を自分の手順として残します。

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

守る、揺らす、戻す、切り分けるの 4 動作を身につけます。

$ ip a
ens18 UP
172.16.10.20/24
① 特定する
tc をかける
NIC 名を読む
ip a
tc delay 100ms
tc loss 5%
ping RTT up
② 揺らす
遅延とロスを
実測値に出す
tc netem
OUTPUT icmp
target DROP
curl success
③ 守る
ping だけ止めて
HTTP と分ける
iptables
before .txt
after .txt
reset clean
④ 戻す
設定を消し
証拠を残す
diff · reset

iptables と tc netem の考え方

1. 守る=iptables:パケットに対する関所

iptables は、Linux のファイアウォールを操作する代表的なコマンドです。この章では filter テーブルだけ扱います。NAT やポート転送は Part 4 以降に回します。

用語この章での読み方
INPUTlearner01 に入ってくる通信の関所
OUTPUTlearner01 から出ていく通信の関所。この章で ICMP を落とす場所
FORWARD別のホストへ中継する通信の関所。router 章や Part 4 以降で深掘り
ACCEPT / DROP通す / 捨てる、というターゲット

最初は sudo iptables -L -n -vsudo iptables -S OUTPUT で読みます。Part 1 Chapter 4 の grep と組み合わせれば、DROP だけを探すこともできます。

2. 揺らす=tc netem:送信キューに遅延やロスを入れる

tc は Linux の traffic control を扱うコマンドです。netem は network emulator の略で、NIC の qdisc(キューイング規律)に delayloss を足せます。

操作意味見え方
delay 100ms送信時に 100ms の遅延を入れるpingtime= が大きくなる
loss 5%一定割合でパケットを落とすping で一部 drop、curl が引っかかる
rate / reorder帯域制限 / 順序入れ替えこの章では紹介だけ

3. なぜ実機でやるのか

この演習の delayloss は、画面上の表示だけを変える疑似値ではありません。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
必要権限tciptablessudo が必要です。デフォルトでは 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 とします。

bash · learner01
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 のリダイレクトの回収です。

bash · learner01
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 台へ跳ねます。

SSH の操作も一時的に重く感じます: この遅延は learner01 の NIC 全体にかかるため、SSH のキー入力や表示も少しもたつきます。異常ではありません。STEP 05 で tc を解除すれば元に戻ります。
bash · learner01
sudo tc qdisc add dev $IF root netem delay 100ms
tc qdisc show dev $IF
ping -c5 172.16.20.10
# → time= が通常よりおおむね 100ms 分大きくなります
既に netem が残っている場合: Exclusivity flag on, cannot modify などが出たら、前回の qdisc が残っています。STEP 05 または章末の「全部戻す」を実行してから、もう一度この STEP に戻ります。

STEP 04 · loss 5% を足して curl の引っかかりを見る

次は qdisc を change して、遅延に加えて loss 5% を入れます。ping は一部 drop し、curl は TCP の再送により一瞬引っかかることがあります。

bash · learner01
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 もファイルに残します。

bash · learner01
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
2回目の見え方: もう qdisc がない状態で 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 が通らない=相手サーバが落ちている」ではありません。

bash · learner01
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 だったと説明できます。

bash · learner01
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 ... に戻ります
2回目の見え方: 既に削除済みの状態で同じ -D を実行すると、iptables: Bad rule (does a matching rule exist in that chain?) のように表示されます。対象ルールが残っていない、という意味なら正常です。

STEP 08 · before/after を見比べて、変えたら戻す

最後に、STEP 02 と STEP 05 で保存したファイルを見比べます。戻した後の qdisc が before と同じ状態に戻っていること、ping の RTT が通常に近いことを確認します。

bash · learner01
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 addr172.16.10.x/24 が付いている行を探し、その先頭の名前を IF に入れます。

bash · learner01
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 $IFnetem が残っている場合は、NIC 名を間違えている可能性があります。

iptables -D-A と同じ指定で消す

削除時は、追加した条件をそのまま使います。この章では OUTPUT-p icmp-d 172.16.20.10-j DROP を同じ順で指定します。

bash · learner01
sudo iptables -S OUTPUT
sudo iptables -D OUTPUT -p icmp -d 172.16.20.10 -j DROP

既に消えている場合は Bad rule 系のメッセージが出ます。sudo iptables -S OUTPUT に該当ルールがなければ、残りはありません。

章末リセット:全部戻す

演習を終える前、または途中で状態が分からなくなったときは、次を実行して learner01 側の変更を戻します。

bash · 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 に相談

AI 遅延・ロス・ICMP block の切り分けを質問できます
この章の learner01 / webserver01 構成を前提に、tc と iptables の切り分けを説明します

修了確認

この章で見た遅延、ロス、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 の OUTPUTICMP だけを捨てています。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 $IFnetem が残っていないこと、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 段目:戻すコマンドを言えるようにする
tcsudo 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 のゴールまで進みます。

Chapter 6: 修了演習:
  • VLAN10 の learner01 から VLAN20 の webserver01 へ届く道を自分で確認します
  • OSPF の観察パネル、tc の遅延、iptables の ICMP block を統合します
  • 最後に curl http://172.16.20.10/ で nginx のゴール出力を取ります