NAT(Network Address Translation)
概要
NAT(Network Address Translation) は、IP パケットのヘッダーに含まれる送信元または宛先 IP アドレスを別のアドレスに書き換えるネットワーク技術です。RFC 3022(2001 年)で定義されており、初期の仕様は RFC 1631(1994 年)で提案されました。
NAT が広く使われる最大の理由は IPv4 アドレスの枯渇です。IPv4 の 32 ビットアドレス空間は 約 43 億個しかなく、IANA の未割り当てプールは 2011 年 2 月に枯渇しました。NAT を使うと、RFC 1918 で定義されたプライベートアドレス(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)を内部ネットワークで自由に使いながら、外部との通信時に 1 つまたは少数のパブリックアドレスを共有できます。家庭のルーターが 1 つのパブリック IP アドレスで複数のスマートフォンやパソコンをインターネットに接続できるのは、NAT の仕組みがあるからです。
仕組み
NAT はパケットヘッダーのアドレスを書き換える基本動作に加え、ポート番号の多重化(NAPT)やキャリアグレード NAT など複数の方式があります。
基本的な変換の流れ
NAT ルーターは内部ネットワークと外部ネットワークの境界に位置し、通過するパケットのアドレスを書き換えます。
- 内部ホスト(192.168.1.10)がインターネット上のサーバー(203.0.113.50)にパケットを送信する
- NAT ルーターが送信元アドレスをパブリックアドレス(198.51.100.1)に書き換えてパケットを転送する
- サーバーは 198.51.100.1 に対して応答を返す
- NAT ルーターが宛先アドレスを 192.168.1.10 に書き換えて内部ホストに転送する
NAT ルーターはこの対応関係(NAT テーブル)を保持し、応答パケットを正しい内部ホストに振り分けます。
NAT の種類
NAT にはアドレス変換の方式によって複数の種類があります。
| 種類 | 変換対象 | 同時接続 | 用途 |
|---|---|---|---|
| スタティック NAT | 1 対 1 のアドレス固定対応 | アドレス数と同数 | サーバー公開 |
| ダイナミック NAT | プールから動的に割り当て | プールのアドレス数まで | 中規模ネットワーク |
| NAPT(PAT) | アドレス+ポート番号で多重化 | 理論上 65,535 × アドレス数 | 家庭・企業の一般的な接続 |
最も広く使われているのは NAPT(Network Address Port Translation) です。PAT(Port Address Translation)や IP マスカレードとも呼ばれます。NAPT は IP アドレスだけでなくポート番号も書き換えることで、1 つのパブリックアドレスを多数の内部ホストで共有します。
NAPT の動作
NAPT は送信元アドレスとポート番号の組み合わせを変換テーブルで管理します。
内部ホスト A: 192.168.1.10:50000 → 198.51.100.1:40001
内部ホスト B: 192.168.1.11:50000 → 198.51.100.1:40002
内部ホスト C: 192.168.1.12:60000 → 198.51.100.1:40003
外部から見ると、すべての通信が 198.51.100.1 の異なるポートから発信されているように見えます。応答パケットは宛先ポート番号を手がかりに、正しい内部ホストに振り分けられます。TCP と UDP はポート番号が 0〜65535 の範囲のため、理論上は 1 つのパブリックアドレスで約 65,000 の同時セッションを処理できます。実際にはルーターのメモリや CPU リソースによって上限はこれより低くなります。
キャリアグレード NAT(CGN)
IPv4 アドレスの枯渇が進み、ISP レベルで NAT を行うキャリアグレード NAT(CGN)が普及しています。RFC 6598(2012 年)は CGN 用に 100.64.0.0/10 のアドレス範囲を予約しました。
CGN 環境では、ユーザーのルーターが行う NAT の外側にさらに ISP の NAT が入り、二重 NAT 構成になります。
内部ホスト → [ユーザー NAT] → 100.64.x.x → [ISP CGN] → パブリック IP
二重 NAT はポートの消費が倍になり、P2P 通信やオンラインゲームのマッチメイキング、VoIP の通話品質に影響することがあります。
設定例
Linux の iptables による NAPT やポートフォワーディング、AWS NAT Gateway の構成例を示します。
Linux iptables による NAPT
Linux ルーターで NAPT を設定する基本的なコマンドです。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
MASQUERADE ターゲットは外部インターフェース(eth0)のアドレスを自動的に送信元アドレスとして使います。IP フォワーディングの有効化も必要です。
sysctl -w net.ipv4.ip_forward=1
ポートフォワーディング(DNAT)
外部からの特定ポートへの通信を内部サーバーに転送するには、DNAT(Destination NAT)を設定します。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.20:443
このルールは、外部から NAT ルーターのポート 443 に届いた TCP パケットを、内部の 192.168.1.20:443 に転送します。Web サーバーを NAT の内側で公開する一般的な方法です。
AWS NAT Gateway
AWS VPC のプライベートサブネットからインターネットにアクセスするには、NAT Gateway を使います。
プライベートサブネットのルートテーブル:
宛先: 0.0.0.0/0
ターゲット: nat-0123456789abcdef0
パブリックサブネットのルートテーブル:
宛先: 0.0.0.0/0
ターゲット: igw-0123456789abcdef0
NAT Gateway はパブリックサブネットに配置し、Elastic IP を割り当てます。プライベートサブネットのデフォルトルートを NAT Gateway に向けると、内部のインスタンスが外部の API やパッケージリポジトリにアクセスできるようになります。
確認方法
NAT テーブルの状態を確認するには、Linux では conntrack コマンドを使います。
conntrack -L -n
tcp 6 117 TIME_WAIT src=192.168.1.10 dst=203.0.113.50 sport=50000 dport=443 src=203.0.113.50 dst=198.51.100.1 sport=443 dport=40001 [ASSURED]
出力から、内部アドレス 192.168.1.10:50000 がパブリックアドレス 198.51.100.1:40001 に変換されていることがわかります。
iptables の NAT ルールを確認するには次のコマンドを使います。
iptables -t nat -L -n -v
自分のパブリック IP アドレス(NAT 後のアドレス)を確認するには、外部サービスに問い合わせます。
curl -4 ifconfig.me
外部の視点からも確認したい場合は、Labee Dev Toolbox の IP API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/ip"
{
"success": true,
"data": {
"ip": "198.51.100.1",
"type": "IPv4",
"isPrivate": false,
"ptr": null
},
"error": null,
"meta": { "responseTime": 35 }
}
data.ip に返されるのは NAT 後のパブリックアドレスです。data.isPrivate が false であれば、パブリックアドレスとしてインターネットに到達していることを確認できます。
よくある問題
NAT はポート枯渇、ヘアピン NAT、P2P 通信など、エンドツーエンド通信を前提とするプロトコルで問題を起こしやすい技術です。
ポート枯渇
NAPT は 1 つのパブリックアドレスあたり約 65,000 ポートを共有します。同時接続数がこの上限に近づくと新しい接続が確立できなくなります。Web アプリケーションサーバーが多数の外部 API を呼び出す環境や、CGN 配下で多数のユーザーが 1 つのパブリック IP を共有する環境で発生しやすい問題です。パブリックアドレスの追加、または IPv6 への移行で対処します。
ヘアピン NAT の未設定
内部ネットワークから NAT ルーターのパブリック IP 経由で内部サーバーにアクセスしようとすると、通信が失敗することがあります。この現象はヘアピン NAT(NAT ループバック、NAT リフレクション)の設定不足で発生します。パケットが NAT ルーターを経由して折り返すルールがないと、内部ホスト同士の通信でもパブリック IP を使った場合にルーティングが破綻します。内部 DNS でプライベートアドレスを返すか、ヘアピン NAT ルールを追加して対処します。
P2P 通信の確立困難
NAT の内側にいるホスト同士が直接通信する場合、双方が NAT の背後にいるとパケットの宛先が不明になります。VoIP、ビデオ会議、オンラインゲームで問題になるケースです。STUN(RFC 5389)で自分の外部アドレスとポートを検出し、TURN(RFC 5766)でリレーサーバーを経由する方法が使われます。ICE(RFC 8445)はこれらの手法を組み合わせて最適な接続経路を自動選択するフレームワークです。
NAT と FTP の非互換
FTP は制御コネクション(ポート 21)とデータコネクション(ポート 20 または動的ポート)を分離する設計です。パッシブモードの FTP ではサーバーがランダムなポートでデータ接続を待ち受けますが、NAT ルーターがそのポートを転送するルールを持っていないとデータ転送が失敗します。FTP ALG(Application Layer Gateway)を有効にするか、SFTP(SSH File Transfer Protocol)に置き換えることで解決します。