如何複製傳入的 DNS 數據包並使用 iptables 將它們發送到不同的名稱伺服器?
編輯:tldr:我想使用 TEE 和 NAT 來複製 UDP 流量。我不擔心處理響應。理想情況下,我不想安裝新軟體。我正在使用 TEE 成功發送到本地網段(127.0.0.2),然後我想將該流量 NAT 到 WAN。
我在我的 Debian 伺服器上的 53 埠上監聽了 bind9。我有一個外部客戶端向所述伺服器發出 DNS 請求。所有這些工作正常。我想複製埠 53 上的傳入 DNS 請求並將它們發送到例如 8.8.8.8。注意複製這個詞。
通過對 SU 的大量搜尋和閱讀,我發現最常用的方法是使用 iptables TEE 和 NAT。我的 TEE 工作得很好,這是我的命令:
iptables -t mangle -A POSTROUTING -p udp -d 127.0.0.1 --dport 53 -j TEE --gateway 127.0.0.2
我用 netcat 驗證我在 127.0.0.2:53 收到了 DNS 請求的副本。到現在為止還挺好。
現在,我需要更改目標 IP。我嘗試通過以下方式完成此操作:
iptables -t nat -A PREROUTING -p udp -d 127.0.0.2 --dport 53 -j DNAT --to 8.8.8.8
我使用 tcpdump 監控到 8.8.8.8 的傳出流量。沒有。我想知道:也許我需要更改源 IP 地址,以便核心不會丟棄此數據包,因為它到達 127.0.0.2,但源 IP 設置為我的外部 DNS 客戶端的 IP。為什麼不?
iptables -t nat -A POSTROUTING -p udp -d 127.0.0.2 --dport 53 -j SNAT --to DNS_SERVERS_PUBLIC_IP
儘管如此, tcpdump 什麼也沒顯示。
我有 IP 轉發:
$ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
我幾乎沒有想法,希望能提供任何幫助。謝謝你。
有了 iptables,沒有什麼是不可能的。
# iptables -t nat -L -v --line-numbers -n Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 5 281 MARK udp -- docker0 * 0.0.0.0/0 172.17.0.1 udp dpt:53 MARK set 0xc0fe 2 5 281 TEE udp -- docker0 * 0.0.0.0/0 172.17.0.1 udp dpt:53 TEE gw:127.1.2.3 3 3 167 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xc0fe to:1.1.1.1:53
我正在用 docker 進行測試,因為它的界面更容易玩。請注意,我將這些規則放在 nat 預路由表中的任何其他規則之前。
您所做的是,標記您感興趣的數據包,然後 TEE(複製)該數據包,現在您可以將該數據包 DNAT 到 1.1.1.1。
標記它們,在這裡你應該使用你的 eth0 或 eno1,而不是 docker0。
iptables -t nat -I PREROUTING 1 -i docker0 -p udp -d 172.17.0.1 --dport 53 -j MARK --set-mark 0xc0fe
複製/發球,到本地主機,規則可以是這樣的
iptables -t nat -I PREROUTING 2 -i docker0 -p udp --dst 172.17.0.1 --dport 53 -j TEE --gateway 127.1.2.3
但也可以這樣 iptables -t nat -I PREROUTING 3 -p udp -m mark –mark 0xc0fe -j TEE –gateway 127.1.2.3
最後
iptables -t nat -I PREROUTING 3 -p udp -m mark --mark 0xc0fe -j DNAT --to-destination 1.1.1.1:53
所以你走在正確的道路上,除了在 mangle 表中使用 TEE,這裡我在 nat 表上同時使用 TEE 和 DNAT,除了更容易調試和處理規則更改之外,不需要 MARK。您還犯的另一個錯誤是讓 DNAT 規則在您認為 TEE 應該去的 dst 上起作用,但 TEE 和 DNAT 應該在相同的條件下起作用。但我會在這裡留下標記規則,只是為了和貨物崇拜者一起玩。
簡而言之:
iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dst 172.17.0.1 --dport 53 -j TEE --gateway 127.3.3.3 iptables -t nat -I PREROUTING 2 -i eth0 -p udp --dst 172.17.0.1 --dport 53 -j DNAT --to-destination 1.1.1.1:53