🎓 レベル:標準 | 重要度:A(必須) 📎 前提:IPアドレスの基礎(IPv4)
要点(BLUF)
- NATは、社内のプライベートIPを公開(グローバル)IPに変換して、インターネットと通信できるようにする仕組みです。
- 実運用で最も多いのはPAT(NATオーバーロード)で、ポート番号で区別しながら多数の端末を1つのグローバルIPに集約します。
- IPv4枯渇の延命策ですが、端点間の対等接続(受信側からの開始)を壊すという代償があります。
なぜNATが要るのか
プライベートアドレス(10.x・192.168.x等)はインターネットでは一意でないため、そのままでは外部と通信できません。グローバルIPは希少で高価。そこで出口のルータで、内側の私設IPを外向きのグローバルIPに付け替え、戻りは逆変換します。これでグローバルIPを節約しつつ全端末が外へ出られます。
NATの種類
| 種類 | 変換 | 用途 |
|---|---|---|
| 静的NAT | 1対1固定 | 公開サーバ(外から特定IPで届かせたい) |
| 動的NAT | プールから1対1で動的 | グローバルIPが複数あるとき |
| PAT(オーバーロード) | 多対1(ポートで区別) | 一般家庭/企業の出口・最頻出 |
PAT:1つのグローバルIPに集約
PATは、複数の内部端末の通信を、送信元ポートを付け替えて1つのグローバルIPにまとめます。戻りパケットはポート番号で「どの内部端末宛か」を引き当てます。
graph LR A["PC-A 192.168.1.10:51514"] B["PC-B 192.168.1.11:51515"] R["NATルータ(変換表を保持)"] N["インターネット(宛先 203.0.113.9:443)"] A --> R B --> R R -->|"203.0.113.1:40001 など"| N
変換表のイメージをPythonで作ります(言語明示)。
# PAT: (内部IP, 内部ポート) を 1つのグローバルIP + 一意な外部ポート へ写像
inside = [("192.168.1.10", 51514), ("192.168.1.11", 51515),
("192.168.1.10", 51520)]
global_ip = "203.0.113.1"
table = {}
next_port = 40001
for ip, port in inside:
table[(ip, port)] = (global_ip, next_port)
next_port += 1
for k, v in table.items():
print(f"inside {k[0]}:{k[1]} -> outside {v[0]}:{v[1]}")
print("使用グローバルIP数:", len({v[0] for v in table.values()}))
実行結果:
inside 192.168.1.10:51514 -> outside 203.0.113.1:40001
inside 192.168.1.11:51515 -> outside 203.0.113.1:40002
inside 192.168.1.10:51520 -> outside 203.0.113.1:40003
使用グローバルIP数: 1
3つの内部フローが、たった1つのグローバルIPに、別々の外部ポートで同居しています。同じPC-Aの2フローも外部ポートが違うので区別できます。
設定例(Cisco IOS・PAT)
! 内部/外部インターフェースを宣言
Router(config)# interface Gi0/1
Router(config-if)# ip nat inside
Router(config)# interface Gi0/0
Router(config-if)# ip nat outside
! 変換対象をACLで指定し、外部インターフェースのIPへオーバーロード
Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255
Router(config)# ip nat inside source list 1 interface Gi0/0 overload
確認:
Router# show ip nat translations
他層との関係と限界
PATはL4のポートを使ってL3の不足を補う、層をまたいだ工夫です。代償として:
- 外部から内部への接続開始が難しい(変換表に該当が無い)。公開サーバは静的NATやポート転送が必要。
- エンドツーエンドの原則が崩れるため、一部のP2P/プロトコルが動きにくい。
- 根本解決はIPv6(
[[03-05_IPv6アドレス体系]])で、アドレスが潤沢ならNATは不要になります。
なぜポートで多重化できるのか(設計の直観)
1つのグローバルIPでも、ポート番号は約6万5千通りあります。**「IPは1つでも、IP:ポートの組なら膨大に作れる」**ため、各内部フローに一意な外部ポートを割り当てれば衝突せず集約できます。トランスポート層の多重化([[04-03_ポートとソケット]])を、アドレス節約に転用したのがPATです。
⚠️ よくある誤解
- 「NATはセキュリティ機能」ではない。外から入りにくい副作用はありますが、目的はアドレス変換。防御はファイアウォール/ACLの役割です(混同しない)。
- 「PATとNATは別物」ではない。PATはNATの一種(ポートで多対1にした形)。CiscoではNATオーバーロードと呼びます。
- 「NATがあればIPv6は不要」ではない。NATは延命策で、エンドツーエンド性を犠牲にします。根本解決はIPv6です。
対応 lab
[[networking-study/labs/07-01_pat_table.py]]— PAT変換表の生成と集約の確認
関連
- 私設/公開アドレス:
[[03-01_IPアドレスの基礎]]/ポート多重化:[[04-03_ポートとソケット]] - 通信の許可制御:
[[07-02_ACL]]/枯渇の根本解決:[[03-05_IPv6アドレス体系]]