- Linuxがインターネット制御メッセージプロトコル(ICMP)を使う
ping コマンドに対して、どのようにネットワークアドレス変換(NAT)を行うのかを解説した記事
- 著者はICMPパケットに対するNATの動作を理解するためにLinuxのネットワーキングコードを調査しており、ICMPパケットにはポートフィールドがない
- 著者はネットワーク名前空間を使って1台のLinuxマシン上で複数のデバイスをシミュレートする実験環境を構築し、NATの過程をテストするために
ping コマンドを使用
- 実験では、ブリッジに接続された2つのクライアントを作成し、NATボックスとサーバーを接続し、ルーティングとNATの設定を含む
- 著者はクライアントおよびサーバーのネットワーク名前空間でICMPパケットをキャプチャし、パケットデータを分析
- 各クライアントが異なる
id フィールドを持っているため、NATボックスが各クライアントへ転送される応答パケットを識別できることを著者は発見
- 著者はLinuxのソースコードとICMPプロトコルを定義するRFC 792を調査し、IDがどのように選ばれるのかを理解
ping コマンドは識別子をランダムに選択し、別のホスト上の2つのpingプロセスが同じIDを選んだ場合、Linuxカーネルはランダムな空きポートを選び、そのポートがICMPパケットのIDとして使われることを著者は発見
- 著者はカーネル関数を追跡し、netfilterコードの理解を検証するために
bpftrace というツールを使用
- 記事の結論は、Linuxは各クライアントに対する接続を作成してpingをNATし、送信パケットの送信元IPアドレスおよび/またはICMPの
id フィールドを書き換え、その後に応答パケットでこれらの変更を逆変換するということ
- この記事は、基礎的な技術知識を持つ初級レベルのソフトウェアエンジニアでも理解できるよう、過程を詳しく段階的に説明している
1件のコメント
Hacker Newsのコメント