通过与跳板机组网ssh不可直连服务器方法

情况:

A主机无法直接连接服务器C,但是B主机可以连接服务器C,且A、B不在同一个局域网下;

但是远程B连接C太卡了,我只需要vscode可以ssh即可,所以想以B为跳板机ssh连接C;

条件:A和B主机均可操作(A可以远程操作B),B和C在一个子网,或者B可以访问C.

A----B →C

目标:使得A通过B连接上C

流程

  1. 在A和B之间组网

  2. B通过子网代理转发或者TCP端口转发来自A的请求给C

  • 组网工具安装
  1. 使用DS推荐的Tailscale进行组网:看不懂怎么手机扫码验证,登录不上goggle账户,失败;

  2. 使用国产EasyTier,使用Github的官方安装命令,使用管理员开启Powershell安装即可

    irm "https://github.com/EasyTier/EasyTier/blob/main/script/install.ps1?raw=true" | iex
    

    使用easytier-cli route 检查是否安装好(能够识别命令就是安装好了)


尝试方案. 使用Easy Tier将B作为子网代理转发A的请求给C(失败)

为A和B 组EasyTier网并将使用B代理C:(后面统称为ET网络)让 B 代理 C 所在的真实网段,A 通过 EasyTier 自动路由到 B,再由 B 转发到 C。

EasyTier 官方文档里这个能力叫 subnet proxy,配置后代理网段会同步到虚拟网络内的其他节点,并自动生成路由;-n 参数可以代理一个网段,也可以用 /32 只代理单个 IP。

①A端的Powershell:

easytier-core.exe `
  --ipv4 10.144.144.1 `
  --network-name your_NetName `
  --network-secret 123456 `使用10.144.144.1作为子网IP进入ET网络

②B端的Powershell:(告诉ET网络,所有访问服务器IP的流量都交由B来转发)

easytier-core.exe `
  --ipv4 10.144.144.2 `
  --network-name your_NetName `
  --network-secret 123456 `
  -p tcp://<shared_node>:11010 `
  -n 服务器IP/32 `
  --use-smoltcp

<shared_node> 没有公网IP的需要使用官方的中转域名,地址:EasyTier 公共服务器列表

–ipv4:组网内的虚拟IP

测试:

1. 在 A 上查看路由

easytier-cli.exe route

正常应该如下:
在这里插入图片描述

你应该能看到类似:

proxy_cidrs
服务器IP/32

如果能看到,说明 B 的子网代理已经同步给 A 了。官方文档也是用 easytier-cli route 查看 proxy_cidrs 是否生效

2. 在 A 上测试 SSH 端口

Test-NetConnection 服务器IP -Port 端口号

如果成功,会看到:

TcpTestSucceeded : True

然后再 SSH:

ssh -p 端口号 usr-name@服务器IP

VSCode 里仍然可以用你原来的配置:

Host machine
    HostName 服务器IP
    User usr-name
    Port 端口
    ForwardAgent yes
    RemoteForward 服务器上的ssh监听端口 127.0.0.1:本地梯子的监听端口(用于在服务器上挂梯子,使得服务上流量通过监听端口回到本地代理上)

这么一套下来,又失败了!

  1. B 的防火墙可能拦截 EasyTier 转发

  2. 如果普通子网代理不通,在B端加 --use-smoltcp,更容易绕过 Windows 防火墙/转发问题

  3. 如果 C 的内网 IP 更合适,优先代理内网 IP

一套检查下来,B主机的防火墙也关了,命令use-smoltcp也加了,还是没用!

**原因:**核心不是“AB 组成虚拟局域网”这么简单,而是:**B 必须作为 C 的子网代理节点,把 C 的 IP/网段发布给 A。在服务器C上查找了一下其局域网IP,发现B和C不在同一局域网段下,而B作为C的子网代理节点,要求B、C在同一个局域网下,因此可能为此方法无效的原因。


改方案:不要用 EasyTier 子网代理,改用 B 做 TCP 端口转发

A 连接 B 的 EasyTier IP:22089
        ↓
B 转发到 C 的 IP:port
        ↓
C SSH 服务

也就是:

A → B内的子网IP:B上的监听C的端口 → B → IP:port → C

这样不需要 EasyTier 的 -n 子网代理,也不需要处理复杂路由。

第一步:A、B 正常组 EasyTier网络,不要加 -n

A:

easytier-core.exe `
  --ipv4 10.144.144.1 `
  --network-name your_NetName `
  --network-secret 123456 `
  -p tcp://<shared_node>:11010

B:

easytier-core.exe `
  --ipv4 10.144.144.2 `
  --network-name your_NetName `
  --network-secret 123456 `
  -p tcp://<shared_node>:11010

注意:B 这里先不要写:

-n 服务器IP/32

因为我们不用子网代理了。

第二步:在 B 上做端口转发

在 B 的管理员 PowerShell 里运行:

netsh interface portproxy add v4tov4 `
  listenaddress=10.144.144.2 `
  listenport=22089 `
  connectaddress=服务器IP `
  connectport= 服务器端口

这句话的意思是:

监听 B 的 EasyTier IP:10.144.144.2:22089
然后转发到服务器 C:服务器IP:端口

然后给 B 放行这个端口:

netsh advfirewall firewall add rule `
  name="EasyTier SSH Forward 22089" `
  dir=in `
  action=allow `
  protocol=TCP `
  localip=10.144.144.2 `
  localport=22089

确认端口转发是否添加成功:

netsh interface portproxy show all

应该能看到类似:

Listen on ipv4:             Connect to ipv4:
Address         Port        Address          Port
10.144.144.2    22089       服务器IP          服务器端口
第三步:A 上测试连接 B 的转发端口

在 A 上运行:

Test-NetConnection 10.144.144.2 -Port 22089

如果成功,应该显示:

TcpTestSucceeded : True

然后直接 SSH:

ssh -p 22089 user_name@10.144.144.2

虽然你连接的是 10.144.144.2:22089,但实际最终连到的是:

服务器IP:服务器端口

也就是服务器 C。

VSCode 配置这样写

你可以新增一个 Host:

Host machine-via-b
    HostName 10.144.144.2
    User user_name
    Port 22089
    ForwardAgent yes
    RemoteForward 服务器上的ssh监听端口 127.0.0.1:本地梯子的监听端口(用于在服务器上挂梯子,使得服务上流量通过监听端口回到本地代理上)
    (实例:RemoteForward 7897 127.0.0.1:7897)

然后 VSCode Remote SSH 连接:

machine-via-b
如果出现 SSH host key 警告

因为你现在连接的是 10.144.144.2:22089,但实际背后是 C,可能会出现 known_hosts 警告。

可以先清一下:

ssh-keygen -R "[10.144.144.2]:22089"

然后重新连接:

ssh -p 22089 user_name@10.144.144.2
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐