ソースNAT完全ガイド:SNAT/PAT/CGNATの仕組み・設定例・実務トラブルシュートまで解説
はじめに
ネットワークやファイアウォールの設定を扱っていると「ソースNAT(Source NAT、SNAT)」という用語に必ず出会います。本コラムではソースNATの概念、種類、動作原理、実務での設定例やトラブルシュート、クラウドやIPv6における留意点までを深掘りして解説します。読者がネットワーク設計や運用で実際に使える知識を得られることを目的とします。
ソースNATとは何か
ソースNATとは、IPパケットがルータやファイアウォールを通過する際に「送信元(Source)アドレス」および必要に応じて送信元ポートを別の値に書き換える技術です。これにより内部ネットワークのプライベートアドレスを外部に直接晒さず、1つまたは少数のグローバルIPアドレスで多数の内部ホストがインターネットへアクセスできるようになります。
対義語としては「デスティネーションNAT(DNAT)」があり、これは受信先アドレスを書き換えるものです。典型的なソースNATの用途はインターネット接続の共有や、アウトバウンドトラフィックの出口IPを統一することです。
ソースNATの主な種類
SNAT(Static SNAT / 1:1 NAT) — 内部ホストのアドレスを特定の外部アドレスに固定で置換する方式。例:社内サーバ 10.0.0.5 を常に 203.0.113.5 へ変換する。
PAT / マスカレード(Port Address Translation / MASQUERADE) — 複数の内部ホストを単一の外部IPで共有する際に、送信元ポート番号も書き換えて一意に識別する方式。Linux の iptables での MASQUERADE や Cisco の overload が該当します。
ダイナミックSNAT — 利用可能なグローバルIPプールから動的に外部IPを割り当てる方式。大量の一時的な接続に対する対応が主目的です。
Carrier-Grade NAT(CGNAT) — ISP が多数の顧客で共有するために大規模に導入するソースNAT。RFC 等での挙動要件が関係します。
仕組みと処理の流れ
ソースNATは通常、パケットが送信元ネットワーク(内部)から外部へ向かう「POSTROUTING(後処理)」段階で行われます。ルータは次の処理を行います。
- パケットの送信元IP(と場合により送信元ポート)を置換
- 変換テーブル(コネクション・トラッキング)にエントリを作成し、戻りパケットを元の内部ホストに逆変換できるようにする
- 必要に応じてチェックサムやTCP/UDPヘッダを再計算
コネクション・トラッカー(例:netfilter/conntrack)は、各接続に対するマッピング(内側IP:port ↔ 外側IP:port)とタイムアウトを管理します。これにより、外部から返ってきたパケットを正しい内部ホストへ戻せます。
実践的な設定例
以下は代表的な機器/環境でのソースNAT設定例です。実際の運用では管理者権限や適切なACLと併用してください。
Linux(iptables)
例:eth0 をインターネット側、内部が 192.168.0.0/24 の場合iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
静的外部IPを指定する場合:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.5
nftables(例)
nftables の nat テーブルでの SNATnft add table ip nat nft 'add chain ip nat postrouting { type nat hook postrouting priority 100; }' nft add rule ip nat postrouting oif "eth0" snat to 203.0.113.5Cisco IOS
ip nat inside source list 1 interface GigabitEthernet0/0 overload access-list 1 permit 10.0.0.0 0.0.0.255
静的:
ip nat inside source static 10.0.0.5 203.0.113.5
AWS / Azure
クラウドでは NAT Gateway(AWS)、NAT Gateway / Load Balancer(Azure)などのマネージドサービスがソースNATを行います。インスタンス型の NAT(NAT Instance)も SNAT を担えます。
PAT(ポート変換)とポート保存の挙動
PAT(Port Address Translation)は、1つまたは少数の外部IPで多数の内部接続を識別するためにポート番号を再利用する技術です。NAT実装はできるだけ元のポート番号を保存しようとしますが、競合がある場合は別のエフェメラルポートに割り当てます。結果、外部向けには外部IP:port の組が一意となり、戻りトラフィックの紐付けが可能になります。
よくある問題とトラブルシュートの方法
接続の切断・タイムアウト
conntrack テーブルのエントリがタイムアウトすると、戻りパケットが破棄される。長時間アイドルの接続や特定プロトコル(UDPなど)ではタイムアウトの調整が必要。ポート枯渇
多数の内部ホストが少ないグローバルIPを共有すると、利用できるポート数(約65k/プロトコル)が枯渇する可能性がある。高トラフィック環境ではグローバルIPを追加するか、接続の短命化やロードバランシングを検討する。ヘルパー/ALGの問題
FTP、SIP、H.323 等のプロトコルは制御メッセージ内にIPアドレスやポートを含むため、NAT 越しで問題が発生しやすい。これらには専用のアプリケーションレイヤー・ゲートウェイ(ALG)や、プロキシ、STUN/TURN といった補助が必要。内部から内部へのアクセス(ヘアピン/ループバック)
自分の外部IP経由で内部サービスにアクセスする「ヘアピンNAT」は、適切に NAT ルールやルーティングを構成しないと動作しない。多くの実装では追加の DNAT/SNAT ルールが必要。パケット断片化やチェックサム
NAT はヘッダを書き換えるため IP/TCP/UDP チェックサムを再計算する必要がある。実装不備やハードウェアアクセラレータの相違により不整合が発生することがある。
ログと可視性、監査への影響
ソースNATを行うと内部ホストの実際のIPは外部ログには記録されません。したがって、外部からのアクセスログや調査では、NAT の管理者が NAT テーブルや内部ログを参照して元のホストを突き止める必要があります。セキュリティ監査やフォレンジックの観点からは、NAT のログ保管・コネクショントラッキングログの同期が重要です。
パフォーマンスとスケーリング
ソースNAT はコネクションテーブルを大量に保持するためメモリ負荷が増します。ハードウェア NAT(ASIC)や高速パスオフロードを活用することでスループットを改善できますが、オフロードにより conntrack の動作やタイミングが変わる点に注意が必要です。大規模環境ではステートレスな手法(ロードバランサやプロキシ)や複数 NAT ゲートウェイでの分散も検討します。
クラウド環境やISPでの利用(CGNAT含む)
クラウドプロバイダはアウトバウンド接続に対してソースNAT を用いることが一般的です(例:NAT Gateway)。また、IPv4 アドレスが不足している状況では ISP が CGNAT を導入し、多数の顧客トラフィックを共有アドレスへ NAT します。CGNAT は利用者同士で同一外部IPを共有するため、トラブルシュートやピアリング、ブラックリスト対策で課題が生じます。
IPv6 と NAT
IPv6 の設計思想ではグローバルアドレスが十分であり、NAT を使わずにエンドツーエンド接続を可能にすることが推奨されています。したがってソースNAT は原則不要ですが、プライバシーのためのアドレス隠蔽(NAT66)や一部移行技術(NAT64:IPv6→IPv4 変換)など特別なケースで使われることがあります。一般的に IPv6 ネットワーク設計では NAT を避け、ファイアウォールでアクセス制御を行うのが望ましいとされています。
設計上のベストプラクティス
- 外部に晒す出口IPを明確にし、必要に応じて複数の出口を用意する(負荷分散・冗長化)。
- コネクションタイムアウトの値をワークロードに合わせて最適化する(特に UDP)。
- ログや conntrack 情報を中央収集し、トラブル時に追跡できるようにする。
- アプリケーションが NAT 環境で正常に動作するか(ALG の要否、STUN/TURN 等)を検証する。
- IPv6 を導入可能なら、可能な限り NAT を回避する設計を検討する。
まとめ
ソースNATは、内部ネットワークとインターネットをつなぐ上で不可欠な技術であり、種類(SNAT、MASQUERADE、PAT、CGNAT)や挙動、実装上の注意点を理解することが運用の安定性に直結します。特にコネクション・トラッキング、ポート枯渇、アプリケーション互換性、ログ可視化は実務で頻出する論点です。クラウド利用やIPv6化も踏まえ、適切な設計と監視を行うことが重要です。
参考文献
- RFC 3022 - Traditional IP Network Address Translator (Traditional NAT)
- RFC 2663 - IP Network Address Translator (NAT) Terminology and Considerations
- RFC 4787 - Network Address Translation (NAT) Behavioral Requirements for Unicast UDP
- RFC 6146 - Stateful NAT64: Network Address and Protocol Translation from IPv6 Clients to IPv4 Servers
- Netfilter / iptables プロジェクト
- nftables 公式ドキュメント
- AWS: NAT Gateway と NAT インスタンスのドキュメント
- Azure: NAT Gateway の概要
- Wikipedia: Network address translation
- Cisco: NAT 設定ガイド(基本)


