将 DNS 重定向到 cgroup 中的 localhost

将 DNS 重定向到 cgroup 中的 localhost

我正在尝试利用它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 查询?

相关内容