AWS EC2实例SSH反向端口转发外部访问失败问题排查
SSH反向端口转发外部访问失败排查思路
问题概述
此前可通过SSH反向端口转发将本地9999端口映射至远程AWS EC2实例的9999端口并正常使用,但新创建EC2实例后仅部分功能可用:
- 本地执行
curl "127.0.0.1:9999"可正常访问本地服务 - 反向转发命令
ssh -R 9999:localhost:9999 -i "/home/example/XXX.pem" ubuntu@ec2-xx-xx-xx-xx-xx.compute.amazonaws.com可成功建立连接,在该SSH会话内执行curl "127.0.0.1:9999"能访问本地服务 - 外部执行
curl "ec2-xx-xx-xx-xx-xx.compute.amazonaws.com:9999"提示curl: (7) Failed to connect to ec2-xx-xx-xx-xx-xx.compute.amazonaws.com port 9999 after 59 ms: Connection refused - EC2安全组已开放TCP 9999端口允许0.0.0.0/0访问,且80端口(Apache2)可正常被外部访问
- 已关闭UFW防火墙,问题仍存在
- 反向转发会话内执行
php -S 0.0.0.0:9999 -t .提示端口被占用,但普通SSH会话启动该服务后,外部可正常访问EC2的9999端口
排查步骤
1. 检查SSH反向转发的绑定地址
默认情况下,ssh -R 9999:localhost:9999仅会将转发端口绑定到EC2的127.0.0.1回环地址,仅本地会话可访问,外部无法连接。需调整配置让端口绑定到所有网卡:
- 临时测试:修改转发命令,明确指定绑定到0.0.0.0:
ssh -R 0.0.0.0:9999:localhost:9999 -i "/home/example/XXX.pem" ubuntu@ec2-xx-xx-xx-xx-xx.compute.amazonaws.com - 持久化配置:编辑EC2实例的
/etc/ssh/sshd_config,确保GatewayPorts参数设置为yes或clientspecified(clientspecified允许客户端指定绑定地址),修改后重启sshd服务:sudo systemctl restart sshd
2. 验证EC2上端口的监听状态
在EC2的普通SSH会话中,执行以下命令查看9999端口的监听地址:
ss -tulpn | grep 9999 # 或兼容旧系统的命令: netstat -tulpn | grep 9999
- 如果结果显示
127.0.0.1:9999,说明转发仅绑定回环,外部无法访问; - 如果显示
0.0.0.0:9999,则端口已对外开放,可排除绑定地址问题。
3. 确认sshd服务的转发权限
检查EC2的全局sshd配置,确保TCP转发未被禁止:
- 编辑
/etc/ssh/sshd_config,确认AllowTcpForwarding参数设置为yes(默认通常为yes,但需排查是否被修改); - 同时检查
PermitOpen参数,确保未限制转发到9999端口。
4. 测试简化版转发命令
尝试添加-N参数(仅建立端口转发,不执行远程shell命令),避免会话内其他进程干扰:
ssh -N -R 0.0.0.0:9999:localhost:9999 -i "/home/example/XXX.pem" ubuntu@ec2-xx-xx-xx-xx-xx.compute.amazonaws.com
执行后在外部再次测试访问EC2的9999端口。
5. 排查用户级SSH配置限制
检查EC2上登录用户的~/.ssh/config文件,是否存在限制端口转发的配置(比如GatewayPorts的用户级覆盖),如有则注释或删除相关规则。
内容的提问来源于stack exchange,提问作者bob dylan
相关产品推荐
相关产品推荐

