iptables - 如何使用多个预路由源强制 DNS 流量通过特定 IP?

iptables - 如何使用多个预路由源强制 DNS 流量通过特定 IP?

我知道这个问题在历史上已经被问过,但是我至今尚未找到的答案对于这一小众用例来说并不是太有帮助。

我目前有一个在 192.168.0.1 上运行 DD-WRT 的路由器,一个连接到前一个路由器的 IP 为 192.168.0.2 并作为 VPN 客户端运行的路由器,以及一个设置为在 192.168.0.21 上运行 https://pi-hole.net DNS 过滤的 Raspberry Pi。

最终,我的目标是阻止网络上从任何设备到任何 DNS 服务器的所有 DNS 请求(我的第二个路由器和我的 pihole 除外),并且只允许这两个设备发出 DNS 请求。


在我的路由器上,我当前的防火墙(iptables)规则如下:

#####Keep network on pi-hole
iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp --source ! 192.168.0.2,192.168.0.21 --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
iptables --table nat --insert PREROUTING --in-interface br0 --protocol udp --source ! 192.168.0.2,192.168.0.21 --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
#####Punch DNS hole for pi-hole
iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp --source 192.168.0.2,192.168.0.21 --destination-port 53 --jump ACCEPT
iptables --table nat --insert PREROUTING --in-interface br0 --protocol udp --source 192.168.0.2,192.168.0.21 --destination-port 53 --jump ACCEPT

现在,我以为一切都进展顺利。然而,我从来没有真正进去过,尝试过测试规则。尝试执行命令后,我发现规则 3 和 4 运行正常。但是,规则 1 和 2 不正常:

root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp  --source ! 192.168.0.2,192.168.0.21 --destination-port 53 --jump ACCEPT
Bad argument `192.168.0.2,192.168.0.21'

一些研究这让我想到也许应该!在 之前--source,所以我尝试了一下,这可能有效,但我的 iptables 版本不允许多个源 IP 地址:

root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp ! --source 192.168.0.2,192.168.0.21 --destination-port 53 --jump ACCEPT
iptables v1.8.5 (legacy): ! not allowed with multiple source or destination IP addresses

更多的研究导致我尝试使用 ipset 来解决问题:

root@ddwrt:~# ipset -N piholeAndVpnPassthrough iphash
root@ddwrt:~# ipset -A piholeAndVpnPassthrough 192.168.0.2
root@ddwrt:~# ipset -A piholeAndVpnPassthrough 192.168.0.21

这部分进展顺利。但是,由于我从未使用过 ipset,因此无论我尝试什么方法,都无法让它工作:

root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp ! --source --match-set "piholeAndVpnPasshthrough" --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
Bad argument `piholeAndVpnPasshthrough'
Try `iptables -h' or 'iptables --help' for more information.
root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp ! --source -m set --match-set piholeAndVpnPasshthrough --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
Bad argument `set'
Try `iptables -h' or 'iptables --help' for more information.
root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp -m set --match-set piholeAndVpnPasshthrough ! --source --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
iptables v1.8.5 (legacy): --match-set requires two args.
Try `iptables -h' or 'iptables --help' for more information.
root@ddwrt:~# iptables --table nat --insert PREROUTING --in-interface br0 --protocol tcp -m set --match-set piholeAndVpnPasshthrough src ! --source --destination-port 53 --jump DNAT --to-destination 192.168.0.21:53
iptables v1.8.5 (legacy): Set piholeAndVpnPasshthrough doesn't exist.

因此,我不知道如何实现这一点。如何在 iptables 中使用两个否定源地址?

相关内容