我有一个 VPS server2
,上面安装了一个像 WireGuard peer 这样的服务器,并且已启动并运行。我从移动设备上对其进行了测试,一切正常。配置文件如下:
#Server2 Configuration
[Interface]
PrivateKey = $wgpk
ListenPort = $wgport
Address = 10.10.213.1/24
SaveConfig = false
[Peer]
PublicKey = $wgpub_peer
AllowedIPs = 10.10.231.3/32
PresharedKey = $preshared_key
PersistentKeepalive = $perkeep
server1
现在,我想在另一个 VPS 上server2
以客户端身份进行连接。但是server1
立即激活 WireGuard 会导致 ssh 连接丢失,并且我无法再 ssh 到我的服务器server1
来调查问题。我尝试添加 PostUp 路由,以便可以排除 ssh 端口 22,但并没有解决我的问题。配置server1
如下:
#Server1 Configuration
[Interface]
PrivateKey = $wgpk_peer
Address = 10.10.231.3/32
DNS = [1.1.1.1, 8.8.8.8]
SaveConfig = false
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination $SERVER
[Peer]
PublicKey = $wgpub
PresharedKey = $preshared_key
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = $SERVER2_public_ip:$wgport
PersistentKeepalive = $perkeep
我这样做的原因是server1
使用 vpn 连接来保护我的 ip 地址和数据。如果您知道如何才能保留我的 ssh 访问权限,请帮忙server1
?
答案1
正如 Tom Yan 所建议的,使用策略路由或为您的 SSH 连接添加静态路由。
要强制 Server1 始终对所有 SSH 连接使用主路由表(而不是使用 WireGuard 设置的路由表),请在 Server1 上运行以下策略路由命令:
$ sudo ip rule add sport 22 table main priority 123
或者,如果您想强制 Server1 始终使用其当前路由到您的本地计算机(而不是使用 WireGuard 设置的路由表),请执行以下操作为其设置静态路由:
首先,通过在 Server1 上运行以下命令确定当前 SSH 会话的 IP 地址:
$ ss -n sport 22
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp ESTAB 0 0 10.200.200.123:22 198.51.100.234:12345
上面的例子中,该Peer Address
列显示的是198.51.100.234
从 Server1 的角度来看您的本地计算机的 IP 地址。
接下来,通过在 Server1 上运行以下命令确定 SSH 连接当前正在使用的网关:
$ ip route get 198.51.100.234 sport 22
198.51.100.234 via 10.200.200.1 dev eth0 src 10.200.200.123 uid 1000
cache
在上面的例子中,via 10.200.200.1 dev eth0
输出的一部分显示您的 SSH 连接正在用作10.200.200.1
来自 Server1 的网关,通过 Server1 的eth0
网络接口。
然后,为了强制 Server1 始终使用此网关来连接来自当前 IP 地址的所有连接,请在 Server1 上运行以下命令:
$ sudo ip route add 198.51.100.234 via 10.200.200.1 dev eth0
请注意,如果您重新启动 Server1,则必须重新运行上述ip route add
命令ip rule add
(因此您可能希望将它们放在 Server1 启动完成后运行的脚本中)。