iptables 重定向 DNS 查找 IP 和端口

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

答案1

以 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

答案2

尝试这个:

首先您必须启用转发选项

/etc/sysctl.conf

设置为 1 的值

net.ipv4.ip_forward = 1

启用更改

sysctl -p 

保存并运行以下命令:

iptables -t nat -A PREROUTING -p tcp --sport 53 -j DNAT --to-destination 23.226.230.72:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

如果您可以在 PREROUTING 中指定输入接口 (-i eth1) 或/和在 POSTROUTING 中指定输出接口 (-o eth0) 可能会很有用。

注意:MASQUARADE 行是必需的,同时它会使用主 IP 屏蔽目标 IP。

答案3

看起来您真正想要的是控制 DNS 查询发生的情况。

我不确定使用 iptables 是否是我的首选解决方案。

您是否考虑过建立一个本地 DNS 服务器,将您的请求转发到您想要的主机和端口?一个例子:使用bind9转发器选项,您可以将端口添加到转发器。

这样的设置更容易维护和排除故障,并且可能更加灵活。考虑缓存的优势,或者只考虑外部 DNS 服务器出现故障的情况。您的 DNS 配置中可以有多个转发器,但 iptables 规则中只能有一个 IP...。

对bind9的设置有很好的概述在数字海洋的教程中。只需将端口添加到转发器即可。

Bind9 根本不消耗太多资源并且易于配置(或者至少:比 iptables 更容易:-))

答案4

iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A PREROUTING -p udp  --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

相关内容