ルータから同じ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からのリクエストなので、
ルータを介さずに直接返事をしようとするためです。
DNSのtcpdumpの内容を見てみると、直接返事をしようとしています。
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)
うまくいくようになりました。