如何将应用程序路由到 VPN/默认路由之外?

如何将应用程序路由到 VPN/默认路由之外?

我有一台 Linux 机器,它始终连接到 VPN(vpn0 接口),默认路由通过 vpn0 接口。与我的路由器的连接是通过 wlan0 接口完成的。

我确实喜欢它通过 VPN 路由所有内容,并且有理由保留此配置。但由于 VPN 速度很慢,我希望能够使用不同的默认路由启动一些特定应用程序:直接通过 wlan0 而不是 vpn0。例如,我不希望我的apt-get update或运行 web-radio-streaming 的浏览器通过 VPN。

我为此在 Google 上搜索了很多次,但并没有发现任何人遇到同样的问题。我发现的一个解决方案需要我使用 eth0:我将 eth0 连接到网络,创建一个新的网络命名空间,然后将 eth0 移动到这个新的命名空间并正常使用它。然后我可以使用 在其上启动应用程序ip netns exec nsname command。这个解决方案的最大问题是它要求我通过 eth0 和 wlan0 进行连接,而我正在寻找一种仅使用 wlan0 的解决方案 - 因为现在很多机器甚至没有以太网。

似乎要走的路是:创建一个新的网络命名空间,创建一个虚拟以太网对(veth0 和 veth1),将 veth1 移动到新的命名空间,然后做一些魔法从其他网络命名空间路由内容以使用 wlan0 而不是 vpn0 作为网关。

由于 veth1 在新的 NS 上,而 veth0 在默认 NS 上,并且两者都已连接,我想我们可能想找到一种方法来重定向 veth0 流量以使用与标准不同的路由(或路由表?)。似乎我可以使用“基于策略的路由”,但到目前为止,我的所有尝试都失败了。此外,由于 wlan0 不允许使用与 eth0 相同的酷炫功能(例如连接到网桥),因此该解决方案可能涉及某种 nat/伪装。

有人能给我一些启发吗?也许是下面脚本的补丁?

注意:wlan0 接口的 IP 为 192.168.1.3,无线路由器的 IP 为 192.168.1.1。另外,VPN 内的应用程序需要使用http_proxy和朋友,但是当我不在 VPN 上时,我不需要这个。

我尝试过很多不同的方法,但这是我尝试过的大多数命令的列表:

echo 1 > /proc/sys/net/ipv4/ip_forward

# Create the novpn namespace, the virtual interfaces and configure them
ip netns add novpn
ip link add name veth0 type veth peer name veth1
ip link set veth1 netns novpn
ifconfig veth0 192.168.1.100/24 up
ip netns exec novpn ifconfig veth1 192.168.1.101/24 up

# Route stuff from veth0 to wlan0 using NAT. I don't know if this is
# really what I want because it uses the default routing tables
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i veth0 -j ACCEPT

# Do some magic to configure the routing tables on the new NS
ip netns exec novpn ip route add default via ?.?.?.? dev veth1

# Maybe try to route some stuff with a new routing table called novpn:
ip rule add iif veth0 lookup novpn
ip route add default dev wlan0 table novpn
ip route ???
ip route flush cache

我还被告知也许我可以使用仅通过 VPN 路由“内部”流量的设置,但我并不真正想要这个。

答案1

事实上它比这更容易。

您需要做的是设置策略路由,以便您有两个不同的路由表,以及一条告诉您的电脑何时使用其中一个路由表的规则。

您启动 vpn,我们假设您有一个 tap0/tun0 接口,其 IP 地址为 10.0.0.71,以及一个 wlan0 接口,其地址为 192.168.0.5。

我们现在需要设置策略路由:

 echo 201 novpn >> /etc/iproute2/rt_tables
 ip route add 192.168.0.0/24 dev wlan0 src 192.168.0.5 table novpn
 ip route add default via 192.168.0.1 table novpn
 ip rule add from 192.168.0.5 table novpn
 ip rule add from 10.0.0.71 table main

现在您已经完成了。您必须绑定特定应用程序可以绑定到任一接口,具体取决于您是否希望使用 VPN。将应用程序绑定到接口通常很容易,但出了名的粘性 Firefox 除外,您可能希望阅读此网页

请记住,您只能使用一组 DNS 服务器,如 /etc/resolv.conf 中指定的那样。您应确保至少其中一个服务器可供任一接口访问:如果 VPN 指定它们都位于远程 LAN 内,则第二个非 VPN 接口的名称解析将不起作用。

相关内容