简而言之:我想知道是否可以路由(使用 iptables),因此所有往返于 192.168.1.10(eth0)端口 40000 的通信都会发送到 tun0?(VPN)
更长:当我连接到我的 VPN 服务器时,所有数据都通过 tun0 网络路由,但这个应用程序除外(它哪儿也不去),它完全拒绝理解(糟糕的编程)。这导致应用程序无法逃脱,而是与系统发生冲突。
是否可以通过将所有发往 192.168.1.10:40000 的数据路由到 tun0(VPN 网络接口),并将所有来自 tun0:40000 的传入数据路由回 192.168.1.10 来强制执行此操作
更新:这是 IP -4 路由的结果:
*0.0.0.0/1 via 10.128.0.1 dev tun0
default via 192.168.1.1 dev enp0s3 proto dhcp metric 20100
10.128.0.0/22 dev tun0 proto kernel scope link src 10.128.2.129
128.0.0.0/1 via 10.128.0.1 dev tun0
169.254.0.0/16 dev tun0 scope link metric 1000
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.173 metric 100
217.64.xxx.xx via 192.168.1.1 dev enp0s3*
答案1
当我连接到我的 VPN 服务器时,所有数据都通过 tun0 网络路由,但这个应用程序除外,它完全拒绝理解(糟糕的编程)。
网络编程具有分层模型,这意味着应用程序的作者只需告诉系统连接到某个端口上的某个 IP 地址,他不必担心其余的事情,因为如何到达该 TCP/IP 套接字取决于操作系统。
您的问题是由错误的路由配置引起的。我们来看几行这样的代码:
1.2.3.0/29 dev tun0
1.2.0.0/22 dev tun0 via 1.2.3.4
第一行表示:如果目标地址最左边的 29 位与 相同1.2.3.0
(即从1.2.3.0
到1.2.3.7
),则直接将数据包发送到tun0
。第二行表示从1.2.0.0
到1.2.3.255
,如果行中没有的地址,/29
则必须发送到1.2.3.4
。内核知道如何1.2.3.4
从第一行找到。
Windows 路由表几乎相同(它们最初采用来自 BSD 的 TCP/IP 堆栈)。
现在来看看你的情况。你有两个路由条目:
0.0.0.0/1 via 10.128.0.1 dev tun0
default via 192.168.1.1 dev enp0s3
其中default
是 (所有地址) 的快捷方式0.0.0.0/0
。因此:如果目标地址以 开头0
,128
则通过 发送tun0
,否则通过 发送enp0s3
。
如果您希望通过 路由几乎所有流量tun0
,请首先找到 VPN 隧道的另一个端点的地址(可能ip link
有帮助,但您没有说明您在隧道中使用什么)。假设它是5.5.5.5
。tun0
是一个虚拟接口,它加密通过它发送的数据包并通过物理接口将它们发送到另一个端点。所以我们需要添加一条路由,以便数据包5.5.5.5
通过 发送enp0s3
:
ip route add 5.5.5.5 via 192.168.1.1 dev enp0s3
(编辑:再次阅读您的路由表后,它实际上已经存在,在最后一行)
然后你可以通过以下方式路由剩余的流量tun0
:
ip route del default
ip route add default via 10.128.0.1 dev tun0
根据您设置接口(和隧道)的方式,当接口启动时,您可以自动执行这些操作。
总结无论放置在哪里,只要0.0.0.0/1
用替换 即可。default