修了演習:ネットワークを設計してcurlでゴールまで届かせる
VLAN10 の受講者VMから、VLAN20 の webserver01 へ到達するまでを一気通貫で確認します。IP、ARP、VLAN、デフォルトゲートウェイ、OSPF、tc、iptables を1本の経路に束ね、最後に curl で nginx のゴール画面を取りにいきます。
| 所要時間 | 約 90 分(11 ステップ + 任意の発展) |
|---|---|
| 章タイプ | lab |
| 前提知識 | Part 2 Chapter 1-5(IP / ARP / VLAN / ルーティング / iptables と tc netem) |
| 使用機材 | workstation01 → ssh student@learner01、到達先: webserver01 172.16.20.10 |
| 関連章 | 前: Chapter 5「iptables と tc netem」/ 次: Part 2 修了 |
Ch1-5 を1本の経路にまとめる
この章でできるようになることは、「IP を付ける」から「HTTP でゴールに届く」までを、途中の失敗も含めて説明できることです。ゴールは learner01 から VLAN20 の webserver01 に curl し、nginx の見出しを取得することです。
受講者が打つのは learner01 側の ip / ping / curl / tcpdump / tc / iptables までです。router 側の vtysh や show ip ... は、管理者が取得済みの出力を 観察パネル として読みます。
VLAN10 (172.16.10.0/24) オフィス
learner01 / 受講者VM
|
| default gateway = l3router01 172.16.10.1
|
l3router01 172.16.20.1
|
| VLAN20 (172.16.20.0/24) サーバ網 兼 ルータ間 transit
| webserver01 172.16.20.10
| core01 172.16.20.2
|
core01 172.16.30.1
|
VLAN30 (172.16.30.0/24) db01 172.16.30.10 ※発展A
learner01 172.16.10.20/24l3router01 172.16.10.1webserver01 172.16.20.10l3router01 172.16.20.1area 0 neighbor Fullcore01 172.16.20.2curl http://172.16.20.10/ で <h1>Welcome to nginx on server-segment!</h1> を取得し、途中で起きる GW 未設定、ICMP block、経路未学習 を切り分けられる状態にします。この章を終えるとできること
ネットワーク到達を作る 4 動作を、1つのストーリーで確認します。
VLAN10 に置く
GW に向ける
動的経路を読む
結果から切り分ける
使う道具の早見表
この修了演習では、Part 2 の各章で使った道具を順番に呼び戻します。
ip addr / ip route で自分の位置と出口を確認します。ip neigh で同じ VLAN10 にいる l3router01 の MAC 解決を見ます。tc で遅延、iptables で ICMP block を入れて戻します。演習:curl ゴールまで11ステップで進む
| 項目 | 値 |
|---|---|
| 操作ホスト | learner01(受講者VM / VLAN10 / 172.16.10.20/24) |
| 接続方法 | workstation01 から ssh student@learner01 |
| ゴール | curl http://172.16.20.10/ で Welcome to nginx on server-segment! |
| 観察対象 | l3router01 と core01 の FRRouting 出力(受講者は実行しない) |
| 必要権限 | 受講者側は一部 sudo を使います。router の vtysh / show ip ... は観察のみです。 |
learner01 の一時的な IP / route / tc / iptables です。2回目に既に設定済みなら、File exists や同じ成功結果が出ることがあります。その場合は「設定済み」と判断して確認ステップへ進みます。IP を置く → curl 到達までをライブビューで通しで見る
STEP 01 · learner01 に入り、NIC を確認する
受講者の出発点は workstation01 です。パスワード SSH で learner01 に入り、NIC 名と現在のアドレスを見ます。
ssh student@learner01
hostname ip -br addr # 例: # learner01 # lo UNKNOWN 127.0.0.1/8 ::1/128 # ens18 UP 172.16.10.20/24
NIC 名は環境で ens18 以外になることがあります。以降の例では ens18 と書きますが、自分の表示に合わせて読み替えます。
STEP 02 · TL-SG108E の VLAN10 アクセスポートを確認する
ここは受講者が Linux で打つ操作ではありません。Ch3 の復習として、物理スイッチ側で受講者VMが VLAN10 のアクセスポートに入っている前提を確認します。
VLAN ID: 10 Port role: access / untagged PVID: 10 Connected host: learner01 / 受講者VM
アクセスポートは、受講者VMから見ると普通のLANポートです。VLANタグはスイッチ側で扱われるため、learner01 側では 172.16.10.x/24 のIPを持っているかを見れば十分です。
STEP 03 · NIC が VLAN10 の IP を持っていることを確認する
learner01 の NIC が VLAN10 のアドレス(172.16.10.x/24)を持っていることを確認します。修了演習では 自分がつないでいる NIC を作り直すと SSH が切れるため、ここでは確認に徹します。
IF=ens18 ip -br addr show dev $IF # → ens18 UP 172.16.10.20/24 (VLAN10 のIPが付いていればOK)
ip addr flush → ip addr add でアドレスを入れ替える実験は、SSH 経由だと自分の接続が切れます。試す場合は noVNC コンソール(画面から直接)で行ってください。STEP 04 · l3router01 へ ping し、ARP を見る
まず同じ VLAN10 にいるゲートウェイ 172.16.10.1 へ届くかを確認します。成功したら ip neigh で ARP 解決も見ます。
ping -c 3 172.16.10.1 ip neigh show 172.16.10.1 # 例: # 172.16.10.1 dev ens18 lladdr bc:24:11:aa:bb:cc REACHABLE
REACHABLE や STALE が見えれば、learner01 は l3router01 の MAC アドレスを知っています。ここまでは同じ VLAN10 の L2 到達です。
STEP 05 · default GW 未設定のまま webserver01 に ping して失敗する
ここでは、あえてデフォルトゲートウェイを消してから VLAN20 の webserver01 へ ping します。町の外に出る道がないと失敗する、という体験を残します。
workstation01 からの SSH は 管理ネットワーク(192.168.1.0/24)経由で、learner01 では直結ルートとして処理されます。VLAN10 側の default route を消しても、この SSH セッションには影響しません(消えるのは「VLAN20 など別の町へ出る道」だけです)。sudo ip route del default 2>/dev/null || true ip route ping -c 3 172.16.20.10 # → ping: connect: Network is unreachable # または 100% packet loss
この失敗は正解です。172.16.20.10 は VLAN20 なので、VLAN10 にいる learner01 からは default GW がないと出られません。
STEP 06 · default gateway を l3router01 に向けて成功させる
デフォルトゲートウェイを l3router01 172.16.10.1 に向け、同じ ping を再実行します。失敗から成功に変わる点を確認します。
sudo ip route replace default via 172.16.10.1 ip route ping -c 3 172.16.20.10 # default via 172.16.10.1 dev ens18 # 64 bytes from 172.16.20.10: icmp_seq=1 ttl=63 time=...
ttl=63 のように 1 つ減っていれば、l3router01 を1回またいで届いていると読めます。既に default が設定済みの人は、replace なので同じ設定に上書きされるだけです。
STEP 07 · OSPF neighbor Full を観察する
ここからは router 側の観察です。vtysh は router 上の管理CLIなので、受講者は実行しません。l3router01 と core01 が VLAN20 上で OSPF neighbor になっている証拠を読みます。
Neighbor ID Pri State Dead Time Address Interface 172.16.20.2 1 Full/- 00:00:3x 172.16.20.2 eth2:172.16.20.1
Neighbor ID 172.16.20.2: 相手はcore01(RID172.16.20.2)State Full/-: OSPF neighbor が成立済み(/-は transit を point-to-point ネットワークにしているため)Address 172.16.20.2: VLAN20 上で隣り合っている
webserver01 172.16.20.10 がいるサーバ網であり、同時に l3router01 172.16.20.1 と core01 172.16.20.2 が話す transit でもあります。STEP 08 · 手で書いていない OSPF 経路を読む
l3router01 の経路表に、VLAN30 への道が OSPF 由来で生えています。受講者は静的経路を1行も書いていません。出力から、core01 経由で VLAN30 へ行く道を読みます。
Codes: K - kernel route, C - connected, S - static, O - OSPF, B - BGP C>* 172.16.10.0/24 is directly connected, eth1 C>* 172.16.20.0/24 is directly connected, eth2 O>* 172.16.30.0/24 [110/20] via 172.16.20.2, eth2, weight 1
O>* の O は OSPF 由来、via 172.16.20.2 は core01 の VLAN20 側 IP です。発展Aでは、この道を使って db01 172.16.30.10 へ到達します。
STEP 09 · tc netem で100ms遅延を注入する
Ch5 の復習です。learner01 側で一時的に netem delay 100ms を入れ、webserver01 への ping RTT が増えることを観察します。最後に必ず解除します。
IF=ens18 ping -c 3 172.16.20.10 sudo tc qdisc replace dev $IF root netem delay 100ms ping -c 3 172.16.20.10 sudo tc qdisc del dev $IF root 2>/dev/null || true # → delay 注入後の time= が、おおむね 100ms 分大きくなる
tc qdisc del で No such file or directory が出る場合は、解除済みです。最後に ping が通常の RTT に戻れば問題ありません。STEP 10 · iptables で VLAN20 への ICMP を止め、解除する
今度は iptables で VLAN20 宛ての ICMP を止めます。ping が失敗することを確認し、すぐに同じルールを削除して復旧します。
sudo iptables -I OUTPUT -d 172.16.20.0/24 -p icmp -j DROP ping -c 3 172.16.20.10 # → 100% packet loss sudo iptables -D OUTPUT -d 172.16.20.0/24 -p icmp -j DROP ping -c 3 172.16.20.10 # → 64 bytes from 172.16.20.10 ...
この失敗は「道がない」ではなく「自分の出口で ICMP を捨てている」状態です。解除後に ping が戻れば、経路そのものは壊れていないと切り分けられます。
STEP 11 · 最終ゴール:curl で nginx に届く
最後に HTTP で webserver01 へ届くことを確認します。ping が通るだけでなく、実際のサービスからHTMLを取れることが Part 2 のゴールです。
curl http://172.16.20.10/ <h1>Welcome to nginx on server-segment!</h1>
詰まりやすい所の切り分け
修了演習で大事なのは、失敗したときに「どの層で止まっているか」を狭めることです。まず下の3つに分けます。
| 症状 | 見る場所 | 判断 |
|---|---|---|
Network is unreachable | ip route | default GW 未設定の可能性が高い。default via 172.16.10.1 を確認。 |
ping 100% packet loss だが curl は別結果 | iptables -S | ICMP だけ block している可能性。OUTPUT の DROP ルールを確認。 |
| VLAN30 / db01 だけ届かない | 観察パネルの O>* 172.16.30.0/24 | OSPF 経路未学習または core01 側の問題。受講者は router sudo せず、観察出力を読む。 |
default gateway が未設定か確認する
ip route に default via 172.16.10.1 がなければ、VLAN20 へ出る道がありません。次のコマンドで設定します。
ip route sudo ip route replace default via 172.16.10.1
ICMP block が残っていないか確認する
STEP 10 の DROP ルールが残っていると ping だけ失敗します。解除コマンドは同じ条件で -D です。
sudo iptables -S OUTPUT sudo iptables -D OUTPUT -d 172.16.20.0/24 -p icmp -j DROP 2>/dev/null || true
経路未学習を疑うときの見方
VLAN30 や発展Aだけ届かない場合は、learner01 で無理に router へ入らず、観察パネルで O>* 172.16.30.0/24 via 172.16.20.2 が出ているかを見ます。出ていなければ OSPF 側の問題です。
O>* 172.16.30.0/24 [110/20] via 172.16.20.2, eth2, weight 1
発展:OSPF / BGP を本物として確認する
発展A · db01 へ ping して、OSPF 経路で届くことを見る
VLAN30 の db01 172.16.30.10 へ ping します。STEP 08 の O>* 172.16.30.0/24 via 172.16.20.2 があるため、静的経路を1行も書かず core01 経由で届く、という体験です。
ping -c 3 172.16.30.10 # → 64 bytes from 172.16.30.10 ...
発展B · BGP Established を観察する
BGP は受講者が実行するコマンドではなく、観察パネルで読みます。l3router01 は AS65001、core01 は AS65002 です。OSPF は組織内、BGP は組織間の経路交換として対比します(本ラボは学習用に、同じ2台で OSPF と eBGP を併走させた割り切り構成です)。
Local AS number 65001 Neighbor V AS MsgRcvd MsgSent Up/Down State/PfxRcd 172.16.20.2 4 65002 xx xx 00:xx:xx 1
FRR の summary では、Established になると State/PfxRcd にそのネイバーから受信した経路数が出ます。ここでは core01(AS65002)が 172.16.30.0/24 を1本広告しているので、PfxRcd が 1 と読めれば BGP セッションは成立済みです。経路ビューで復習するときは、🛰 ライブビュー(動的ルーティング) の OSPF 表示と対応づけてください。
AI に相談
修了確認
Part 2 の修了演習を締めくくる確認です。2 問だけ、原因と証拠を結びつけます。
問 1 · GW 未設定と ICMP block の違い
ping 172.16.20.10 が失敗しました。ip route に default via 172.16.10.1 がない場合と、iptables の OUTPUT に ICMP DROP がある場合では、原因はどう違いますか?
解答を見る
GW 未設定は、VLAN10 から VLAN20 へ出る道そのものがない状態です。ip route で default via 172.16.10.1 が見えません。
ICMP blockは、道はあるが learner01 の出口で ICMP を捨てている状態です。iptables -S OUTPUT に -d 172.16.20.0/24 -p icmp -j DROP が残っていないかを見ます。
問 2 · OSPF 経路を読む
次の 1 行を見て、(a) どのプロトコルで学習した経路か、(b) 次に渡す相手はどの IP か、(c) どの発展ステップで実到達を確認するか、を答えてください。
O>* 172.16.30.0/24 [110/20] via 172.16.20.2, eth2, weight 1
解答を見る
(a) O なので OSPF です。
(b) via 172.16.20.2 なので、次に渡す相手は core01 の VLAN20 側 IP です。
(c) 発展Aで db01 172.16.30.10 へ ping し、静的経路を1行も書かずに core01 経由で届くことを確認します。
💡 修了確認の段階ヒント(問 1・問 2 共通)
💡 段階ヒント 1 段目:まず見るコマンドを分ける
ip route、自分で捨てていないかを見るなら iptables -S OUTPUT、router の自動経路を見るなら観察パネルの show ip route です。💡 段階ヒント 2 段目:IP をトポロジに戻す
172.16.10.1 は l3router01 の VLAN10 側、172.16.20.10 は webserver01、172.16.20.2 は core01 の VLAN20 側、172.16.30.10 は db01 です。💡 段階ヒント 3 段目:失敗の種類を名前で呼ぶ
Part 2 修了と次の入口
この章で、Part 2 のネットワーク基礎は一区切りです。IP を付ける、ARP を見る、VLAN を意識する、default GW で別セグメントに出る、OSPF の証拠を読む、遅延や遮断を体感する、最後に HTTP サービスへ届く、という流れを1回通しました。
次の Part では、このネットワークの上でサービスを動かす視点に進みます。curl で取れた1行は、今後扱う Web サーバ、ログ、監視、障害対応の入口です。
- 同じ VLAN なら ARP、別 VLAN なら default gateway
- OSPF の
O>*は、手で書いていない道が生えた証拠 - ping 失敗は原因名を分ける。GW 未設定、ICMP block、経路未学習は直す場所が違う