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. 安全注意事项
- 密钥认证优于密码认证:bash
ssh-keygen -t ed25519 ssh-copy-id user@jump.example.com
- 限制转发范围:text
# /etc/ssh/sshd_config PermitOpen any:3306
- 监控隧道使用:bash
netstat -tulpn | grep 'ssh'
7. 常见问题排查
通过以上方法,您可以灵活运用 SSH 隧道解决各种网络访问问题。建议结合 -v
参数查看详细日志进行调试:
bash
ssh -v -L 3307:db.internal:3306 user@jump.example.com