前言:在开发/运维过程中,经常会遇到“服务器服务不想暴露公网,但本地需要访问”的场景(比如测试环境服务、内网数据库等)。 SSH隧道是解决这个问题的最优方案之一——无需额外部署代理,仅通过SSH加密通道即可实现本地访问,配合autossh还能实现隧道自动重连,稳定又安全。 本文整理了SSH隧道的核心用法、参数说明、autossh配置,以及常见问题解决方案,适合收藏备用。


📚 目录导航


一、SSH 隧道核心介绍

1. 核心作用

通过 SSH 加密通道,将 远程服务器 / 内网服务 的端口映射到 本地机器,实现:

  • 本地通过 localhost:本地端口 访问远程非公网服务
  • 无需将远程服务暴露公网,仅需服务器开放 SSH 端口
  • 传输全程加密,安全性极高

2. 核心原理

本地机器远程服务器 之间建立加密的数据转发通道:

  1. 本地向 localhost:本地端口 发起请求
  2. 请求经 SSH 隧道转发至 远程目标IP:端口
  3. 远程服务处理请求
  4. 响应通过隧道返回本地

👉 对使用者 完全透明,体验等同访问本地服务。


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 隧道原理图

直接告诉我 👍