用 ssh -R 把本地 8080 映射到跳板机的 8080,跳板机上 curl 127.0.0.1:8080 正常,其他机器访问跳板机 IP 却连接被拒。

一开始怀疑是「跳板机的防火墙只放行了回环,外部来源被拒」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。sshd 默认 GatewayPorts 是 no,远程转发只绑在回环地址上。也可能是转发时没指定 bind_address,默认就绑 127.0.0.1。

少数情况下是sshd 配置改了但没重载,监听还是旧的。

第一件事是看隧道实际监听的地址

ss -lntp | grep 8080

随后在 sshd 配置里打开网关端口

grep -n '^GatewayPorts' /etc/ssh/sshd_config

然后改成 clientspecified 并重载

sshd -t && systemctl reload sshd

从另一台机器验证连通性

curl -s -o /dev/null -w '%{http_code}\n' http://10.0.0.30:8080/

命令输出我都留了记录,免得改完记不清原来的值。

改完先别撤,确认这几项。ss 显示 8080 监听在 0.0.0.0 或指定网卡地址上,其他机器访问跳板机 IP 返回 200,正向和反向转发都正常。

这里还有个坑。GatewayPorts yes 会把端口暴露到所有网卡,安全风险不小;生产上更推荐用内网负载均衡或 VPN,而不是长期开着反向隧道。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189