Linux 路由和 HMA

Linux 路由和 HMA

我的设置如下:我可以通过 ssh 访问远程机器,该机器运行 Ubuntu Server 版的最新版本,并且我必须“通过”HideMyAss VPN 在其上运行软件(因为在运行软件时必须欺骗该机器的 IP)。但我当然希望能够通过其“原始”IP 访问该机器。

我的问题是,一旦我在远程机器上启动 hma-start 脚本(基本上从他们的服务器获取配置文件,并使用它运行 openvpn),我就会断开连接并且无法再连接到它。

这个问题能解决吗?如果能,如何解决?谢谢!

答案1

如果您只希望特定软件使用 VPN 连接,那么您可以使用网络命名空间。

基本上,该命令ip netns add vpn将为网络设备、路由表、防火墙规则等创建另一个命名空间,因此就像运行两个网络堆栈一样。

一个网络设备只能位于一个命名空间中,因此您需要一个虚拟设备,充当两个命名空间之间的桥梁。

这正是虚拟网络接口的用途:

ip link add veth0 type veth peer name veth1

进入 veth0 的所有内容都会从 veth1 中流出,依此类推。现在你只需要将其中一个虚拟接口移动到另一个网络命名空间:

ip link set veth0 netns vpn

现在您有与此网络拓扑类似的情况:

                   .----------.              .------.
[intertubes] ------|   Host   |--------------|  vpn |
               eth0`----------`veth1    veth0`------`

您可以应用任何您想要的方法来共享互联网连接。无论是伪装(如果 VPN 支持穿越 NAT)、路由/桥接(您将需要另一个 IP 地址或严肃的配置)还是任何您喜欢的方法。

当您想要“访问”时vpn,运行ip netns exec vpn bash,您将进入vpn命名空间。您将看到此命名空间仅具有veth0网络接口,以及lo您可能想要使用配置的未配置接口ip addr add 127.0.0.1/8 dev lo && ip link set lo up。现在只需配置您的veth0接口,以便您可以连接到互联网,然后启动您的 VPN,以便它可以重新配置网络以通过 VPN。您将看到主命名空间不会使用 VPN,而命名vpn空间会使用。

答案2

连接中断是因为 VPN 会更改默认路由,因此所有内容都会进入 VPN。您可以更改该路由表,但要正确更改可能很棘手,尤其是如果出现问题而失去 ssh 访问权限时。

一个简单的解决方案是通过设置路由告诉你的服务器通过 eth0 到达你自己的 IP 地址:

    ip route add your_ip_address via the_server's_gateway

并希望VPN脚本不会触碰它。

如果您还想允许其他主机访问服务器的原始地址,也就是说,如果您还希望您的服务器同时回答他的原始 IP 地址和 VPN 的 IP 地址,那么您将需要改变 VPN 更改路由的方式,或者至少知道它如何更改它们以解决它所做的事情。

基本上,您需要的是策略路由。您将有两个路由表:一个将使用 VPN,另一个将不使用 VPN。

如果 VPN 脚本只会修改main表,那么您可以添加另一个路由表用于原始 IP 地址。

因此基本上,在启动 VPN 之前,您将main的内容复制到另一个表中,例如table 2(此处 2 是任意数字,请参阅 /etc/iproute2/rt_tables 定义名称别名):

ip route add (network)/(prefixlen) dev eth0 src (address) table 2
ip route add default via (gateway) dev eth0 src (address) table 2

现在,如果您的服务器通过其原始 IP 地址从接口访问,则添加一条规则以使用该表eth0

ip rule add to (address) iif eth0 table 2

然后启动您的 VPN 脚本。

理论上,您应该ip rule add在将默认路由添加到第二个表之前运行,因为否则,内核将拒绝该规则,并说它无法路由到网关。但在您的情况下,它可以正常工作,因为main已经可以路由到网关。

相关内容