我的设置如下:我可以通过 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
已经可以路由到网关。