我已将Wireguard 的 killswitch 示例添加到! -d 192.168.0.0/16
其中(参见示例):! -d fc00::/7
man wg-quick
PostUp = iptables -I OUTPUT ! -d 192.168.0.0/16 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = ip6tables -I OUTPUT ! -d fc00::/7 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
这样,我就可以在 VPN 运行时访问 192.168.XX 网络上的其他主机。但是,它似乎阻止了对诸如 之类的域的 DNS 查找myhost.local
。我之所以这么说,是因为我可以连接到 VPN 并仍然 ping myhost.local
。运行 VPN 仅几分钟后,ping 就停止工作并报告:ping: myhost.local: Name or service not known
。我猜 DNS 缓存已过期。
我的理解是,由于我没有在 iptables 中指定协议(例如-p udp
),它应该排除全部REJECT 规则中的协议。
我可以在没有 iptables 和 ip6tables 规则的情况下启动 VPN,并且始终能够解决问题myhost.local
。
您认为它仍然会根据其他标准拒绝 UDP DNS 查找吗?我该如何调整规则以允许本地 DNS 查找?
答案1
您不小心将 IP4 和 IP6 命令拆分了 - 在您的示例中,这两行都应该是 PostUp 的一部分,中间有 &&,并且您应该有一个相应的 PreDown 来匹配。例如:
PostUp = iptables -I OUTPUT ! -d 192.168.0.0/16 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -I OUTPUT ! -d fc00::/7 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -d 192.168.0.0/16 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -D OUTPUT ! -d fc00::/7 ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT