航线

航线

我的家庭网络上有一台 Debian PC。我使用动态 DNS 服务,这样我就可以从互联网上的其他地方通过 SSH 连接到 PC。我还在路由器上使用端口转发,因此我将动态地址上的(比如说)2222 映射到 PC 上的 22。

一切都很顺利,直到我在 PC 上运行 openvpn 客户端。然后我无法建立 SSH 连接。

但是,我从家庭网络上的任何其他 PC 直接建立 SSH 连接至 Debian PC。只是路由器的端口转发不起作用。

为什么 PC 看到的从路由器到端口 22 的连接与它看到的直接到端口 22 的连接尝试不同?为什么连接不起作用?欢迎提出想法!

答案1

航线

大多数 VPN 软件都足够智能,可以设置忽略局域网 (LAN) 流量的路由,这就是 SSH 可以在家庭网络上的其他 PC 上运行的原因。

但是,默认情况下,所有发往 Internet 的流量仍通过 VPN 接口路由出去。这包括通过端口转发的连接。因此,SSH 流量通过路由器进入,但随后通过 VPN 得到应答(这会造成混乱,因为 VPN 服务器具有不同的 IP 地址。)

解决此问题的一种方法是在 Debian PC 上设置一些 iptables 防火墙规则,以将 SSH 流量从正常网络接口发送出去,而不是通过 VPN 接口。


例子

我已经尝试适应这个答案针对这种情况(假设你的家用路由器是 192.168.0.1,而你的 Debian PC 是 192.168.0.20):

/etc/iproute2/rt_tables通过附加以下行来编辑并添加新表:

200 eth-route

然后,您需要配置eth-route 以默认网关命名的新路由表,并创建规则以有条件地将流量发送到该表。

# Populate secondary routing table
ip route add default via 192.168.0.1 dev eth0 table eth-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table eth-route
# Mark these packets so that iproute can route it through eth-route
iptables -A OUTPUT -t mangle -o tun0 -p tcp --dport 22 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 22 -j SNAT --to 192.168.0.20

要实现自动化,需要将这些命令添加到末尾/etc/rc.local,或者openvpn在启动时执行这些操作。

祈祷吧……

相关内容