简短:我想知道是否可以路由(使用 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*
网络编程有一个分层模型,这意味着应用程序的作者只是告诉系统连接到某个端口上的某个 IP 地址,他不必担心其他的,因为如何到达那个 TCP/IP 套接字是直到操作系统。
您的问题是由错误的路由配置引起的。让我们采取这样的几行:
第一种意思是:如果目的地址的最左29位与
1.2.3.0
(即from1.2.3.0
to1.2.3.7
)相同,则直接在上发送数据包tun0
。第二行表示必须将不在该行中的来自1.2.0.0
to的地址发送到。内核知道如何从第一行查找。1.2.3.255
/29
1.2.3.4
1.2.3.4
Windows 路由表几乎相同(它们最初从 BSD 获取 TCP/IP 堆栈)。
现在到你的情况。您有两个路由条目:
where
default
是0.0.0.0/0
(所有地址)的快捷方式。所以:如果目标地址以0
up开头128
,则通过 发送tun0
,否则通过 发送enp0s3
。如果您想通过 路由几乎所有流量
tun0
,请首先找到 VPN 隧道的另一个端点的地址(可能ip link
会有所帮助,但您没有说明您的隧道使用什么)。假设它是5.5.5.5
。tun0
是一个虚拟接口,它对通过它发送的数据包进行加密,并通过物理接口将它们发送到另一个端点。所以我们需要添加一个路由,以便5.5.5.5
通过以下方式发送数据包enp0s3
:(编辑:再次阅读您的路由表后,这实际上已经存在,在最后一行)
然后您可以通过以下方式路由剩余流量
tun0
:根据您设置接口(和隧道)的方式,您可以在接口启动时自动执行这些操作。
TL;DR只要用 替换
0.0.0.0/1
,default
无论你放在哪里。