如何配置SSH端口转发实现远程用户无需登录宿主机即可直接SSH连接其上的虚拟机
如何配置SSH端口转发实现远程用户无需登录宿主机即可直接SSH连接其上的虚拟机
嗨,我来帮你捋捋问题出在哪!你已经走对了大部分流程,但有几个关键细节没处理到位,导致远程连接被拒绝:
问题根源分析
你之前执行的反向转发命令ssh -4 -R 2222:192.168.7.2:22 127.0.0.1,默认只会把端口绑定在宿主机的**127.0.0.1(本地回环地址)**上。这意味着只有宿主机自己能访问2222端口,外部用户通过公网IP(150.15.15.15)发起的连接根本碰不到这个转发端口,自然会显示“Connection refused”。
正确配置步骤
我把完整的修正步骤拆给你,一步步来:
1. 确保宿主机SSH服务允许端口转发到外部网卡
- 编辑宿主机的SSH配置文件:
sudo nano /etc/ssh/sshd_config - 找到
GatewayPorts配置项,把它改成GatewayPorts yes(如果之前是注释状态,记得去掉前面的#) - 重启SSH服务让配置生效:
sudo systemctl restart sshd(Ubuntu老版本可以用sudo service ssh restart)
2. 创建绑定所有网卡的反向SSH隧道
在宿主机上执行这条命令,重点是加上0.0.0.0:来指定监听所有网卡的2222端口:
ssh -4 -N -R 0.0.0.0:2222:192.168.7.2:22 127.0.0.1
-N参数:让SSH只做端口转发,不执行远程命令,避免不必要的终端会话- 执行完后用
netstat -tulpn检查,应该能看到类似这样的输出(重点是0.0.0.0:2222):tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN -
3. 开放宿主机防火墙的2222端口
如果宿主机开启了防火墙(比如Ubuntu默认的ufw),必须放行2222端口,否则外部连接会被防火墙拦截:
sudo ufw allow 2222/tcp
如果用的是iptables,对应的命令是:
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
4. 远程用户测试连接
现在远程用户就可以直接通过宿主机的公网IP和2222端口连接虚拟机了:
ssh root@150.15.15.15 -p 2222
额外小技巧:保持隧道稳定
普通SSH隧道如果断开(比如网络波动)就会失效,你可以用autossh工具来自动重连隧道:
- 先安装autossh:
sudo apt install autossh - 执行这条命令创建持久化隧道:
autossh -M 2223 -N -R 0.0.0.0:2222:192.168.7.2:22 127.0.0.1
-M 2223:指定一个监控端口,autossh会通过这个端口定期检查隧道状态,断开后自动重连
备注:内容来源于stack exchange,提问作者JaSON




