以下情况。
我的一个家庭服务器正在运行 OpenVPN 服务器和 OpenSSH 服务器(还有一些其他的东西),均可远程访问。
当我不在家时,我通常通过 VPN 连接到该服务器,并通过该服务器的公共 IP 打开几个 SSH 会话。
我想将我的家庭服务器连接到外部 VPN,这样通过我的服务器的所有(传出)流量也都通过外部 VPN 进行隧道传输。
|MobilePhone|---VPN ----|
|
|Other Dev|-----SSH ----|----VPN---->| Homeserver | --- VPN ---> | External Provider |
| ^
|Laptop|--SSH/NFS/VPN---| |
|
|
|Laptop|--------SSH---------------------|
我仍然希望能够通过其(以前的)公共 IP 通过 SSH 进入我的服务器。我的路由器仍然直接连接到我的 ISP,因此任何传入流量都应直接转发到服务器,所以我认为这应该是可能的。
尽管我很天真,但我认为,如果我通过 tun1(tun0 由服务器使用)将我的服务器连接到外部 VPN,那么它可能会起作用,然后我就可以开始了。外部 VPN 的客户端配置已nobind
设置,因此端口上也不应该有任何冲突。
我仍然可以看到 openvpn 连接的输出。然而不久之后,我的所有连接都断开了。
*我现在既不能连接到我的 VPN,也不能通过 SSH 进入。而且 Apache 也不再可用。我想什么都不会发生
我的路由器仍然响应其公共 IP 地址上的 ping。
我猜连接到 VPN 占用了我服务器的网络接口或类似的东西。所以这应该是路由问题。
但我不确定那里到底发生了什么,也不知道我需要改变什么才能让它发挥作用。
我想了解为什么我尝试的方法不起作用。
为了正确设置这样的场景,我需要了解什么?
笔记:
- 我考虑过返回的包裹。但我想我可以以某种方式设置一条路由,这样来自我的路由器内部 IP 的所有数据包都会被发送回路由器,而不是通过 VPN?
- 就像是
ip route add 192.168.0.0/24 via 192.168.0.1 dev eth1
?
更新
我设法更进一步,将以下几行添加到/etc/network/interfaces
up ip rule add from 192.168.0.0/24 table 128 || true
up ip route add table 128 to 192.168.0.0/24 dev eth0 || true
up ip route add table 128 default via 192.168.178.1 || true
即使服务器连接到外部 VPN,这也使我能够通过其原始公共 IP 访问 apache 并通过 SSH 进入我的服务器。
我想这确实和我所想的差不多,任何来自我的 LAN 或路由器的数据包都会通过 eth0 进行路由,使用我的路由器作为默认网关,而不是外部 VPN 的 tun1 适配器。
到目前为止,一切都很好。
我现在遇到的问题是,当我的笔记本电脑连接到我的家庭服务器上运行的 OpenVPN 服务器时,每次连接都会超时。
我猜这个问题和原来的问题类似。来自我的笔记本电脑的数据包通过 VPN(172.16.0.10)连接,不会被路由回笔记本电脑,因为返回的数据包将通过默认网关发送,也就是我的服务器连接到的外部 VPN。
我摆弄了路由表,试图将来自 172.16.0.0 的任何内容通过 路由回 172.16.0.xx。tun0
最终我搞砸了路由表,现在当我的笔记本电脑连接到我的服务器 VPN 时,任何请求都会超时,无论我的服务器是否连接到外部 VPN。
我刷新了路由表并重新启动了服务器,希望至少能再次解决这个问题。
我不确定我的笔记本电脑连接到我的局域网(192.168.178.xx)是否也是个问题。
答案1
您的问题是,笔记本电脑发送的数据包通过 VPN 链接从家庭服务器发送出去,使用的是其原始源地址(即笔记本电脑tun
接口的地址,最有可能)。这些数据包应该被您的 VPN 提供商丢弃,但即使没有丢弃,回复数据包也无法到达您的笔记本电脑。
解决方案是确保回复数据包也通过你的家庭服务器;为了实现这一点,它们必须看起来像是发送的回复到您的家庭服务器。因此,您需要将离开家庭服务器tun1
接口的数据包上的源地址重写为该接口的 IP,例如使用
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
使用tcpdump -nlvvv -i tun1
它可以检查 iptables 命令对传出流量做了什么。如果您一开始就使用 tcpdump 查看流量,那么您可能马上就会意识到哪里出了问题。:)