我正在尝试利用它cgroups
强制某些应用程序绕过我的 VPN。虽然它在大多数情况下都能正常工作,但我在 DNS 查询方面遇到了一些问题。
VPN只配置filter
表:
*filter
:INPUT ACCEPT [7374:4303108]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6573:2344795]
:xvpn - [0:0]
:xvpn_dns - [0:0]
:xvpn_dns_iface_exceptions - [0:0]
:xvpn_dns_ip_exceptions - [0:0]
:xvpn_ks - [0:0]
:xvpn_ks_iface_exceptions - [0:0]
:xvpn_ks_ip_exceptions - [0:0]
-A OUTPUT -j xvpn
-A xvpn -j xvpn_dns
-A xvpn -j xvpn_ks
-A xvpn_dns -j xvpn_dns_iface_exceptions
-A xvpn_dns -j xvpn_dns_ip_exceptions
-A xvpn_dns ! -o lo -p udp -m udp --dport 53 -j DROP
-A xvpn_dns_ip_exceptions -d 10.63.0.1/32 -p udp -m udp --dport 53 -j ACCEPT
-A xvpn_ks -j xvpn_ks_iface_exceptions
-A xvpn_ks -j xvpn_ks_ip_exceptions
以我有限的理解,我认为它应该允许对lo
和进行查询10.63.0.1
。VPN 还配置了/etc/resolv.conf
。我已经dnsmasq
在本地运行,并希望非 VPN 流量使用它。
我正在设置我cgroup
的:
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 \
-j MARK --set-mark 11
iptables -t nat -A OUTPUT -m cgroup --cgroup 0x00110011 -p udp --dport 53 \
-j DNAT --to-destination 127.0.0.1:53
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o enp6s0 \
-j MASQUERADE
ip rule add fwmark 11 table novpn
ip route add default via 192.168.2.1 table novpn
来自 cgroup 的 DNS 查询无法解析。但是,如果我修改过滤表以接受,它就会起作用。
iptables -t filter -I OUTPUT -m cgroup --cgroup 0x00110011 -j ACCEPT
我猜,但可能错了,即使数据包的目标 IP 已从10.63.0.1
(来自 /etc/resolv.conf)更改为127.0.0.1
,它仍然使用 的目标接口而enp6s0
不是lo
。我不知道如何确认这一点。
我希望能够连接/断开我的 VPN,每次都会覆盖过滤表,而不会影响 cgroup 流量。我该怎么做?有没有办法lo
在进入过滤表之前设置要使用的 DNS 查询?