ルータから同じLAN内にNATする

会社のルータはDELLの1Uサーバです。これでPPPoEを2つと、VLANを使って
グローバルアドレスなLANとローカルアドレスなLANを
フォワーディングしています。LANは192.168.1.0/24で
192.168.1.201がDNSです。ルータは192.168.1.1です。
それでLAN内のWindowsPCなどでルータにDNSが向いている場合に
NATしてDNSに聞きにいってくれるように設定しました。

iptables -t nat -A PREROUTING -i eth0.10 -p udp --dport 53 -s 192.168.1.0/24 -d
192.168.1.1 -j DNAT --to 192.168.1.201

これで192.168.1.201までリクエストが到達するようになりました。
解説すると、

  • -A PREROUTING ルーティング前にアドレス変換する
  • -i eth0.10 入力インタフェース
  • -p udp プロトコルUDP
  • --dport 53 宛先ポート53はDNSリクエス
  • -s 192.168.1.0/24 送信元アドレス
  • -d 192.168.1.1 宛先アドレス
  • -j DNAT --to 192.168.1.201 宛先のアドレスを変更

となります。ただ、返事が返ってきません。
理由はDNSのLAN上にあるPCからのリクエストなので、
ルータを介さずに直接返事をしようとするためです。
DNStcpdumpの内容を見てみると、直接返事をしようとしています。

10:16:13.005245 IP 192.168.1.201.53 > 192.168.1.150.4429:  40 NXDomain* 0/1/0 (102)
10:16:15.004581 IP 192.168.1.201.53 > 192.168.1.150.4430:  41 1/2/0 A[|domain]

ソースアドレスも変換してあげる必要があります。

iptables -t nat -A PREROUTING -i eth0.10 -p udp --dport 53 -s 192.168.1.0/24 -d
192.168.1.1 -j DNAT --to 192.168.1.201
iptables -t nat -A POSTROUTING -o eth0.10 -p udp --dport 53 -s 192.168.1.0/24 -d
 192.168.1.201 -j SNAT --to 192.168.1.1

こうすると、ルータに返事が戻ります。
下の解説は

  • -A POSTROUTING ルーティング後にアドレスを変換
  • -o eth0.10 出力インターフェース
  • -p udp --dport 53 UDPの53番ポート
  • -s 192.168.1.0/24 送信元アドレス
  • -d 192.168.1.201 宛先アドレス
  • -j SNAT --to 192.168.1.1 送信元アドレスを変更

ルータのtcpdumpの内容を見ると、以下のようになります。

10:18:01.279623 IP 192.168.1.150.4471 > 192.168.1.1.53:  3+[|domain]
10:18:01.279652 IP 192.168.1.1.4471 > 192.168.1.201.53:  3+[|domain]
10:18:01.279913 IP 192.168.1.201.53 > 192.168.1.1.4471:  3 NXDomain* 0/1/0 (102)
10:18:01.279929 IP 192.168.1.1.53 > 192.168.1.150.4471:  3 NXDomain* 0/1/0 (102)

うまくいくようになりました。