我有一个 openvpn 连接,我需要它只为一个应用程序工作,这个应用程序使用一个特定的本地端口。我使用了路由无拉动在我的 openvpn 配置文件上然后:
ip route add default via {P-t-P-IP} dev tun0 table 10;
ip rule add from {tun0-inet addres} table 10;
我尝试使用 curl 进行测试。
curl http://icanhazip.com;
curl --interface tun0 http://icanhazip.com;
第一个给出我的正常 IP,第二个给出 openvpn 连接 IP,所以看起来运行良好。
现在,我在让特定应用使用 tun0 接口时遇到了问题。该应用使用本地端口 1033 发出一些 Web 请求。我尝试了这些 iptables 规则(一次一个),我在谷歌上找到了:
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1033 -j DROP
iptables -A OUTPUT -o tun0 -p tcp -m tcp --sport 1033 -j ACCEPT
iptables -A PREROUTING -p tcp --sport 1033 -i tun0
iptables -A PREROUTING -i tun0 -p tcp -m tcp --sport 1033
iptables -A PREROUTING -i tun0 -t mangle -p tcp --sport 1033 -j MARK --set-mark 1
然后我进行了这个测试:
curl --local-port 1033 http://icanhazip.com
但是我得到的是正常的 eth0 ip,而不是 openvpn 连接 ip。
如果我尝试这些规则(也将 ipv4_forward 设置为 1):
iptables -t nat -A POSTROUTING -p tcp --sport 1033 -j SNAT --to-source 10.10.10.2;
iptables -t nat -A POSTROUTING -p udp --sport 1033 -j SNAT --to-source 10.10.10.2;
10.10.10.2 是我的 tun0 接口 ip(openvpn 使用的),然后 curl 命令超时。
我怎样才能使来自本地端口 1033 的所有流量都通过 tun0 接口?
答案1
您可以使用 Linux 网络命名空间,我认为您可以将 Tun 接口添加到不同的命名空间并在该命名空间中运行您的应用程序。这里有一些例子如何使用它。