我正在尝试运行 VPN。我希望程序明确请求接口,而不是路由所有流量,就像 一样curl --interface
。
curl --interface ppp0 ip.bsd-unix.net
应该通过VPN发送,但不知何故,使用tcpdump
或iftop
,我可以看到流量通过 eth0,即使源 IP 是 10.10.1.2。这是我的ip route show
:
default via 149.x.y.z dev eth0
10.10.1.1 dev ppp0 proto kernel scope link src 10.10.1.2
149.x.y.128/25 dev eth0 proto kernel scope link src 149.x.y.172
一些 IP 被隐藏了。第二个 IP 是 xl2tp 在启动时添加的,并创建了 ppp0 接口。149.etc 是我的 LAN,10.etc 是我的 VPN。
另外,当我 时ping -I ppp0 8.8.8.8
,我可以看到 ppp0 活动,并且我收到了更高 ms 的回复,这表明他们正在通过 VPN。
答案1
我假设如果数据包的源 IP 与接口的源 IP 匹配,数据包就会使用该接口。如果这不是固有的 IP 行为,那么我的第二条路由就会实现这一点:src
路由的这一部分对我来说只是个幌子。
那么,我的程序绑定到 ppp0 地址,该地址设置了它们的源 IP,对吗?我按照 @davidgo 所说的做了,并创建了一个单独的路由表...
echo 200 custom | sudo tee -a /etc/iproute2/rt_tables
...然后添加一条规则,对具有该源 IP 的数据包使用自定义表...
sudo ip rule add from 10.10.1.2 lookup custom
...并在自定义表中添加了一条规则,以使用 ppp0 来处理其获得的任何通过 ppp0 网关的流量。
sudo ip route add default via 10.10.1.1 dev ppp0 table custom
curl ip.bsd-unix.net
给我我的家庭 IP 以及curl --interface ppp0 ip.bsd-unix.net
我的 VPN 的远程 IP。它起作用了!
不过,我感兴趣的是为什么 ping 始终能正确地通过 ppp0。