Linux

如何複製傳入的 DNS 數據包並使用 iptables 將它們發送到不同的名稱伺服器?

  • February 21, 2022

編輯: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

引用自:https://serverfault.com/questions/934451