NAT は基本的には IP ヘッダの送信元 IP アドレス、宛先 IP アドレスを変換することが主目的ですが、アプリケーション層のペイロード内にある IP アドレスを検知し変換する機能もあります。
よくあるアプリケーションは DNS や FTP です。
Cisco の場合
Cisco ルータに以下設定が入っていたとします。
(config)# interface gigabitEthernet 0/0 (config-if)# ip address 192.168.1.254 255.255.255.0 (config-if)# ip nat inside (config)# interface gigabitEthernet 0/1 (config-if)# ip address 200.1.1.1 255.255.255.0 (config-if)# ip nat outside (config)# access-list 1 permit any (config)# ip nat inside source list 1 interface gigabitEthernet 0/1 (config)# ip nat inside source static 192.168.1.2 200.1.1.2 (config)# ip nat inside source static 192.168.1.3 200.1.1.3
また、192.168.1.2 は DNS サーバで、outside のエリアからは NAT 変換される想定で「www.test.com ⇒ 200.1.1.3」という A レコードが入っていたとします。
outside から 200.1.1.2 で来た DNS クエリパケットが Cisco ルータにより宛先が 192.168.1.2 に NAT 変換され、その返信として inside から outside へ DNS レスポンスパケットを返すことを想定します。その際、NAT により DNS レスポンスパケットが以下のように書き換えられます。
(NAT変換前)www.test.com ⇒ 200.1.1.3
(NAT変換後)www.test.com ⇒ 200.1.1.1
すると正しい名前解決ではなくなるので、通信が正常に行えなくなります。
これは NAT が DNS レスポンスパケット内の IP アドレスも変換する機能がデフォルトで有効になっていること、access-list 1 のルールに引っかかってしまっていることが原因です。
- 回避策1 : access-list 1 を修正する
(config)# access-list 1 permit 192.168.1.0 0.0.0.255 (config)# access-list 1 permit 172.16.0.0 0.0.255.255 (config)# access-list 1 permit 10.0.0.0 0.255.255.255
DNS レスポンスパケット内の IP アドレスは 200.1.1.3 なので、ルールには引っかからなくなる。
- 回避策2 : NAT のアプリケーション層の IP 変換機能を無効化する
(config)# ip nat inside source static 192.168.1.2 200.1.1.2 no-payload
これにより、DNS や FTP 等のアプリケーション層のIPアドレスを変換しなくなります。
Juniper SRX の場合
こちらはさらに用途不明な機能。内側⇔外側の向きは関係なく、static NAT の定義にある通りにグローバルアドレスをプライベートアドレスに変換してしまいます。しかもデフォルト有効。DNS ALG (Application Layer Gateway) 機能です。
なので、プライべートアドレスで設置している DNS サーバを、Juniper SRX で NAT させてインターネットに公開している場合は必ず以下コマンドを入れましょう。
# set applications application my-dns term dns-tcp protocol tcp # set applications application my-dns term dns-tcp destination-port 53 # set applications application my-dns term dns-tcp application-protocol ignore # set applications application my-dns term dns-udp protocol udp # set applications application my-dns term dns-udp destination-port 53 # set applications application my-dns term dns-udp application-protocol ignore
確認は以下コマンドで。
> show security alg status
FTP : Enabled
H323 : Enabled
Cisco と違い、プロトコル単位で有効/無効ができるのはいいですね。機能自体はちょっとあれだけど。
コメント