NAT により DNS 内の IP アドレスが変換される原因と対処

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
DNS : Disabled
FTP : Enabled
H323 : Enabled

Cisco と違い、プロトコル単位で有効/無効ができるのはいいですね。機能自体はちょっとあれだけど。

IT/インフラエンジニアの地位とスキル向上のために

関連記事

IT 技術の進化はとどまることを知りません。矢継ぎ早に新たな技術が出てきたり、数年前の技術が時代遅れになったりと、IT エンジニアは勉強し続ける運命のようです。 それをどう思うかはあなた次第。 ビジネスの基本は『付加価値を与える[…]

IMG
関連記事

nesuke の考える NW エンジニアの2つの道 ネットワークエンジニアには 2 つの道があります。 1 つはネットワーク構築一筋で、L4 までをひたすらきっちりと構築していく道。 もう 1 つはネットワークを軸として深堀し[…]

IMG