如何实现单Second Hop会话的多用户Multihop SSH隧道?
多用户复用单Second Hop SSH会话的解决方案
针对共享user2会话数超限的问题,以下是几个可行的实现方案,核心思路是让所有用户复用同一个持久SSH连接到Second Hop,避免每个用户都新建独立会话:
方案一:SSH控制套接字(ControlMaster)复用会话
利用SSH原生的ControlMaster特性,维护一个持久的user2到Second Hop的连接,所有用户的后续请求都复用这个底层会话。
在First Hop上创建持久复用连接
- 先确保user1家目录的
.ssh文件夹权限合规:mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/config && chmod 600 ~/.ssh/config - 编辑
~/.ssh/config,添加Second Hop的复用配置:Host second-hop HostName <SecondHop的IP/域名> User user2 ControlMaster auto ControlPath ~/.ssh/control-%r@%h:%p.sock ControlPersist yes ServerAliveInterval 60 ServerAliveCountMax 3 - 编写expect脚本维持连接(自动输入密码并保活),命名为
keep-second-hop-alive.exp:#!/usr/bin/expect -f spawn ssh second-hop expect "password:" send "<user2的密码>\r" # 每5分钟发送空命令保持会话活跃 interact { timeout 300 { send "\r" } } - 赋予脚本执行权限并后台运行:
chmod +x keep-second-hop-alive.exp nohup ./keep-second-hop-alive.exp > /dev/null 2>&1 &
- 先确保user1家目录的
修改用户登录的expect脚本
将原脚本中ssh user2@SecondHop的命令替换为ssh second-hop,所有用户连接都会复用已创建的持久会话,不会在Second Hop上新增user2会话。
方案二:共享SOCKS代理转发
在First Hop上搭建基于单SSH会话的SOCKS代理,所有用户的Svr连接都通过该代理转发,复用底层的user2会话。
创建持久的SOCKS代理连接
- 执行以下命令启动动态端口转发(后台运行),通过ControlMaster确保会话复用:
ssh -D 1080 -M -S ~/.ssh/socks-proxy.sock -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user2@SecondHop - 同样可以用expect脚本自动输入密码并维持连接,将上述命令替换到之前的keep-alive脚本中即可。
- 执行以下命令启动动态端口转发(后台运行),通过ControlMaster确保会话复用:
修改用户登录脚本
原脚本中连接Svr的部分改为通过SOCKS代理转发:#!/usr/bin/expect -f spawn ssh -o ProxyCommand="nc -x 127.0.0.1:1080 %h %p" <Svr用户名>@<Svr的IP> expect "<Svr的密码提示>" send "<Svr的密码>\r" interact- 若First Hop未安装
nc,用root权限安装:Debian/Ubuntu执行apt install netcat-openbsd,RHEL/CentOS执行yum install nc。
- 若First Hop未安装
关键注意事项
- 确保First Hop上user1的
.ssh文件夹权限为700,配置文件权限为600,否则SSH会拒绝使用控制套接字或配置。 - 可添加简单监控脚本,定期检查持久连接是否存活,自动重启断开的连接。
- 若user2或Svr的密码变更,需同步更新对应的expect脚本。
内容的提问来源于stack exchange,提问作者musca999
相关产品推荐
相关产品推荐

