Linux 中的 VPN 路由问题-如何使只能绑定到 IP 地址的应用程序工作?

Linux 中的 VPN 路由问题-如何使只能绑定到 IP 地址的应用程序工作?

目前,我在远程 ubuntu VPS 上设置了 PPTP VPN。我希望某些应用程序使用 VPN 访问互联网(rtorrent、irssi 等)。目前,它的设置如下:

eth0 链路封装:以太网 HWaddr 00:16:3e:94:38:ce inet addr:66.xxx.xxx.xxx Bcast:66.xxx.xxx.xxx 掩码:255.255.255.0

eth1 链路封装:以太网 HWaddr 00:16:3e:d7:58:a1 inet addr:10.2.0.111 Bcast:10.255.255.255 掩码:255.0.0.0

lo 链路封装:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0

ppp0 链路封装:点对点协议 inet addr:192.168.10.244 PtP:192.168.9.1 掩码:255.255.255.255

本质上,我所看到的这个问题的表现方式是这样的。

当我跑步时

curl --interface eth0 checkip.dyndns.com

我明白了

<html><head><title>Current IP Check</title></head><body>Current IP Address: 66.xxx.xxx.xxx</body></html>

当我跑步的时候

curl --interface ppp0 checkip.dyndns.com

我明白了

<html><head><title>Current IP Check</title></head><body>Current IP Address: 95.xxx.xxx.xxx</body></html>

哪个是对的。

然而,当我跑步时

curl --interface 192.168.10.244 checkip.dyndns.com

它超时了,我什么也没得到。这似乎没有任何意义,因为 192.168.10.244 是 ppp0 的 IP 地址,而且在我看来它应该与上面的命令没有什么不同。我遗漏了什么吗?如果我能让它在 curl 中工作,我也能够让它在 rtorrent 和 irssi 中工作,就像我希望的那样,curl 更容易测试这种事情。有没有好的起点来解决这个问题?

编辑:已修复!以下是我修复的方法。

首先我创建了一个新的路由表:

# echo "200 vpn" >> /etc/iproute2/rt_tables

然后,我创建了一条规则,要求来自我的 ppp0 IP 地址的请求从该新表中查找

# ip rule add from 192.168.10.244 table 200

然后,我在该表中创建了一条规则以使用 ppp0。

# ip route add default dev ppp0 table 200

一切运行正常!现在,当我尝试之前失败的 curl 命令时:

# curl --interface 192.168.10.244 checkip.dyndns.com
<html><head><title>Current IP Check</title></head><body>Current IP Address: 95.xxx.xxx.xxx</body></html>

答案1

您的推理不正确。绑定到 IP 地址只会选择源 IP 地址。它对到达目的地的路由没有影响,而这正是您想要控制的。

要执行您想要的操作,您需要设置一种称为基于源的路由的策略路由形式。这通常是通过创建两个路由表(每个连接一个)并根据本地源 IP 地址决定要使用的路由表来完成的。请参阅许多如何儿子策略路由

相关内容