![带有 IP 例外的 DNS/透明代理的 iptables 规则](https://linux22.com/image/560136/%E5%B8%A6%E6%9C%89%20IP%20%E4%BE%8B%E5%A4%96%E7%9A%84%20DNS%2F%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99.png)
我正在运行一个带 dd-wrt 的路由器(如果重要的话,是 Netgear WNDR3700)。对于内容过滤,我使用 OpenDNS。我想确保用户无法通过输入自己的名称服务器来绕过 OpenDNS,所以我制定了一条规则来捕获所有 DNS 流量。
iptables -t nat -A PREROUTING -i br0 -p all --dport 53 -j DNAT --to $LAN_IP
我确实有一台网络上的计算机,我想允许它通过 OpenDNS 过滤器。在那台机器上,我手动设置了名称服务器,并创建了另一条规则以允许它通过
iptables -t nat -I PREROUTING -i br0 -s 192.168.1.2 -j ACCEPT
效果很好。
今天,我在路由器上安装了透明代理(squid),并添加了这些规则:
iptables -t nat -A PREROUTING -i br0 -s $LAN_NET -d $LAN_NET -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i br0 -s ! $PROXY_IP -p tcp --dport 80 -j DNAT --to $PROXY_IP:$PROXY_PORT
iptables -t nat -I POSTROUTING -o br0 -s $LAN_NET -d $PROXY_IP -p tcp -j SNAT --to $LAN_IP
iptables -I FORWARD -i br0 -o br0 -s $LAN_NET -d $PROXY_IP -p tcp --dport $PROXY_PORT -j ACCEPT
这也有效,但是 192.168.1.2 地址不会通过 squid 路由。我怎样才能让 192.168.1.2(以及将来可能的其他地址)绕过端口 53 规则,但不绕过端口 80 规则?
答案1
只需更新此规则以使其更加具体并且仅适用于 DNS。
remove - iptables -t nat -I PREROUTING -i br0 -s 192.168.1.2 -j ACCEPT
add - iptables -t nat -I PREROUTING -i br0 -s 192.168.1.2 -p all --dport 53 -j ACCEPT