简单来说:笔记本电脑运行 ssh 并连接到 vpn。我如何 ssh 到它?
我通过谷歌搜索获取了外部 IP,我的路由器转发了笔记本电脑上的端口 22,当 openvpn 未运行时,我可以成功连接。在我看来,当我在 ssh 应用程序上输入外部 IP 时,它会尝试在 vpn 服务器上进行 ssh 连接,而不是返回到我的机器。
我需要一些澄清,请不要太严厉。
以下是 openvpn 启动后的路由表。
default via 10.247.202.221 dev tun0 proto static metric 50
default via 192.168.1.1 dev wlp2s0 proto static metric 600
10.247.200.1 via 10.247.202.221 dev tun0 proto static metric 50
10.247.202.221 dev tun0 proto kernel scope link src 10.247.202.222 metric 50
154.16.48.155 via 192.168.1.1 dev wlp2s0 proto static metric 600
169.254.0.0/16 dev wlp2s0 scope link metric 1000
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.14 metric 600
192.168.1.1 dev wlp2s0 proto static scope link metric 600
default via 192.168.1.1 dev wlp2s0
192.168.1.0/24 dev wlp2s0 scope link
答案1
如果您的 OpenVPN 没有使用端口 22,那么问题很可能是 OpenVPN 更改了默认路由。
您可以通过 VPN 访问笔记本电脑。
如果您想在 VPN 设置默认路由的情况下通过笔记本电脑的正常地址访问笔记本电脑,这有点棘手,但使用基于策略的路由是可能的。如果您想这样做,请发表评论,我可以描述如何操作。
基于策略的路由
通常情况下,所有传出的数据包都会查询一个路由表。使用基于策略的路由,您可以使用不同的路由表来处理不同类型的数据包。
在您的例子中,VPN 会创建一条通向 VPN 的默认路由,您希望将其用于大多数连接。问题不在于数据包到达您的机器,而在于返回的数据包会到达 VPN,而不是发件人。
首先需要一条规则来匹配来自本地接口的数据包。
ip rule add from 192.168.1.0/24 table 200
有点200
随意,请参见/etc/iproute2/rt_tables
不要使用任何预定义值 253-255。您还可以向该文件添加一个数字和一个名称,然后按名称引用该表。这会导致所有带有源地址的数据包都使用,192.168.1.0/24
而table 200
不是默认路由表。现在我们必须向该表添加规则。我假设您的普通表只包含本地网络和路由器网关的条目。
ip route add 192.168.1.0/24 dev wlp2s0 table 200
ip route add default via 192.168.1.1 table 200
192.168.1.0/24
尽管该路由已经存在于您的默认路由表中,您仍然必须添加它。
现在,所有到达您的地址 192.168.1.14 的传入数据包的响应都应通过wlp2s0
您的路由器发出,而所有到达您的 VPN 地址的传入数据包的响应都应返回到 VPN。
如果不起作用,请使用tcpdump -i any port 22
查看接收和发送了哪些数据包。如果您需要端口 22 来连接到外部服务器进行测试,则将路由器中的另一个端口转发到笔记本电脑并使用该端口进行测试。对于此测试,笔记本电脑上的端口是否打开并不重要。如果您看到响应,请运行tcpdump -i wlp2s0 port 22
并重试。如果您不知道如何解释结果,请将它们附加到您的问题中。