经过长时间的挖掘和多次尝试,我仍然无法弄清楚如何让给定端口上的流量不通过 openvpn 隧道。下面是我的设置:
(enp0s25)<ovpn server>(tun0) <--> (tun0)<ovpn client>(enp2s0) <--> app connecting on port 10011
ovpn 服务器配置为将路由设置推送到客户端,push "redirect-gateway def1 bypass-dhcp"
以便所有流量都通过隧道重定向,这正是我想要的并且工作正常,除了我希望 tcp 端口 10011 不通过隧道...
内核路由表main为<ovpn client>
:
0.0.0.0/1 via 192.168.88.9 dev tun0
default via 192.168.0.1 dev enp2s0
128.0.0.0/1 via 192.168.88.9 dev tun0 # not sure why it's there..
192.168.0.0/24 dev enp2s0 proto kernel scope link src 192.168.0.29
192.168.88.0/24 via 192.168.88.9 dev tun0
192.168.88.9 dev tun0 proto kernel scope link src 192.168.88.10
这是我最近的尝试<ovpn client>
:
定义openvpn路由表
default via 192.168.0.1 dev enp2s0 192.168.0.0/24 dev enp2s0 proto kernel scope link src 192.168.0.29
定义规则
1000: from all fwmark 0x64 lookup openvpn
定义以下 iptables mangle 规则:
-A OUTPUT -p tcp -m tcp --sport 10011 -j MARK --set-xmark 0x64/0xffffffff -A OUTPUT -p tcp -m tcp --sport 10011 -j LOG --log-prefix "(OUTPUT) fwmark 100: "
这个想法(这可能很糟糕)是由于路由表条目而使<ovpn client> --> app connecting on port 10011
通信不通过隧道来回传输0.0.0.0/1 via 192.168.88.9 dev tun0
,而是使用路由表 openvpn,这是一个非常基本的“本地网络”路由表。
我使用 mangle OUTPUT 因为它是在进程在端口 10011 上发送数据之后、POSTROUTING 之前出现的,所以我认为它是正确的使用链。
当启动 openvpn<ovpn client>
并尝试连接端口 10011 时,我看不到 LOG iptables 规则生成的任何系统日志,而当 openvpn 停止时,我可以看到日志,一切正常。
也许应用程序的传出流量的源 IP 是 tun0 接口之一,因此路由在某处被破坏。