インターネットに接続されたデバイスの増加に伴い、IPv4アドレスの枯渇が深刻な問題となっています。この問題を解決するための重要な技術がNAT(Network Address Translation)です。NATにより、プライベートネットワーク内の多数のデバイスが、限られたグローバルIPアドレスを共有してインターネットにアクセスできます。
本記事では、NATとプライベートネットワークについて以下の内容を解説します。
- NATの基本概念とプライベートネットワークでの役割
- SNAT・DNAT・NAPTの違いと動作原理
- NATテーブルによるアドレス変換の仕組み
- ポートフォワーディング(DNAT)の設定方法
- NATに関連するトラブルシューティング
この記事を読むことで、NATの仕組みを理解し、ネットワーク設計時のアドレス割り当てを適切に考慮できるようになります。
前提条件
本記事を理解するために、以下の知識があることを前提としています。
- IPアドレスとサブネットの基本概念を理解している(IPアドレスとサブネットマスクの基礎を理解するを参照)
- TCPとUDPの違いを把握している(TCPとUDPの違いを理解するを参照)
- ポート番号の役割について基礎的な知識がある(ポート番号とソケット通信を理解するを参照)
実行環境
本記事で使用するコマンドは以下の環境で動作確認を行っています。
| 項目 | 環境 |
|---|---|
| Linux | Ubuntu 22.04/24.04、Rocky Linux 9 |
| Windows | Windows 10/11(PowerShell) |
| 必要なツール | iptables、nft、curl、netstat/ss |
| 権限 | root権限(Linux)、管理者権限(Windows) |
期待される学習成果
本記事を読み終えると、以下のことができるようになります。
- NATの役割と必要性を説明できる
- SNAT・DNAT・NAPTの違いを理解し、適切に選択できる
- NATテーブルの動作原理を理解できる
- iptables/nftablesでNATルールを設定できる
- NAT環境でのトラブルシューティングができる
NATとは何か
NAT(Network Address Translation)は、IPパケットがルーターを通過する際に、送信元または宛先のIPアドレス(およびポート番号)を別のアドレスに変換する技術です。
NATが必要となる背景
NATが広く使われるようになった主な理由は以下のとおりです。
- IPv4アドレスの枯渇対策: 約43億個しかないIPv4アドレスを効率的に利用
- セキュリティの向上: プライベートネットワーク内のホストを外部から直接アクセス不可にする
- ネットワーク設計の柔軟性: 組織内で自由にアドレスを割り当て可能
以下の図は、NATの基本的な動作を示しています。
flowchart LR
subgraph "プライベートネットワーク"
PC1["PC1<br/>192.168.1.10"]
PC2["PC2<br/>192.168.1.20"]
PC3["PC3<br/>192.168.1.30"]
end
NAT["NATルーター<br/>プライベート: 192.168.1.1<br/>グローバル: 203.0.113.1"]
subgraph "インターネット"
WEB["Webサーバー<br/>198.51.100.80"]
end
PC1 --> NAT
PC2 --> NAT
PC3 --> NAT
NAT -->|"送信元: 203.0.113.1"| WEBこの図では、プライベートIPアドレス(192.168.1.x)を持つ複数のPCが、NATルーターを通じて1つのグローバルIPアドレス(203.0.113.1)でインターネットにアクセスしています。
プライベートIPアドレスの復習
NATを理解する前に、プライベートIPアドレスについて確認しておきましょう。RFC 1918で定義されているプライベートIPアドレス範囲は以下のとおりです。
| 名称 | アドレス範囲 | CIDR表記 | 用途 |
|---|---|---|---|
| クラスA相当 | 10.0.0.0 - 10.255.255.255 | 10.0.0.0/8 | 大規模組織向け |
| クラスB相当 | 172.16.0.0 - 172.31.255.255 | 172.16.0.0/12 | 中規模組織向け |
| クラスC相当 | 192.168.0.0 - 192.168.255.255 | 192.168.0.0/16 | 小規模・家庭向け |
これらのアドレスはインターネット上でルーティングされないため、NATなしでは外部と通信できません。
NATの種類
NATには主に3つの種類があります。それぞれの特徴と用途を理解することで、適切なNATを選択できるようになります。
SNAT(Source NAT)
SNAT(送信元NAT)は、パケットの送信元IPアドレスを変換します。プライベートネットワークからインターネットへのアクセス時に使用されます。
flowchart LR
subgraph "変換前"
A1["送信元: 192.168.1.10<br/>宛先: 198.51.100.80"]
end
NAT1["SNAT<br/>ルーター"]
subgraph "変換後"
A2["送信元: 203.0.113.1<br/>宛先: 198.51.100.80"]
end
A1 --> NAT1 --> A2SNATの主な用途は以下のとおりです。
- プライベートネットワークからインターネットへのアクセス
- 複数のプライベートIPを少数のグローバルIPで共有
- 送信元アドレスの隠蔽によるセキュリティ向上
DNAT(Destination NAT)
DNAT(宛先NAT)は、パケットの宛先IPアドレスを変換します。外部からプライベートネットワーク内のサーバーへのアクセスを可能にするために使用されます。
flowchart LR
subgraph "変換前"
B1["送信元: 198.51.100.50<br/>宛先: 203.0.113.1:80"]
end
NAT2["DNAT<br/>ルーター"]
subgraph "変換後"
B2["送信元: 198.51.100.50<br/>宛先: 192.168.1.100:80"]
end
B1 --> NAT2 --> B2DNATの主な用途は以下のとおりです。
- ポートフォワーディング(ポート転送)
- ロードバランシング
- サーバーの移行・冗長化
NAPT(IPマスカレード)
NAPT(Network Address Port Translation)は、IPアドレスに加えてポート番号も変換する技術です。「IPマスカレード」や「PAT(Port Address Translation)」とも呼ばれます。
NAPTにより、1つのグローバルIPアドレスを複数のプライベートホストで同時に共有できます。
flowchart LR
subgraph "プライベートネットワーク"
C1["PC1<br/>192.168.1.10:50001"]
C2["PC2<br/>192.168.1.20:50002"]
end
subgraph "NAPTルーター"
NT["NATテーブル<br/>203.0.113.1:40001 ↔ 192.168.1.10:50001<br/>203.0.113.1:40002 ↔ 192.168.1.20:50002"]
end
subgraph "インターネット"
WS["Webサーバー<br/>198.51.100.80:80"]
end
C1 -->|"送信元: 192.168.1.10:50001"| NT
C2 -->|"送信元: 192.168.1.20:50002"| NT
NT -->|"送信元: 203.0.113.1:40001"| WS
NT -->|"送信元: 203.0.113.1:40002"| WS家庭用ルーターやオフィスのルーターで一般的に使用されているのは、このNAPTです。
NATの種類の比較
| 種類 | 変換対象 | 主な用途 | 方向 |
|---|---|---|---|
| SNAT | 送信元IPアドレス | プライベート→インターネット | アウトバウンド |
| DNAT | 宛先IPアドレス | インターネット→プライベート | インバウンド |
| NAPT | 送信元IP + ポート番号 | 複数ホストでのIP共有 | アウトバウンド |
NATテーブルの仕組み
NATルーターは、アドレス変換の対応関係を「NATテーブル」に記録します。このテーブルにより、戻りパケットを正しい送信元に転送できます。
NATテーブルの構造
NATテーブルには、以下の情報が記録されます。
| フィールド | 説明 |
|---|---|
| プロトコル | TCP、UDP、ICMPなど |
| 内部IPアドレス | プライベートネットワーク側のアドレス |
| 内部ポート | プライベートホストのポート番号 |
| 外部IPアドレス | グローバルアドレス |
| 外部ポート | 変換後のポート番号 |
| リモートIPアドレス | 通信相手のアドレス |
| リモートポート | 通信相手のポート番号 |
| タイムアウト | エントリの有効期限 |
NAPTの動作フロー
以下は、NAPTルーターを経由してWebサーバーにアクセスする際の動作フローです。
sequenceDiagram
participant PC as PC<br/>192.168.1.10
participant NAT as NATルーター<br/>203.0.113.1
participant WEB as Webサーバー<br/>198.51.100.80
Note over PC,WEB: アウトバウンド通信
PC->>NAT: 送信元: 192.168.1.10:50001<br/>宛先: 198.51.100.80:80
Note over NAT: NATテーブルにエントリ作成<br/>192.168.1.10:50001 ↔ 203.0.113.1:40001
NAT->>WEB: 送信元: 203.0.113.1:40001<br/>宛先: 198.51.100.80:80
Note over PC,WEB: インバウンド応答
WEB->>NAT: 送信元: 198.51.100.80:80<br/>宛先: 203.0.113.1:40001
Note over NAT: NATテーブル参照<br/>40001 → 192.168.1.10:50001
NAT->>PC: 送信元: 198.51.100.80:80<br/>宛先: 192.168.1.10:50001この動作により、プライベートネットワーク内のPCから開始した通信の応答を、NATルーターが正しく転送できます。
NATテーブルの確認方法
LinuxでNATテーブル(接続追跡テーブル)を確認するには、conntrackコマンドを使用します。
|
|
出力例を以下に示します。
tcp 6 117 TIME_WAIT src=192.168.1.10 dst=198.51.100.80 sport=50001 dport=80 src=198.51.100.80 dst=203.0.113.1 sport=80 dport=40001 [ASSURED] mark=0
この出力は、192.168.1.10:50001から198.51.100.80:80への通信が、203.0.113.1:40001に変換されて送信されたことを示しています。
LinuxでのNAT設定
LinuxでNATを設定するには、iptablesまたはnftablesを使用します。ここでは両方の設定方法を解説します。
IP転送の有効化
NAT機能を使用する前に、カーネルのIP転送機能を有効にする必要があります。
|
|
iptablesでのSNAT設定
iptablesでSNAT(IPマスカレード)を設定する方法です。
|
|
特定のIPアドレスに変換する場合は、SNATターゲットを使用します。
|
|
iptablesでのDNAT設定(ポートフォワーディング)
外部からのアクセスを内部サーバーに転送するDNATの設定方法です。
|
|
複数ポートの転送例を以下に示します。
|
|
nftablesでのNAT設定
nftablesでNATを設定する場合、まずnatテーブルを作成します。
|
|
SNATの設定を以下に示します。
|
|
DNATの設定を以下に示します。
|
|
nftables設定ファイルの例を以下に示します。
#!/usr/sbin/nft -f
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
# ポートフォワーディング
iifname "eth0" tcp dport 80 dnat to 192.168.1.100:80
iifname "eth0" tcp dport 443 dnat to 192.168.1.100:443
}
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
# マスカレード
oifname "eth0" masquerade
}
}
この設定を/etc/nftables.confに保存し、以下のコマンドで適用します。
|
|
WindowsでのNAT確認
WindowsでNAT関連の情報を確認する方法を紹介します。
接続の確認
|
|
WindowsでNATを設定する場合
Windows ServerまたはHyper-Vを使用している場合、以下のようにNATを設定できます。
|
|
NATの種類とセキュリティ
NATには、セキュリティの観点から異なる特性を持つ複数のタイプがあります。これらは特にP2P通信やVoIPなどで重要になります。
NATタイプの分類
| タイプ | 別名 | 特徴 | セキュリティ |
|---|---|---|---|
| Full Cone NAT | 1対1 NAT | 一度マッピングが作成されると、どのホストからでもアクセス可能 | 低 |
| Restricted Cone NAT | - | 内部ホストが通信したIPアドレスからのみ受信可能 | 中 |
| Port Restricted Cone NAT | - | 内部ホストが通信したIP:ポートからのみ受信可能 | 中〜高 |
| Symmetric NAT | - | 宛先ごとに異なるマッピングを作成 | 高 |
flowchart TB
subgraph "Full Cone NAT"
FC1["内部: 192.168.1.10:5000"]
FC2["外部: 203.0.113.1:40000"]
FC3["任意の外部ホストから<br/>40000ポートにアクセス可能"]
FC1 --> FC2 --> FC3
end
subgraph "Symmetric NAT"
SY1["内部: 192.168.1.10:5000"]
SY2["宛先A: 203.0.113.1:40000"]
SY3["宛先B: 203.0.113.1:40001"]
SY4["宛先ごとに異なるポート"]
SY1 --> SY2
SY1 --> SY3
SY2 --> SY4
SY3 --> SY4
endSymmetric NATは最もセキュリティが高い反面、P2P通信やVoIPでの接続確立が困難になる場合があります。
NATの制限事項と注意点
NATは便利な技術ですが、いくつかの制限事項があります。
エンドツーエンド接続の問題
NATを使用すると、インターネット側から直接プライベートホストにアクセスできません。これにより以下の問題が発生する可能性があります。
- P2P通信の確立が困難
- VoIP/ビデオ通話での接続問題
- オンラインゲームのマッチング失敗
- 一部のIPsec VPNとの非互換性
ポート番号の枯渇
NAPTでは、1つのグローバルIPアドレスで約65,535個のポートを共有します。大量の同時接続が発生する環境では、ポート番号が不足する可能性があります。
flowchart LR
subgraph "問題のシナリオ"
P1["多数のクライアント"]
P2["1つのグローバルIP<br/>65,535ポート"]
P3["ポート枯渇の可能性"]
end
P1 --> P2 --> P3対策として、以下の方法があります。
- 複数のグローバルIPアドレスを使用
- 接続タイムアウト時間の短縮
- ポート範囲の最適化
- CGN(Carrier Grade NAT)環境での適切な設計
アプリケーション層プロトコルの問題
一部のプロトコルは、ペイロード内にIPアドレス情報を含むため、NATで正しく動作しない場合があります。
| プロトコル | 問題 | 解決策 |
|---|---|---|
| FTP(アクティブモード) | DATAコネクションのアドレスがプライベートIP | パッシブモードを使用、またはALG |
| SIP | SDPにプライベートIPが含まれる | SIP ALG、STUNサーバー |
| IPsec(AH) | IPヘッダを認証するためNATで破損 | NAT-Traversal(NAT-T)を使用 |
ALG(Application Level Gateway)は、これらのプロトコルに対応するためにNATルーター内でペイロードを書き換える機能です。
NATトラバーサル技術
NAT環境でP2P通信やVoIPを実現するための技術を紹介します。
STUN
STUN(Session Traversal Utilities for NAT)は、クライアントが自身のNATタイプとグローバルアドレスを確認するためのプロトコルです。
sequenceDiagram
participant C as クライアント<br/>192.168.1.10
participant NAT as NATルーター
participant S as STUNサーバー
C->>NAT: STUNリクエスト
NAT->>S: STUNリクエスト<br/>送信元: 203.0.113.1:40000
S->>NAT: STUNレスポンス<br/>「あなたは203.0.113.1:40000」
NAT->>C: STUNレスポンス
Note over C: グローバルアドレスを認識TURN
TURN(Traversal Using Relays around NAT)は、STUNで接続できない場合にリレーサーバーを経由して通信を行うプロトコルです。Symmetric NAT環境でも通信可能ですが、リレーサーバーに負荷がかかります。
ICE
ICE(Interactive Connectivity Establishment)は、STUN/TURNを組み合わせて最適な接続経路を選択するフレームワークです。WebRTCなどで使用されています。
NAT環境のトラブルシューティング
NAT関連の問題を診断するための手順を紹介します。
基本的な確認手順
- NAT設定の確認
|
|
- 接続追跡テーブルの確認
|
|
- パケットキャプチャ
|
|
よくある問題と解決策
| 問題 | 考えられる原因 | 解決策 |
|---|---|---|
| 外部にアクセスできない | IP転送が無効 | sysctl で ip_forward を有効化 |
| 特定サイトにアクセスできない | MTU問題(Path MTU Discovery) | MSS clampingを設定 |
| ポートフォワーディングが動作しない | FORWARDチェーンで拒否 | FORWARDルールを追加 |
| 接続がタイムアウトする | conntrackタイムアウト | タイムアウト値を調整 |
MSS clampingの設定例を以下に示します。
|
|
クラウド環境でのNAT
主要なクラウドプロバイダーでも、NATの概念が活用されています。
AWS NAT Gateway
AWS VPCでは、プライベートサブネットからインターネットへのアクセスにNAT Gatewayを使用します。
flowchart TB
subgraph "VPC"
subgraph "パブリックサブネット"
IGW["Internet Gateway"]
NATGW["NAT Gateway"]
end
subgraph "プライベートサブネット"
EC2["EC2インスタンス<br/>10.0.1.10"]
end
end
Internet["インターネット"]
EC2 --> NATGW
NATGW --> IGW
IGW --> InternetAzure NAT Gateway / GCP Cloud NAT
Azure、GCPでも同様のNATサービスが提供されています。これらのマネージドNATサービスは、高可用性と自動スケーリングを提供します。
まとめ
本記事では、NATとプライベートネットワークの仕組みについて解説しました。主なポイントを以下にまとめます。
- NATの役割: プライベートIPアドレスとグローバルIPアドレスを相互に変換し、IPv4アドレスの効率的な利用とセキュリティ向上を実現
- NATの種類: SNAT(送信元変換)、DNAT(宛先変換)、NAPT(ポート番号も含めた変換)の3種類
- NATテーブル: アドレス変換の対応関係を記録し、戻りパケットの正確な転送を実現
- 設定方法: Linuxではiptables/nftablesで設定可能
- 制限事項: P2P通信の問題、ポート枯渇、一部プロトコルとの非互換性
NATの仕組みを理解することで、ネットワーク設計やトラブルシューティングをより効果的に行えるようになります。次回の記事では、ネットワークトラブルシューティングに役立つコマンドを詳しく解説します。