+--->---->----->-----YES----->---->----->--+
| |WiFi-Internet| |
sys1(Linux) <-LAN->|sys2(Windows)|<-VPN-> sys3(Linux)
| |
+---<----<-----<-----NO------<----<-----<--+
我无法通过 ssh 连接sys1
,sys3
但我可以sys3
通过在以太网适配器的 VPN 适配器sys1
上启用 Internet 共享来进行 ssh 连接。sys2
# LAN
sys1: 192.168.137.2
sys2: 192.168.137.1
# VPN
sys2: 10.252.85.135
sys3: 10.136.136.80
开sys3
:
$ sudo route add -net 192.168.137.0 netmask 255.255.255.0 gw 10.252.85.135
SIOCADDRT: Network is unreachable
我应该检查一些防火墙sys2
吗?但似乎该route
命令sys3
实际上并未将任何数据包发送到sys1
viasys2
以检查是否可达。
我如何 ssh 到sys1
from sys3
?
--更新--
我正在使用 Global Protect VPN 客户端。
开sys3
:
$ sudo ip -4 route
[sudo] password for amd:
default via 10.136.139.254 dev enx00249b30540f proto dhcp metric 100
10.136.136.0/22 dev enx00249b30540f proto kernel scope link src 10.136.136.80 metric 100
169.254.0.0/16 dev enx00249b30540f scope link metric 1000
--更新--
其实我不想 ssh from sys3
to sys1
; 我正在sys1
端口上运行服务器8888
,我想将应用程序连接sys3
到sys1
端口8888
这不是“活动”检查——可达性检查完全基于 sys3 的本地路由表。路由的“通过”地址实际上是网关的第 2 层(MAC) 地址的替代,因此指定的网关必须是本地的(不在另一个网关之后),所以如果 sys3 没有到请求的直接路由网关的 IP 地址,则网关自动“无法访问”。
现在唯一匹配 10.252.85.135 的路由是间接的
via 10.136.139.254
,这意味着您想要的网关已经在至少一个其他网关之后(可能更多),因此 sys3 无法单独通过 MAC 地址访问它。(通过网关路由数据包是通过将它们发送到该网关的第 2 层 (MAC) 地址作为目标来完成的——IP 标头保持不变——并且数据包中只有一个“目标 MAC”字段。没有原生支持的描述方式通过两个跃点的路由;虽然 IP 曾经支持“源路由”选项,但网关可能在 1990 年代已经停止使用它,因为它使地址欺骗变得太容易了。)
这在一个方向上起作用,因为 Windows“Internet 连接共享”包括 NAT——您可以通过 SSH 从 sys1 到 sys3,因为后者认为它正在接收来自 sys2(即来自 10.252.85.135)的连接并且仍然可以回复。
在 sys2 和 sys3 之间建立隧道(最好从 sys2 到 sys3,因为可能有防火墙阻止新的 sys3→sys2 连接),或从 sys1 到 sys3 的隧道(由 sys1 启动以利用 ICS NAT),然后是 SSH穿过那条隧道。
例如,如果您可以通过 SSH 连接到 sys3,那么您还可以使用 SSH 的“反向转发”,
ssh -R
该功能将通过现有的出站(来自 sys1)SSH 连接搭载任何类型的入站 TCP 连接。或者,您可以将 sys3 设置为 OpenVPN 服务器、WireGuard 端点或任何其他 IP-over-IP 隧道。只要隧道保持活动状态,它就可以将连接带回。
如果从 sys3 到 sys2 的连接没有被阻止,你可以做相反的事情并在 sys2 上设置一个 VPN 服务器——或者一个 SOCKS 代理,或者一个 HTTP CONNECT 代理等。这里也可以使用 SSH 和它的
-L
本地转发: