SSH 端口转发(Port Forwarding)是一种强大的功能,允许通过 SSH 加密隧道转发网络流量,保护不安全协议的数据传输。
端口转发类型
1. 本地端口转发(Local Port Forwarding)
将本地端口的流量通过 SSH 隧道转发到远程服务器。
bash# 基本语法 ssh -L [本地地址:]本地端口:目标主机:目标端口 用户@SSH服务器 # 示例1:访问远程服务器的 MySQL(端口 3306) ssh -L 3306:localhost:3306 user@remote-server # 示例2:访问远程网络中的内网服务 ssh -L 8080:192.168.1.50:80 user@jump-host # 示例3:绑定到特定本地地址 ssh -L 127.0.0.1:8080:localhost:80 user@remote-server
使用场景:
- 访问远程服务器的数据库
- 访问内网 Web 服务
- 绕过防火墙限制
2. 远程端口转发(Remote Port Forwarding)
将远程服务器的端口流量通过 SSH 隧道转发到本地。
bash# 基本语法 ssh -R [远程地址:]远程端口:目标主机:目标端口 用户@SSH服务器 # 示例1:让远程服务器访问本地 Web 服务 ssh -R 8080:localhost:80 user@remote-server # 示例2:绑定到远程服务器所有接口 ssh -R 0.0.0.0:8080:localhost:80 user@remote-server # 示例3:持久化转发(需要服务器配置 GatewayPorts yes) ssh -g -R 8080:localhost:80 user@remote-server
使用场景:
- 内网穿透
- 远程调试本地服务
- 暴露本地服务到公网
3. 动态端口转发(Dynamic Port Forwarding)
创建 SOCKS 代理,动态转发流量。
bash# 基本语法 ssh -D 本地端口 用户@SSH服务器 # 示例:创建 SOCKS5 代理 ssh -D 1080 user@proxy-server # 示例:绑定到特定地址 ssh -D 127.0.0.1:1080 user@proxy-server
使用场景:
- 浏览器代理
- 绕过网络审查
- 匿名访问
实际应用示例
场景1:安全访问远程数据库
bash# 创建隧道 ssh -L 3307:db-server:3306 user@jump-host # 在另一个终端连接数据库 mysql -h 127.0.0.1 -P 3307 -u dbuser -p
场景2:内网穿透
bash# 在本地机器执行 ssh -N -R 8080:localhost:3000 user@public-server # 现在可以通过 public-server:8080 访问本地服务
场景3:浏览器代理
bash# 创建 SOCKS 代理 ssh -D 1080 -N user@proxy-server # 配置浏览器使用 SOCKS5 代理:127.0.0.1:1080
高级配置
1. 服务器端配置
在 /etc/ssh/sshd_config 中:
bash# 允许远程端口转发绑定到所有接口 GatewayPorts yes # 允许 TCP 转发 AllowTcpForwarding yes
2. 持久化连接
bash# 使用 autossh 保持连接 autossh -M 0 -L 3306:localhost:3306 user@remote-server -N # 或使用 ServerAliveInterval ssh -o ServerAliveInterval=60 -L 3306:localhost:3306 user@remote-server -N
3. 后台运行
bash# 使用 -N 参数(不执行远程命令) ssh -N -L 3306:localhost:3306 user@remote-server # 使用 -f 参数(后台运行) ssh -f -N -L 3306:localhost:3306 user@remote-server
安全注意事项
- 限制访问:只绑定到 localhost(127.0.0.1)
- 使用防火墙:限制端口访问权限
- 定期检查:监控活动的端口转发
- 使用密钥认证:避免密码认证
- 限制用户:只允许受信任用户使用端口转发
故障排查
bash# 查看端口监听状态 netstat -tuln | grep 3306 # 测试连接 telnet localhost 3306 # 查看 SSH 日志 tail -f /var/log/auth.log
最佳实践
- 使用
-N参数避免执行远程命令 - 使用
-f参数后台运行 - 配置
ServerAliveInterval保持连接活跃 - 使用
autossh自动重连 - 在配置文件中预设常用转发规则
- 定期审计端口转发配置