iptables 重定向 DNS 查找 IP 和埠
我發現我的 ISP (verizon) 正在攔截埠 53 上的所有 DNS 流量。
使用 iptables,我想將所有 DNS 查找流量重定向到特定的 IP 和埠(5353)。我的電腦在埠 53 上連接到另一台電腦的任何嘗試都應重定向到 23.226.230.72:5353。
為了驗證我嘗試使用的 DNS 伺服器和埠,我執行了這個命令。
~$ dig +short serverfault.com @23.226.230.72 -p5353 198.252.206.16
這是我嘗試使用的 iptables 規則。
iptables -t nat -A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 23.226.230.72:5353
添加該規則後,未找到所有 DNS 查找。網站 ping 返回
unknown host
。網頁顯示“未找到伺服器”。~$ mtr serverfault.com Failed to resolve host: Name or service not known
我希望從 23.226.230.72:5353 中提取我的 DNS 查找。如何使 iptables 規則起作用?
編輯
我的 ISP 攔截 DNS(埠 53)的展示。通過埠 5353 跟踪從 dig 到 23.226.230.72 的輸出,然後是埠 53。
~$ dig +trace stackexchange.com @23.226.230.72 -p5353 ; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p5353 ;; global options: +cmd . 86395 IN NS ns7.opennic.glue. . 86395 IN NS ns4.opennic.glue. . 86395 IN NS ns3.opennic.glue. . 86395 IN NS ns5.opennic.glue. . 86395 IN NS ns2.opennic.glue. . 86395 IN NS ns10.opennic.glue. . 86395 IN NS ns1.opennic.glue. . 86395 IN NS ns6.opennic.glue. . 86395 IN NS ns8.opennic.glue. dig: couldn't get address for 'ns8.opennic.glue': no more ~$ dig +trace stackexchange.com @23.226.230.72 -p53 ; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p53 ;; global options: +cmd . 7440 IN NS f.root-servers.net. . 7440 IN NS d.root-servers.net. . 7440 IN NS j.root-servers.net. . 7440 IN NS i.root-servers.net. . 7440 IN NS g.root-servers.net. . 7440 IN NS k.root-servers.net. . 7440 IN NS a.root-servers.net. . 7440 IN NS h.root-servers.net. . 7440 IN NS e.root-servers.net. . 7440 IN NS m.root-servers.net. . 7440 IN NS c.root-servers.net. . 7440 IN NS b.root-servers.net. . 7440 IN NS l.root-servers.net. ;; Received 239 bytes from 23.226.230.72#53(23.226.230.72) in 2948 ms stackexchange.com. 215 IN A 198.252.206.16 ;; Received 62 bytes from 192.228.79.201#53(b.root-servers.net) in 116 ms
我目前的iptables。
iptables-save
~# iptables-save # Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014 *mangle :PREROUTING ACCEPT [79950528:41742899703] :INPUT ACCEPT [78748282:41360159554] :FORWARD ACCEPT [13:5427] :OUTPUT ACCEPT [85455483:57472640071] :POSTROUTING ACCEPT [85480442:57475512901] -A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill COMMIT # Completed on Tue Jul 15 23:06:52 2014 # Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014 *nat :PREROUTING ACCEPT [71:18713] :INPUT ACCEPT [7:474] :OUTPUT ACCEPT [109:7855] :POSTROUTING ACCEPT [109:7855] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE COMMIT # Completed on Tue Jul 15 23:06:52 2014 # Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014 *filter :INPUT ACCEPT [78748139:41360144354] :FORWARD ACCEPT [13:5427] :OUTPUT ACCEPT [85454926:57472600172] :fail2ban-ssh - [0:0] :fail2ban-vsftpd - [0:0] -A INPUT -p tcp -m multiport --dports 21,20,990,989 -j fail2ban-vsftpd -A INPUT -p tcp -m multiport --dports 22,6622 -j fail2ban-ssh -A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A FORWARD -o lxcbr0 -j ACCEPT -A FORWARD -i lxcbr0 -j ACCEPT -A fail2ban-ssh -j RETURN -A fail2ban-vsftpd -j RETURN COMMIT
以 root (sudo) 身份執行所有這些指令。
編輯此文件。
/etc/NetworkManager/NetworkManager.conf
通過註釋掉該行禁用 DnsMasq
dns=dnsmasq
。#
在行前放一個#dns=dnsmasq
重新啟動您的網路。
service network-manager restart
添加這些 iptable 規則。
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353 iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353
看起來您真正想要的是控制您的 DNS 查詢所發生的事情。
我不確定使用 iptables 是否是我的首選解決方案。
您是否考慮過設置一個本地 DNS 伺服器,它只是將您的請求轉發到您想要的主機和埠?一個範例:使用 bind9 轉發器選項,您可以將埠添加到轉發器。
這樣的設置更容易維護和排除故障,並且可能更加靈活。考慮記憶體的優勢,或者只考慮外部 DNS 伺服器關閉的情況。您的 DNS 配置中可以有多個轉發器,但 iptables 規則中只有一個 IP…。
在 digital ocean 的教程中有一個很好的關於 bind9 設置的概述。只需將埠添加到轉發器,您就應該一切就緒。
Bind9 根本不消耗太多資源並且易於配置(或者至少:比 iptables 更容易:-))