虚拟组网+内网穿透
通过与跳板机组网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
流程:
-
在A和B之间组网
-
B通过子网代理转发或者TCP端口转发来自A的请求给C
- 组网工具安装
-
使用DS推荐的Tailscale进行组网:看不懂怎么手机扫码验证,登录不上goggle账户,失败;
-
使用国产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:本地梯子的监听端口(用于在服务器上挂梯子,使得服务上流量通过监听端口回到本地代理上)
这么一套下来,又失败了!
-
B 的防火墙可能拦截 EasyTier 转发
-
如果普通子网代理不通,在B端加
--use-smoltcp,更容易绕过 Windows 防火墙/转发问题 -
如果 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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)