インターネットに接続されたデバイスの増加に伴い、IPv4アドレスの枯渇が深刻な問題となっています。この問題を解決するための重要な技術がNAT(Network Address Translation)です。NATにより、プライベートネットワーク内の多数のデバイスが、限られたグローバルIPアドレスを共有してインターネットにアクセスできます。

本記事では、NATとプライベートネットワークについて以下の内容を解説します。

  • NATの基本概念とプライベートネットワークでの役割
  • SNAT・DNAT・NAPTの違いと動作原理
  • NATテーブルによるアドレス変換の仕組み
  • ポートフォワーディング(DNAT)の設定方法
  • NATに関連するトラブルシューティング

この記事を読むことで、NATの仕組みを理解し、ネットワーク設計時のアドレス割り当てを適切に考慮できるようになります。

前提条件

本記事を理解するために、以下の知識があることを前提としています。

実行環境

本記事で使用するコマンドは以下の環境で動作確認を行っています。

項目 環境
Linux Ubuntu 22.04/24.04、Rocky Linux 9
Windows Windows 10/11(PowerShell)
必要なツール iptables、nft、curl、netstat/ss
権限 root権限(Linux)、管理者権限(Windows)

期待される学習成果

本記事を読み終えると、以下のことができるようになります。

  1. NATの役割と必要性を説明できる
  2. SNAT・DNAT・NAPTの違いを理解し、適切に選択できる
  3. NATテーブルの動作原理を理解できる
  4. iptables/nftablesでNATルールを設定できる
  5. NAT環境でのトラブルシューティングができる

NATとは何か

NAT(Network Address Translation)は、IPパケットがルーターを通過する際に、送信元または宛先のIPアドレス(およびポート番号)を別のアドレスに変換する技術です。

NATが必要となる背景

NATが広く使われるようになった主な理由は以下のとおりです。

  1. IPv4アドレスの枯渇対策: 約43億個しかないIPv4アドレスを効率的に利用
  2. セキュリティの向上: プライベートネットワーク内のホストを外部から直接アクセス不可にする
  3. ネットワーク設計の柔軟性: 組織内で自由にアドレスを割り当て可能

以下の図は、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 --> A2

SNATの主な用途は以下のとおりです。

  • プライベートネットワークからインターネットへのアクセス
  • 複数のプライベート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 --> B2

DNATの主な用途は以下のとおりです。

  • ポートフォワーディング(ポート転送)
  • ロードバランシング
  • サーバーの移行・冗長化

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コマンドを使用します。

1
2
3
4
5
6
7
8
# conntrackテーブルの表示
sudo conntrack -L

# TCP接続のみ表示
sudo conntrack -L -p tcp

# 特定IPアドレスに関するエントリを表示
sudo conntrack -L -s 192.168.1.10

出力例を以下に示します。

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転送機能を有効にする必要があります。

1
2
3
4
5
6
7
8
9
# 現在の設定を確認
cat /proc/sys/net/ipv4/ip_forward

# 一時的に有効化
sudo sysctl -w net.ipv4.ip_forward=1

# 永続的に有効化(/etc/sysctl.conf に追記)
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

iptablesでのSNAT設定

iptablesでSNAT(IPマスカレード)を設定する方法です。

1
2
3
4
5
6
7
8
# インターフェース確認
ip addr show

# eth0をWAN側インターフェースとしてマスカレードを設定
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 設定の確認
sudo iptables -t nat -L -n -v

特定のIPアドレスに変換する場合は、SNATターゲットを使用します。

1
2
# 送信元を203.0.113.1に変換
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1

iptablesでのDNAT設定(ポートフォワーディング)

外部からのアクセスを内部サーバーに転送するDNATの設定方法です。

1
2
3
4
5
# 外部からポート80へのアクセスを192.168.1.100:80に転送
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80

# 転送されたパケットを許可(FORWARDチェーン)
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

複数ポートの転送例を以下に示します。

1
2
3
4
5
# SSH(22)を内部サーバーに転送
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.100:22

# HTTPSを内部サーバーに転送
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443

nftablesでのNAT設定

nftablesでNATを設定する場合、まずnatテーブルを作成します。

1
2
3
4
# natテーブルとチェーンの作成
sudo nft add table nat
sudo nft add chain nat prerouting { type nat hook prerouting priority -100 \; }
sudo nft add chain nat postrouting { type nat hook postrouting priority 100 \; }

SNATの設定を以下に示します。

1
2
3
4
5
# マスカレード(動的SNAT)
sudo nft add rule nat postrouting oifname "eth0" masquerade

# 固定IPへのSNAT
sudo nft add rule nat postrouting oifname "eth0" snat to 203.0.113.1

DNATの設定を以下に示します。

1
2
# ポート80をプライベートサーバーに転送
sudo nft add rule nat prerouting iifname "eth0" tcp dport 80 dnat to 192.168.1.100:80

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に保存し、以下のコマンドで適用します。

1
sudo nft -f /etc/nftables.conf

WindowsでのNAT確認

WindowsでNAT関連の情報を確認する方法を紹介します。

接続の確認

1
2
3
4
5
6
7
8
# アクティブな接続とNAT情報を確認
Get-NetNatSession

# NAT設定の確認
Get-NetNat

# ポートマッピングの確認
Get-NetNatStaticMapping

WindowsでNATを設定する場合

Windows ServerまたはHyper-Vを使用している場合、以下のようにNATを設定できます。

1
2
3
4
5
# 新しいNATを作成
New-NetNat -Name "MyNAT" -InternalIPInterfaceAddressPrefix "192.168.1.0/24"

# ポートフォワーディングの追加
Add-NetNatStaticMapping -NatName "MyNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.1.100 -InternalPort 80

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
    end

Symmetric 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

対策として、以下の方法があります。

  1. 複数のグローバルIPアドレスを使用
  2. 接続タイムアウト時間の短縮
  3. ポート範囲の最適化
  4. 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関連の問題を診断するための手順を紹介します。

基本的な確認手順

  1. NAT設定の確認
1
2
3
4
5
# iptablesの場合
sudo iptables -t nat -L -n -v

# nftablesの場合
sudo nft list table nat
  1. 接続追跡テーブルの確認
1
sudo conntrack -L | grep <対象IP>
  1. パケットキャプチャ
1
2
3
4
5
# 外部インターフェースでキャプチャ
sudo tcpdump -i eth0 host 198.51.100.80

# 内部インターフェースでキャプチャ
sudo tcpdump -i eth1 host 192.168.1.10

よくある問題と解決策

問題 考えられる原因 解決策
外部にアクセスできない IP転送が無効 sysctl で ip_forward を有効化
特定サイトにアクセスできない MTU問題(Path MTU Discovery) MSS clampingを設定
ポートフォワーディングが動作しない FORWARDチェーンで拒否 FORWARDルールを追加
接続がタイムアウトする conntrackタイムアウト タイムアウト値を調整

MSS clampingの設定例を以下に示します。

1
2
# iptablesでMSS clampingを設定
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

クラウド環境での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 --> Internet

Azure 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の仕組みを理解することで、ネットワーク設計やトラブルシューティングをより効果的に行えるようになります。次回の記事では、ネットワークトラブルシューティングに役立つコマンドを詳しく解説します。

参考リンク