2 ポイント 投稿者 GN⁺ 2023-09-11 | 1件のコメント | WhatsAppで共有
  • 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件のコメント

 
GN⁺ 2023-09-11
Hacker Newsのコメント
  • Linuxのネットワークアドレス変換(NAT)が ping リクエストをどのように処理するかについての記事
  • サーバーは固定アドレスに対して固定の ICMP エコーリクエストパケットを送信し、これは返ってこないものと想定されている
  • クライアントが接続しようとすると、サーバーが送っていた「元の」固定パケットを含む ICMP time exceeded パケットをサーバーに送る
  • クライアントはインターネット上のホップのように振る舞い、元のパケットがサーバーに届けられなかったことを知らせる
  • NAT デバイスはクライアントの完全な IP ヘッダーを含む ICMP time exceeded を NAT 配下のサーバーへ転送し、サーバーがクライアントの IP アドレスを知ることを可能にする
  • ローカルネットワークからインターネット上のデバイスへ ping が送られるとき、NAT を行うルーターは ping の送信元アドレスを公開 IP アドレスに書き換え、ICMP パケットの ID フィールドを一意な値に書き換える
  • ルーターはこの一意な ID 値を使って、応答をローカルネットワーク内の正しいデバイスへ配送する
  • 投稿では、パケットの改変、ネットワークアドレス変換、パケットフィルタリングに使われる Netfilter というツールに関する資料も紹介している
  • この記事は、ソースコードに至るまであらゆる抽象化レイヤーを深く掘り下げて分析している点が称賛されている
  • ICMP にはポートがないため、NAT は ICMP エコー応答を正しいポートに戻す問題を扱う必要がない
  • ICMP エコーリクエストには ID があり、これは事実上ソースポート番号と同等である
  • ICMP エコーの NAT 処理では、UDP が送信元ポートを再マッピングするのと同様に、ID を双方向に再マッピングする必要がある
  • 一部のユーザーは、時間の経過に伴う変更のためにブログ記事の特定のコード行へリンクすることへの不満を表明している
  • 一部のユーザーは NAT を悪い抽象化だと批判し、IPv4 の終焉を求めている
  • 中央サーバーなしで、UDP 経由の ping を使って P2P ネットワーキング向けの短いメッセージを送れる可能性についての推測
  • 記事は、ICMP パケットには ID フィールドがあり、Netfilter が ICMP パケットを「特別なケース」として扱うことを説明している、という要約