こんにちは!大規模なデータセンターのNOC(ネットワークオペレーションセンター)で、日々トラブルの荒波にもまれているシニアエンジニアです。夜中に突然鳴り響くアラート音に飛び起き、冷や汗を流しながらパケットの海を泳ぐ……そんな泥臭い現場を数え切れないほど経験してきました。
ネットワークの世界に飛び込んだばかりの頃は、見慣れないコマンドや専門用語の壁にぶつかって「一体何が起きているんだ……?」と途方に暮れることもありますよね。でも、安心してください。どんなに複雑に見えるネットワークのトラブルも、基本の原理を一つずつ紐解いていけば、必ず原因にたどり着くことができます。
今回は、インフラエンジニアなら誰もが直面する「特定のポートやファイアウォールに阻まれた通信経路の調査」について、実務で本当に役立つノウハウを交えながら、優しく丁寧に解説していきますね。
—
ネットワークの「迷子」を救う!tracerouteの基本とお手紙のたとえ
私たちが普段使っている ping コマンドは、「あそこのサーバー、元気かな?」と相手の生存確認をするためのものです。では、相手に届くまでの「道順」を知りたいときはどうすればいいでしょうか?そこで登場するのが traceroute(Windowsの場合は tracert)というコマンドです。
ここで、インターネットの通信を「郵便配達」に例えてみましょう。
あなたが遠くの友達にお手紙を書いたとします。その手紙は、近くのポストから地元の郵便局、中継地点の大きなハブ局を経由して、友達の家のポストへと届けられますよね。
通常の traceroute は、郵便局員さんに向かって「この手紙、中継地点を通過するごとに、通過したスタンプを押して、私にその名前を教えてね!」とおつかいを頼むような動きをします。
具体的には、パケットの「寿命(TTL:Time To Live)」というカウンターを最初は 1 に設定して送信します。すると、すぐ隣のルーター(最初の郵便局)に着いた瞬間に寿命が 0 になり、ルーターが「寿命切れですよ!」とお手紙を送り主(あなた)に送り返してくれます。これで1つ目のルーターの住所が分かります。
次はその寿命を 2 に増やして送り、2つ目のルーターの住所を聞き出す……これを繰り返すことで、目的地までの全ルートを暴き出すわけです。
—
通常のtracerouteでは見えない「壁」の存在
さて、ここで現場特有の厄介な問題が発生します。
現代のネットワークには、セキュリティを守るための「ファイアウォール」や、アクセスを分散させる「ロードバランサー(LB)」という門番たちが立ちはだかっています。彼らは非常に厳格で、見慣れない形式の郵便物や、指定されたルール以外の通信を容赦なくゴミ箱にポイっと捨ててしまいます。
私たちが普段よく使う標準的な traceroute は、実は UDP というプロトコルや、ICMP という死活確認用のプロトコルを使っています。
しかし、Webサイトを閲覧する通信やセキュアな通信の多くは TCP というプロトコルを使っていますよね。「Webサーバーの 443 番ポート(HTTPS)への道順だけをピンポイントで調べたい!」と思っても、途中のファイアウォールがUDPやICMPの通信をブロックしていると、途中で道順の調査がプツリと途切れてしまい、「これ以上先は進めません(星マーク * が並ぶ)」となってしまうのです。
「門番が通せんぼしているせいで、本当に見たいWeb用の道が見えない……!」
そんな絶望的な状況を打破するのが、今回紹介する 「TCPベースのtraceroute(ポート指定)」 というプロの技です。
—
TCPパケットで「こじ開ける」!TCP tracerouteの仕組み
「それなら、本番のWeb通信と同じ格好(TCPの姿)をして、門番をごまかして(あるいは同じルールで)道順を聞き出せばいいじゃないか!」
これがTCP tracerouteの発想です。
TCP通信の始まりには、まず「こんにちは、通信を始めましょう!」という挨拶のパケット(SYNパケット)を送信します。このSYNパケットに traceroute の寿命(TTL)の仕組みを組み合わせるのです。
1. 寿命 1 を設定した TCP SYN パケットを、目的地のWebサーバーの特定のポート(例: 443 番)宛てに投げる。
2. 途中のルーターが寿命を迎え、「寿命切れです」と返答をくれる。これで経路がわかる。
3. 寿命を 2、3……と増やしていき、最終的に目的地のサーバーまで到達させる。
4. 目的地に届いたTCP SYNパケットに対し、サーバーは「おっ、通信開始ですね!」と返事(SYN-ACK)を返すか、あるいはファイアウォールが拒否(RST)の返事を返す。
これにより、「途中のどのルーターまで進めたか」だけでなく、「目的地の特定のポート(Webやデータベースなど)まで通信がちゃんと届いているか、途中でブロックされていないか」を完璧に把握できるというわけです。
—
実践!Linux環境でTCP tracerouteを使いこなす
それでは、実際の現場で私たちがどのようにこのコマンドを叩いているのか、具体的な例を見ていきましょう。
Linux環境では、標準的な traceroute コマンドに -T オプション(TCPを指定)や -p オプション(ポート番号を指定)を組み合わせることで、鮮やかにTCP tracerouteを実行できます。
1. 基本的なコマンドの実行例
例えば、example.com の 443 番ポート(HTTPS)までの経路とポートの疎通を確認したい場合は、以下のようにコマンドを実行します。
# TCPプロトコル(-T)を使用し、目的地の443番ポート(-p 443)を指定してtracerouteを実行する
sudo traceroute -T -p 443 example.com
*ワンポイントアドバイス:*
通常、TCPのパケットを自由なTTLで生成して飛ばすには管理者権限(sudo)が必要になることが多いです。現場で「Permission denied」と言われたら、sudo を頭に付け忘れていないか確認してみてくださいね。
2. もう一つの強力なツール:tcptraceroute コマンド
ディストリビューションによっては、専用の tcptraceroute というツールが用意されている場合もあります。こちらも実務では非常によく使われます。
# tcptracerouteコマンドを使って、特定の宛先とポートへの経路を調査する
tcptraceroute target-server.internal.net 8080
このコマンドを実行すると、以下のような出力が得られます(イメージです)。
1 gateway (192.168.1.1) 1.123 ms 0.982 ms 0.876 ms
2 firewall.corp.net (10.0.0.254) 2.450 ms 2.310 ms 2.401 ms
3 lb-edge.cloud.net (203.0.113.50) 10.120 ms 9.980 ms 10.050 ms
4 * * *
5 target-server.internal.net (192.168.100.10) [open] 15.430 ms 15.200 ms 15.310 ms
注目してほしいのは最後の行にある [open] という表示です!
途中の4行目で応答が途絶えかけていても(* * *)、最後の目的地でちゃんとポートが開いている(open)ことが確認できれば、「途中のルーターはICMPを返さない設定になっているけれど、通信自体はしっかり目的地まで届いているぞ」と確信が持てます。この瞬間が、NOCエンジニアにとって一番ホッとする瞬間だったりします。
—
トラブルシューティングで役立つオプションと読み解きのコツ
現場でさらに一歩踏み込んだ調査をする際によく使うオプションや、結果の読み解き方をいくつかご紹介しておきますね。
-nオプション:
名前解決(IPアドレスからドメイン名への逆引き)を行わず、IPアドレスのまま表示させます。DNSの応答遅延に邪魔されたくない現場では必須のテクニックです。
-wオプション:
タイムアウトまでの待ち時間を秒単位で調整します。応答が遅い海外のサーバーを調査する際によく変更します。
# 名前解決をスキップ(-n)、待ち時間を3秒(-w 3)に設定して、443番ポートをTCPで調査
sudo traceroute -T -n -w 3 -p 443 198.51.100.15
もし、途中のルーターの段階でずっと * が続き、最終行まで到達しない場合は、以下のような原因が考えられます。
1. ファイアウォール(セキュリティグループ等)が完全にそのポート(SYNパケット)をドロップしている。
2. 途中の機器がセキュリティ上の理由で traceroute のようなプローブパケットに対する返信(ICMP Time Exceeded)をわざと制限・破棄している。
「パケットが捨てられているのか、それとも単に返事をくれないシャイなルーターなのか」を見極めるために、ポート番号を変えてみたり(例えば、あえて絶対に空いていないポートを指定して返事の有無を確認するなど)、他のツールと組み合わせたりする泥臭いアプローチが必要になってきます。
—
まとめ
今回は、TCPベースのtracerouteオプションとポート指定による経路検証について、郵便配達のたとえを交えながらお話ししてきました。
- 通常の
tracerouteでは、ファイアウォールやポートブロックの裏側を覗き見ることが難しい場合がある。 テイラーメイドな通信である TCP SYNパケット を用いることで、特定のポート(443や80など)が実際にどこまで到達しているかを正確に追跡できる。sudo traceroute -T -p [ポート番号]のコマンドは、インフラ・ネットワークの現場における強力な武器になる。
ネットワークのトラブルシューティングは、見えないパケットの行方をロジカルに推理する名探偵のようなお仕事です。最初は難しく感じるかもしれませんが、今日ご紹介した基本の仕組みとコマンドを頭の片隅に置いておけば、いざという時に必ずあなたを助けてくれます。
一歩ずつ、確実に知識と経験を積み重ねて、頼りになるエンジニアを目指していきましょう!それでは、また次回のパケット解析の海でお会いしましょう。
コメント