Skip to content

SSH 端口转发

1. SSH 隧道基础概念

SSH 隧道(SSH Tunneling)是通过 SSH 协议加密的通道,实现不同网络环境间的端口转发或流量代理。它常用于以下场景:

  • 访问内网服务(如数据库、Web 服务)
  • 绕过防火墙限制
  • 加密不安全协议的通信(如 VNC、HTTP)
text
+-------------+      SSH 加密通道      +-------------+
|  本地计算机  | <-------------------> |  SSH 服务器  |
+-------------+                       +-------------+
       |                                     |
       V                                     V
 目标服务/网络                           目标服务/网络

2. 本地端口转发(Local Port Forwarding)

将远程服务映射到本地端口

2.1 典型场景

访问公司内网数据库(如 MySQL),假设:

  • SSH 服务器地址:jump.example.com
  • 内网数据库地址:db.internal:3306

2.2 命令示例

bash
ssh -L 3307:db.internal:3306 user@jump.example.com -N

参数说明:

  • -L [本地IP:]本地端口:目标主机:目标端口
  • -N 表示不执行远程命令

2.3 验证使用

bash
mysql -h 127.0.0.1 -P 3307 -u dbuser -p

3. 远程端口转发(Remote Port Forwarding)

将本地服务暴露到远程服务器

3.1 典型场景

本地开发环境(如运行在 localhost:3000 的 Web 应用)需要临时对外提供访问

3.2 命令示例

将本地 localhost:3000 映射到远程服务器的 8080 端口:

bash
ssh -R 8080:localhost:3000 user@jump.example.com

映射本地 Clash 端口到远程服务器的 7890 端口:

bash
ssh -NfR 7890:localhost:7890 user@jump.example.com

在服务器上配置代理即可使用代理访问网络:

bash
export https_proxy=socks5://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890

参数说明:

  • -R [远程IP:]远程端口:目标主机:目标端口
  • -N 表示不执行远程命令
  • -f 表示后台运行

3.3 服务端配置

需在 SSH 服务器 /etc/ssh/sshd_config 添加:

text
GatewayPorts yes

然后重启服务:

bash
sudo systemctl restart sshd

4. 动态端口转发(Dynamic Port Forwarding)

创建 SOCKS5 代理通道

4.1 典型场景

通过公司代理访问多个内网系统(如 Jira、GitLab)

4.2 命令示例

bash
ssh -D 1080 user@jump.example.com

4.3 客户端配置

浏览器设置 SOCKS5 代理:

text
地址:127.0.0.1
端口:1080

5. 高级用法示例

5.1 多跳转发

访问需要通过两个跳板机的服务:

bash
ssh -L 3307:db.internal:3306 user@jump1.example.com \
  -t ssh -L 3306:db.internal:3306 user@jump2.internal

5.2 保持连接

使用 autossh 自动重连:

bash
autossh -M 0 -L 3307:db.internal:3306 user@jump.example.com

6. 安全注意事项

  1. 密钥认证优于密码认证:
    bash
    ssh-keygen -t ed25519
    ssh-copy-id user@jump.example.com
  2. 限制转发范围:
    text
    # /etc/ssh/sshd_config
    PermitOpen any:3306
  3. 监控隧道使用:
    bash
    netstat -tulpn | grep 'ssh'

7. 常见问题排查

通过以上方法,您可以灵活运用 SSH 隧道解决各种网络访问问题。建议结合 -v 参数查看详细日志进行调试:

bash
ssh -v -L 3307:db.internal:3306 user@jump.example.com