到達性と経路の確認
目標
インターフェースとルーティングを読み、pingの統計を解釈し、UDPモードのtracerouteとmtrを実行します。最後に、ICMPの到達性とTCPの到達性が別々の問いであることを、自分で証明します。
なぜ重要なのか
pingが証明するのは、IP層までだけです。その上のポートも、アプリケーションも、さらには大きなパケットが通れるかどうかも証明しません。逆に、pingの失敗がサーバーのダウンを意味するわけでもありません。多くの組織がICMP echoを遮断しています。このラボ環境はcapabilityが取り除かれているため、tracerouteのICMPモードとmtrの既定モードが動作しません。この制約自体がよい教材です。ある診断ツールは特権を要求するため、特権のない環境では代替モードを知っておく必要があります。
ステップ
/root/reachディレクトリを作成し、インターフェースの1行サマリーを/root/reach/iface.txtに保存してください。loが含まれている必要があります。- ルーティングテーブルを
/root/reach/route.txtに保存してください。defaultで始まる行がある必要があります。 127.0.0.1に3回pingした出力全体を/root/reach/ping-loop.txtに保存してください。パケット損失が0%である必要があります。- 自分自身のデフォルトインターフェースのIPに3回pingした出力を
/root/reach/ping-self.txtに保存してください。損失が0%である必要があります。 - ステップ3の結果から、RTTのmin / avg / maxの3つの値だけを空白で区切って1行で
/root/reach/rtt.txtに書いてください。 127.0.0.1に対してtracerouteを実行して出力を/root/reach/trace.txtに保存し、使用したモードを小文字で/root/reach/trace-mode.txtに1行(udp、icmp、tcpのいずれか)で書いてください。127.0.0.1に対してmtrレポートを3サイクル実行して、/root/reach/mtr.txtに保存してください。Loss%ヘッダーが含まれている必要があります。/root/reach/summary.txtを次の3行で作成してください。各値は、実際に試した結果である必要があります。icmp=<ok|fail>/tcp2222=<ok|fail>/tcp9999=<ok|fail>(ICMPは127.0.0.1に対して、TCPは127.0.0.1の該当ポートに対して判断します。)
参考
ip -br addr、ip route、ping -c 3、traceroute -n -m 3、mtr --udp --report -n -c 3の組み合わせで、ほとんど解決できます。- この環境では、
traceroute -Iとオプションなしのmtrは、raw socketの権限がないため失敗します。 - TCPポートの確認は、
nc -zv -w 2 127.0.0.1 <포트>で行います(プレースホルダーはポート番号です)。 - よくある間違い1: ステップ5で、mdevまで4つの値を書いてしまう場合です。必要なのは3つの値だけです。
- よくある間違い2: ステップ8で、実際に試さず推測で書いてしまう場合です。各行はコマンドの出力で裏づけられている必要があります。
インターフェース一覧の確認
/root/reachディレクトリを作成し、インターフェースの1行サマリーを/root/reach/iface.txtに保存してください。loが含まれている必要があります。
ipコマンドには、1行サマリー形式(-br)があります。ループバックと実際のインターフェースの両方が見える必要があります。
ルーティングテーブルの確認
ルーティングテーブルを/root/reach/route.txtに保存してください。defaultで始まる行がある必要があります。
デフォルト経路は、defaultで始まる行です。ゲートウェイのアドレスはviaの後ろに来ます。
ループバックへのping
127.0.0.1に3回pingした出力全体を/root/reach/ping-loop.txtに保存してください。パケット損失が0%である必要があります。
-cで回数を決めると、統計サマリーが最後に出力されます。損失率はそのサマリー行にあります。
自分のIPへのping
自分自身のデフォルトインターフェースのIPに3回pingした出力を/root/reach/ping-self.txtに保存してください。損失が0%である必要があります。
ステップ1で確認したインターフェースのアドレスを使ってください。自分自身に向かうパケットも、損失がないはずです。
RTT統計を読む
ステップ3の結果から、RTTのmin / avg / maxの3つの値だけを空白で区切って1行で/root/reach/rtt.txtに書いてください。
統計の最後の行に、min/avg/max/mdevがスラッシュ区切りで出ます。前の3つの値だけを取り出せば十分です。
UDPモードのtraceroute
127.0.0.1に対してtracerouteを実行して出力を/root/reach/trace.txtに保存し、使用したモードを小文字で/root/reach/trace-mode.txtに1行(udp、icmp、tcpのいずれか)で書いてください。
この環境にはraw socketの権限がないため、ICMPモードが動作しません。tracerouteの既定のモードが何か、確認してみてください。
mtrレポート
127.0.0.1に対してmtrレポートを3サイクル実行して、/root/reach/mtr.txtに保存してください。Loss%ヘッダーが含まれている必要があります。
mtrも同じ理由でUDPモードが必要です。1回実行して終わるレポートモードと、回数指定オプションを一緒に使ってください。
ICMPとTCPの比較
/root/reach/summary.txtを次の3行で作成してください。各値は、実際に試した結果である必要があります。
icmp=<ok|fail> / tcp2222=<ok|fail> / tcp9999=<ok|fail>
(ICMPは127.0.0.1に対して、TCPは127.0.0.1の該当ポートに対して判断します。)
sshdは2222で動いており、9999は誰もリッスンしていません。3つの結果がそれぞれ何を証明するのか、考えてみてください。