允许 SSH 连接到连接到 VPN 的计算机

允许 SSH 连接到连接到 VPN 的计算机

我的问题:

我使用的是 Ubuntu 22.04,并使用他们的 cli 工具设置了 ExpressVPN 的 VPN,他们还提供了 ovpn 配置文件,因此我可以根据需要调整配置,同时维护他们的身份验证信息。

在开始使用 VPN 之前,我在家庭路由器上转发了端口 22,并且能够从网络外部通过 ssh 访问机器。

现在,当机器连接到 VPN 时,我无法通过 ssh 连接。

我尝试过的:

首先,我使用 tcpdump 来确定问题是否是我所想的:入站连接来自连接到我的路由器的默认接口,但出站数据包发送到由 ExpressVPN/OpenVPN tun0 创建的接口。

tcpdump的部分输出:

19:17:22.488812 enp5s0 In  IP [src ip omitted] > 192.168.1.20.ssh: Flags [S], seq 2135016686, win 65535, options [mss 1400,sackOK,TS val 58875528 ecr 0,nop,wscale 9], length 0    
19:17:22.488853 tun0  Out IP 192.168.1.20.ssh > [src ip omitted]: Flags [S.], seq 2642908921, ack 2135016687, win 64900, options [mss 1310,sackOK,TS val 638298497 ecr 58875528,nop,wscale 7], length 0    
19:17:23.514229 tun0  Out IP 192.168.1.20.ssh > [src ip omitted]: Flags [S.], seq 2642908921, ack 2135016687, win 64900, options [mss 1310,sackOK,TS val 638299523 ecr 58875528,nop,wscale 7], length 0    
19:17:23.515183 enp5s0 In  IP [src ip omitted] > 192.168.1.20.ssh: Flags [S], seq 2135016686, win 65535, options [mss 1400,sackOK,TS val 58876582 ecr 0,nop,wscale 9], length 0    
19:17:23.515204 tun0  Out IP 192.168.1.20.ssh > [src ip omitted]: Flags [S.], seq 2642908921, ack 2135016687, win 64900, options [mss 1310,sackOK,TS val 638299524 ecr 58875528,nop,wscale 7], length 0    
19:17:25.515204 enp5s0 In  IP [src ip omitted] > 192.168.1.20.ssh: Flags [S], seq 2135016686, win 65535, options [mss 1400,sackOK,TS val 58878582 ecr 0,nop,wscale 9], length 0    
19:17:25.515227 tun0  Out IP 192.168.1.20.ssh > [src ip omitted]: Flags [S.], seq 2642908921, ack 2135016687, win 64900, options [mss 1310,sackOK,TS val 638301524 ecr 58875528,nop,wscale 7], length 0    
19:17:27.546040 tun0  Out IP 192.168.1.20.ssh > [src ip omitted]: Flags [S.], seq 2642908921, ack 2135016687, win 64900, options [mss 1310,sackOK,TS val 638303555 ecr 58875528,nop,wscale 7], length 0    

我尝试按照该线程的答案中提供的说明进行操作 连接 VPN 服务器后如何允许 ssh 进入终端 没有成功。

我不明白为什么建议的解决方案不起作用。

本质上,我需要的是一种方法,通过分配给该网络而不是 tun0 的接口上的公共 IP,保持从网络外部打开的连接。

是否可以通过操作 ovpn 定义(或命令行)中的路由来做到这一点?还是使用 iptables 更好?或者我使用建议的解决方案添加的路线可能不正确?

在尝试链接线程中提出的解决方案时,我添加了以下规则和路线:

ip rule add from x.x.x.x table 128
ip route add table 128 to 255.255.255.0/24 dev enp5s0
ip route add table 128 default via 192.168.1.20

其中 xxxx 是未连接到 VPN 时的公共 IP。

以下是连接到 VPN 后的路由:

0.0.0.0/1 via 100.64.100.5 dev tun0 
default via 192.168.1.1 dev enp5s0 proto dhcp metric 100 
10.0.0.0/8 via 192.168.1.1 dev enp5s0 
100.64.100.1 via 100.64.100.5 dev tun0 
100.64.100.5 dev tun0 proto kernel scope link src 100.64.100.6 
128.0.0.0/1 via 100.64.100.5 dev tun0 
169.254.0.0/16 dev tun0 scope link metric 1000 
172.16.0.0/12 via 192.168.1.1 dev enp5s0 
173.239.199.150 via 192.168.1.1 dev enp5s0 
192.168.0.0/16 via 192.168.1.1 dev enp5s0 
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.20 metric 100

一旦我连接到 VPN,所有这些路由都会自动添加。以下还有未连接 VPN 时的路由(如果有帮助的话):

default via 192.168.1.1 dev enp5s0 proto dhcp metric 20100 
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.20 metric 100 

新航线:

0.0.0.0/1 via 100.64.100.5 dev tun0 
default via 192.168.1.1 dev enp5s0 proto dhcp metric 100 
10.0.0.0/8 via 192.168.1.1 dev enp5s0 
100.64.100.1 via 100.64.100.5 dev tun0 
100.64.100.5 dev tun0 proto kernel scope link src 100.64.100.6 
128.0.0.0/1 via 100.64.100.5 dev tun0 
169.254.0.0/16 dev enp5s0 scope link metric 1000 
172.16.0.0/12 via 192.168.1.1 dev enp5s0 
173.239.199.206 via 192.168.1.1 dev enp5s0 
192.168.0.0/16 via 192.168.1.1 dev enp5s0 
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.20 metric 100

答案1

连接的问题是返回数据包从不同的接口发出。入站数据包通过 enp5s0 传入并通过 tun0 传出。

你所使用的规则应该改变。

  • 首先,您需要将第一行更改为“to” xxxx 当前规则的方式,仅影响已经到达主机(目的地)的数据包。因此它不会影响数据包。将其更改为“to”会影响数据包离开主机的接口/网关,因此会影响源 IP。

  • 第二行255.255.255.0/24无效,最高单播地址为223.255.255.254。因此,规则中的第二行永远不会被匹配。

规则应该是:

ip rule add to x.x.x.x table 128
ip route add table 128 default via 192.168.1.1 dev enp5s0 

这将解决你的 ssh 问题。

关于路线的一些补充说明:

0.0.0.0/1 指的是 ips 0.0.0.1 - 127.255.255.254 - 我不相信这是你想要的。地址应该是 0.0.0.0/0 或者您可以使用别名默认值。 **注意修复此路由将路由与较长前缀(更具体的路由)不匹配的所有流量将通过 VPN 进行路由,包括互联网流量。

答案2

我在使用 ProtonVPN 时遇到了同样的问题,我所做的是为来自流量的源 IP 创建一条静态路由,然后将 eth0 接口作为目的地:

ip route add 2.3.4.5 via 4.4.4.4 dev eth0

其中2.3.4.5是我们的源IP,4.4.4.4是我们eth0的网关(默认网关),eth0是接口。

相关内容