让 SSH 反向隧道断了自己爬起来:我的保活做法
【摘要】 家里和实验室的设备大多没有公网 IP,想从外网 SSH 回去,SSH 反向隧道是最省事的办法:不需要装任何穿透软件,一条命令就够。ssh -N -R 2222:localhost:22 user@你的公网服务器内网机器主动连向公网服务器,并在服务器上把 2222 端口反向转发回自己的 22 端口。之后在任何地方 ssh -p 2222 user@公网服务器 就能连回内网设备。但隧道建起来只是...
家里和实验室的设备大多没有公网 IP,想从外网 SSH 回去,SSH 反向隧道是最省事的办法:不需要装任何穿透软件,一条命令就够。
ssh -N -R 2222:localhost:22 user@你的公网服务器
内网机器主动连向公网服务器,并在服务器上把 2222 端口反向转发回自己的 22 端口。之后在任何地方 ssh -p 2222 user@公网服务器 就能连回内网设备。
但隧道建起来只是第一步。实际用下来,连接总会断:出口网络抖动、运营商 NAT 老化、有些代理对单条连接还有时长上限,超了直接切断。靠手动重连不现实,我的做法是让它断线自动恢复:
- 加上存活探测:
ServerAliveInterval=20、ServerAliveCountMax=3,连接假死时能及时发现;再加ExitOnForwardFailure=yes,端口转发失败就让进程直接退出,不要留着一条"看起来活着、其实不通"的假连接。 - 外层套一个保活循环:用脚本或系统服务托管这条 ssh 命令,进程退出就重启。注意重连间隔别写死成几秒猛冲:隧道从未连通时用指数退避(5 秒、10 秒、20 秒……最长 5 分钟),已建立的连接断开才快速重连。之前吃过亏,固定 5 秒重试把出口代理打到长时间不可用。
- 状态留痕:每次建立、断开都写一行带时间戳的日志。出了问题先看日志确认是断线、重连失败还是端口被占,不要凭感觉猜。
踩过的一个坑:旧连接断开后,服务器上残留的会话可能还占着 2222 端口,新连接会报 remote port forwarding failed for listen port 2222。这种情况一般等几分钟旧会话超时释放就好,急的话上服务器把残留会话清掉。
安全上补几句:隧道用专门的低权限账号,只允许密钥登录;服务器侧可以用 GatewayPorts 控制转发端口的绑定范围;内网机器的 SSH 本身也要关掉密码登录、改掉默认端口。
总结就是:反向隧道本身很简单,能不能长期稳定用,全看保活做得细不细。把重连、退避和日志这三件事处理好,它基本可以做到无人值守。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)