SSH隧道端口转发后无法通过公网接口访问的问题排查
Hey,这个问题我之前排查过好几次,核心原因要么是SSH服务器的配置限制了端口绑定范围,要么是网络层面的防火墙/安全组拦了流量,咱们一步步来解决:
1. 先检查SSH服务器的
GatewayPorts配置 OpenSSH默认会把反向隧道的端口绑定在服务器的127.0.0.1地址上,外部根本连不上——这是GatewayPorts选项默认设为no导致的。
操作步骤:
- 登录到你的公网服务器(58.36.132.124),编辑sshd配置文件:
sudo vi /etc/ssh/sshd_config - 找到
GatewayPorts这一行(如果被注释了就去掉#),改成下面其中一种:GatewayPorts yes:允许所有反向隧道绑定到服务器的所有网络接口GatewayPorts clientspecified:允许客户端指定绑定地址(也就是你命令里的*能生效)
- 重启sshd服务让配置生效:
# 大多数现代Linux发行版用这个 sudo systemctl restart sshd # 老版本Ubuntu/Debian可以用 sudo service ssh restart
2. 确认端口是否真的绑定了所有地址
修改配置后,重新运行你的隧道命令:
ssh root@58.36.132.124 -N -R *:11222:127.0.0.1:11222
然后在公网服务器上执行这个命令,查看端口监听状态:
ss -tlnp | grep 11222
- 如果输出里的
Local Address是0.0.0.0:11222或者:::11222,说明端口已经对外开放了,接下来查防火墙; - 如果还是
127.0.0.1:11222,说明sshd配置没生效——再检查配置文件有没有写错,或者重启服务的时候有没有报错。
3. 检查防火墙和云安全组
即使端口绑定对了,外部流量也可能被拦:
系统防火墙
- firewalld(CentOS/RHEL):
# 临时开放端口 sudo firewall-cmd --add-port=11222/tcp # 永久开放,重启防火墙生效 sudo firewall-cmd --add-port=11222/tcp --permanent sudo firewall-cmd --reload - ufw(Ubuntu/Debian):
sudo ufw allow 11222/tcp sudo ufw reload - iptables:
sudo iptables -A INPUT -p tcp --dport 11222 -j ACCEPT # 保存规则,不同系统命令不同,比如CentOS用: sudo service iptables save
云服务商安全组
如果你用的是阿里云、腾讯云、AWS这类云服务器,一定要去控制台的安全组里加一条规则:允许外部访问TCP 11222端口,来源地址可以设为0.0.0.0/0(允许所有IP)或者你需要的特定IP范围——这一步很容易忘!
4. 临时解决办法(不用改全局配置)
如果你不想修改服务器的sshd全局配置,也可以在建立隧道时加个参数临时生效:
ssh root@58.36.132.124 -N -R *:11222:127.0.0.1:11222 -o GatewayPorts=yes
最后别忘了确认你的本地服务确实在127.0.0.1:11222正常运行,没绑定其他地址哦。
内容的提问来源于stack exchange,提问作者George




