SSH隧道与autossh全攻略:本地访问非公网服务的安全方案
前言:在开发/运维过程中,经常会遇到“服务器服务不想暴露公网,但本地需要访问”的场景(比如测试环境服务、内网数据库等)。 SSH隧道是解决这个问题的最优方案之一——无需额外部署代理,仅通过SSH加密通道即可实现本地访问,配合autossh还能实现隧道自动重连,稳定又安全。 本文整理了SSH隧道的核心用法、参数说明、autossh配置,以及常见问题解决方案,适合收藏备用。
📚 目录导航
- 一、SSH 隧道核心介绍
- 二、SSH 隧道常用类型与命令(重点)
- 三、SSH 隧道通用扩展参数
- 四、SSH 隧道常用操作(检查 / 关闭 / 免密)
- 五、autossh:实现隧道自动重连(持久化关键)
- 六、常见问题与解决方案(避坑指南)
- 七、快速查找索引(遗忘时直接翻这里)
- 八、总结与最佳实践
一、SSH 隧道核心介绍
1. 核心作用
通过 SSH 加密通道,将 远程服务器 / 内网服务 的端口映射到 本地机器,实现:
- 本地通过
localhost:本地端口访问远程非公网服务 - 无需将远程服务暴露公网,仅需服务器开放 SSH 端口
- 传输全程加密,安全性极高
2. 核心原理
在 本地机器 与 远程服务器 之间建立加密的数据转发通道:
- 本地向
localhost:本地端口发起请求 - 请求经 SSH 隧道转发至
远程目标IP:端口 - 远程服务处理请求
- 响应通过隧道返回本地
👉 对使用者 完全透明,体验等同访问本地服务。
3. 关键前提(必须满足)
- 本地可通过 SSH 登录远程服务器
- 远程服务器已开启 SSH 服务
- 远程服务监听本地 / 内网 IP(如
127.0.0.1:35628)
二、SSH 隧道常用类型与命令(重点)
SSH 隧道主要分为 三种类型:
类型 1:本地端口转发(-L)【最常用】
适用场景: 本地访问 远程服务器上的本地服务
✅ 基础命令格式
ssh -L 本地端口:远程目标IP:远程目标端口 用户名@服务器公网IP
参数说明
| 参数 | 作用 | 示例 |
|---|---|---|
-L |
本地端口转发 | 固定 |
| 本地端口 | 本地未占用端口 | 35628 |
| 远程目标IP | 服务所在 IP | 127.0.0.1 |
| 远程目标端口 | 服务端口 | 35628 |
| 用户名@IP | SSH 登录信息 | thkj@1.2.3.4 |
💡 后台运行(推荐)
ssh -fN -L 本地端口:远程目标IP:远程目标端口 用户名@服务器IP
📌 实际示例
ssh -fN -L 35628:127.0.0.1:35628 thkj@1.2.3.4
curl http://localhost:35628/actuator/health
类型 2:远程端口转发(-R)【进阶】
适用场景: 让 远程服务器访问本地服务
ssh -fN -R 9090:127.0.0.1:8080 thkj@1.2.3.4
👉 远程服务器访问 localhost:9090 即访问本地 8080
类型 3:动态端口转发(-D)【进阶】
适用场景: SOCKS5 代理(访问远程内网 / 网络代理)
ssh -fN -D 1080 thkj@1.2.3.4
浏览器代理:127.0.0.1:1080
三、SSH 隧道通用扩展参数
| 参数 | 作用 | 示例 |
|---|---|---|
-p |
SSH 非默认端口 | -p 2222 |
-i |
指定私钥 | -i ~/.ssh/id_rsa_xxx |
ServerAliveInterval |
心跳间隔 | 60 |
ServerAliveCountMax |
心跳失败次数 | 3 |
示例组合
ssh -fN \
-p 2222 \
-i ~/.ssh/id_rsa_thkj \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
-L 35628:127.0.0.1:35628 \
thkj@1.2.3.4
四、SSH 隧道常用操作(检查 / 关闭 / 免密)
1️⃣ 检查隧道是否存活
lsof -i:35628
ps aux | grep ssh | grep 35628
2️⃣ 关闭隧道
lsof -i:35628 | grep ssh | awk '{print $2}' | xargs kill -9
3️⃣ SSH 免密登录(强烈推荐)
ssh-keygen -t rsa
ssh-copy-id thkj@1.2.3.4
非默认端口:
ssh-copy-id -p 2222 thkj@1.2.3.4
五、autossh:实现隧道自动重连(持久化关键)
1. autossh 解决什么问题?
- 网络抖动 / WiFi 切换
- SSH 超时
- 服务器重启
👉 自动检测并重连 SSH 隧道
2. 安装 autossh
# Ubuntu / Debian
sudo apt install autossh -y
# macOS
brew install autossh
3. autossh 基础命令
autossh -M 20000 -fN -L 35628:127.0.0.1:35628 thkj@1.2.3.4
4. 常用参数说明
| 参数 | 作用 |
|---|---|
-M |
监控端口(本地) |
-L/-R/-D |
SSH 隧道参数 |
-fN |
后台 + 仅隧道 |
5. autossh 示例
autossh -M 0 \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
-fN \
-L 35628:127.0.0.1:35628 \
thkj@1.2.3.4
6. autossh 常用操作
ps aux | grep autossh
lsof -i:35628
关闭:
pkill autossh
7. Ubuntu 开机自启(示例)
sudo nano /etc/rc.local
#!/bin/bash
sleep 10
autossh -M 20000 -fN -o ServerAliveInterval=60 -L 35628:127.0.0.1:35628 thkj@1.2.3.4
exit 0
sudo chmod +x /etc/rc.local
六、常见问题与解决方案(避坑指南)
❓ 端口被占用
bind: Address already in use
➡ 更换本地端口
❓ 连接拒绝
curl: (7) Failed to connect
排查:
- 服务是否运行
- 目标 IP 是否为
127.0.0.1 - 服务是否监听本地地址
❓ autossh 仍断连
- 缩短心跳间隔
- 检查
/etc/ssh/sshd_config
sudo systemctl restart sshd
七、快速查找索引(遗忘时直接翻这里)
| 需求 | 命令 |
|---|---|
| 本地 → 远程服务 | ssh -fN -L |
| 自动重连 | autossh -M -L |
| 检查隧道 | lsof -i |
| 关闭隧道 | kill / pkill |
| 免密登录 | ssh-copy-id |
八、总结与最佳实践
推荐组合
| 场景 | 推荐方案 |
|---|---|
| 临时访问 | ssh -fN -L |
| 长期使用 | autossh + 心跳 + 自启 |
| 远程访问本地 | ssh -R |
| SOCKS5 代理 | ssh -D |
最佳实践
- ✅ 永远使用 免密登录
- ✅ 长期隧道用 autossh
- ✅ 服务只监听
127.0.0.1 - ✅ 本地端口与远程端口保持一致
- ✅ 收藏本文索引章节
SSH 隧道是开发 / 运维的必备技能: 零部署、强安全、低成本。
搭配 autossh 后,几乎可以替代所有复杂代理方案。
如需:
- 博客发布版(掘金 / CSDN / 语雀)
- 精简速查版 Cheat Sheet
- 图解版 SSH 隧道原理图
直接告诉我 👍
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 小黎同志
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果