商城首页欢迎来到中国正版软件门户

您的位置:首页 >Linux如何配置SSH反向隧道_Linux SSH反向隧道配置详解

Linux如何配置SSH反向隧道_Linux SSH反向隧道配置详解

  发布于2026-05-20 阅读(0)

扫一扫,手机访问

搞SSH反向隧道,最磨人的往往不是命令本身——ssh -R敲下去,看着连接建立了,但真要用的时候,不是连不上,就是动不动断线,或者明明通了却只能服务器本机访问。这些问题,多半不是你的命令写错了,而是SSH的默认行为和各层网络配置没对上号。

为什么命令通了,却连不上服务器的隧道端口?

最常见的情况是:你在内网机执行了 ssh -R 2222:localhost:22 user@server,在服务器上也看到端口在监听,但用另一台机器去连 server:2222 就是超时。问题出在服务器SSH的默认策略上。

服务器上的SSH守护进程(sshd)默认有个“小气”的设置:GatewayPorts no。这个设置意味着,通过 -R 创建的远程端口,默认只绑定在 127.0.0.1 这个本地回环地址上。所以,只有服务器自己能访问这个2222端口,外部请求一概被拒之门外。

解决办法很直接:

  • 登录你的服务器,打开 /etc/ssh/sshd_config 配置文件。
  • 找到 GatewayPorts 这一行(如果没有就手动添加)。
  • 将其值改为 clientspecified(推荐,更灵活)或 yes
  • 保存后,必须重启sshd服务sudo systemctl restart sshd

改完配置只是第一步。如果服务器启用了防火墙(比如Ubuntu的ufw),别忘了给隧道端口开个门:sudo ufw allow 2222。少了这一步,数据包照样会被挡在系统层面。

localhost 到底指谁?一个关键的语义陷阱

在反向隧道命令 -R 2222:localhost:22 里,这个 localhost 非常容易引起误解。它指的不是服务器的本地地址,而是发起这条SSH连接的那台内网机器

所以,这条命令的真实含义是:“在服务器上打开2222端口,把所有发往这个端口的请求,都通过这条SSH连接,转发回我(内网机)的22端口。”

这里有两个关键点:

  • 不要写成 127.0.0.1:如果你写成 -R 2222:127.0.0.1:22,SSH会忠实地把请求转发到服务器127.0.0.1:22,这通常不是你想要的。
  • 绑定地址的玄机:想让隧道端口能被其他机器访问(而不只是服务器自己),需要在命令中显式指定绑定地址。配合服务端 GatewayPorts clientspecified 的设置,命令应写成:ssh -R *:2222:localhost:22 user@server。这个星号(*)代表绑定到所有网络接口。

隧道老是断?别用循环脚本了,请上 Autossh

普通的SSH连接对网络波动很敏感,连接一断,隧道瞬间就没了。用while true循环去重连,不仅粗糙,还容易出各种奇怪问题。

专业的做法是使用 autossh。这个工具就是为保持SSH连接而生的,它会自动监控连接状态,并在断开时静默重连。

安装很简单:

  • Debian/Ubuntu: sudo apt install autossh
  • CentOS/RHEL: sudo yum install autossh

一个典型的启动命令如下:

autossh -M 0 -N -f -R *:2222:localhost:22 user@server

这里 -M 0 是禁用autossh自己的监控端口(避免冲突),依赖SSH客户端的 ServerAliveInterval 机制来检测存活。当然,前提是你已经配置好了SSH密钥免密登录,否则autossh会在后台卡在密码输入环节。

启动后,可以用 ps aux | grep autossh 检查进程,再用 netstat -tlnp | grep :2222服务器确认端口是否在正常监听。

隧道通了,连接却被拒绝?检查目标终点

有时候,从服务器localhost:2222 都成功,但从其他机器连 server:2222 却收到“Connection refused”。这通常说明,请求已经成功通过隧道抵达了你的内网机,但在最后一步被拦下了。

问题出在内网机这一侧:

  1. SSH服务是否在运行? 在内网机执行 ss -tlnp | grep :22,确认22端口处于监听状态(LISTEN)。
  2. 内网机的防火墙是否放行? 检查 sudo ufw status。如果防火墙活跃,确保22端口(或OpenSSH服务)在允许规则内。
  3. 云安全组别漏了:如果你的内网机也是云服务器(比如阿里云ECS),它的安全组规则必须允许22端口的入站流量。这一点很多人会忽略,总以为是跳板机(服务器)的安全组问题。
  4. SELinux的潜在干扰:对于RHEL或CentOS系统,SELinux可能会阻止反向隧道连接。可以尝试临时放宽策略:sudo setsebool -P ssh_sysadm_login on

Linux如何配置SSH反向隧道_Linux SSH反向隧道配置详解

说到底,配置SSH反向隧道就像打通一条多关卡的通道。从内网机的SSH服务、本地防火墙、云平台安全组,到服务器端的SSH配置、系统防火墙,每一环的地址绑定和端口策略都必须对齐。任何一个环节的默认值(比如那个关键的 GatewayPorts no)都可能让整个通道功亏一篑。理清这条链,问题自然就迎刃而解了。

本文转载于:https://www.php.cn/faq/2469573.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注