2025/06/18 05:40 Grokking NAT and packet mangling in Linux

やあ、ロボ子!今日はNAT(Network Address Translation)について話すのじゃ。

NATですか、博士。IPv4アドレスの枯渇を緩和するために生まれた技術ですよね。

そうそう!IPv4アドレスは32ビットで約43億個しかないからの。データセンターとか企業だと、すぐ足りなくなっちゃうのじゃ。

IPv6があるのに、なぜNATがこんなに普及しているんでしょう?

IPv6はアドレス空間はほぼ無限だけど、ISPとかハードウェア、ソフトウェアの対応が大変なのじゃ。移行に手間がかかるからの。

なるほど。NATは、ルーターがプライベートIPアドレスとグローバルIPアドレスを変換する技術ですよね。

その通り!ルーターがIPアドレスとポートのマッピングテーブルを持っていて、パケットヘッダーを書き換えて転送するのじゃ。

NATは1994年にRFC 1631で提案されたんですね。一時的な解決策だったのに、こんなに長く使われるとは。

そうなんじゃ。Basic NAT、PAT、Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT、Symmetric NAT… いろいろ種類があるのじゃ。

PAT (Port Address Translation) は、複数のデバイスが単一のパブリックIPアドレスを共有するんですよね。

そう!ポート番号を変えることで、それを実現しているのじゃ。Symmetric NATは一番制限が厳しくて、WebRTCでTURNサーバーが必要になることもあるのじゃ。

OpenWrtなどのルーターOSでは、`nftables`モジュールを使ってNATを実装しているんですね。

`nf_nat_mangle_udp_packet`とか`nf_nat_mangle_tcp_packet`関数でパケットを操作するのじゃ。チェックサムの再計算も忘れずに!

DockerもNATを利用しているんですね。`docker run -p 8080:80 nginx`コマンドは、`iptables`ルールを使ってホストのポートをコンテナに転送するんですね。

そう!でもNATには制限もあるのじゃ。エンドツーエンドの接続を阻害したり、暗号化を難しくしたり、ピアツーピアアプリケーションを複雑にしたり…。

IPv6が普及すれば、これらの問題も解決されるんでしょうね。

そうなるはずなのじゃ!でも、まだ時間がかかりそうじゃな。IPv6頑張って!

NATはアドレスを変換するときにパケットヘッダーを変更するので、暗号化を困難にするんですね。セキュリティエンジニアとしては、ちょっと困ります。

まあ、NATはアドレス不足をしのぐための、いわば「間に合わせ」の技術だったからの。そろそろ卒業したいところじゃな。

そうですね。博士、今日はNATについて色々と教えていただき、ありがとうございました。

どういたしまして。最後に一つ、NATって「何とかしてアドレスを節約する」技術じゃけど、まるで私がおやつを隠して食べるみたいじゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。