SSH 隧道端口转发完整教程
SSH 隧道(SSH Tunneling)是一种通过加密的 SSH 连接转发网络流量的技术。它可以将本地端口映射到远程服务器,或者将远程端口映射到本地,从而安全地访问远程服务。在搬瓦工 VPS 上,SSH 隧道常用于安全访问数据库、管理面板,以及穿透防火墙限制。本教程将详细讲解三种 SSH 转发方式。
一、SSH 隧道类型概览
- 本地转发(-L):将本地端口的流量转发到远程服务器可达的目标地址。
- 远程转发(-R):将远程服务器端口的流量转发到本地可达的目标地址。
- 动态转发(-D):在本地创建 SOCKS 代理,所有流量通过 SSH 隧道转发。
二、本地端口转发(-L)
本地转发的典型场景是:你想访问搬瓦工 VPS 上仅监听 127.0.0.1 的服务(如 MySQL、Redis)。
2.1 基本语法
ssh -L 本地端口:目标地址:目标端口 用户名@VPS地址
2.2 实际示例
# 访问远程 MySQL(仅监听 localhost:3306)
ssh -L 3306:127.0.0.1:3306 root@your-vps-ip
# 现在可以用本地工具连接 localhost:3306 访问远程 MySQL
# 访问远程 Redis
ssh -L 6379:127.0.0.1:6379 root@your-vps-ip
# 访问远程 Web 管理面板
ssh -L 8080:127.0.0.1:8080 root@your-vps-ip
# 浏览器打开 http://localhost:8080
# 通过 VPS 访问内网其他机器
ssh -L 5432:192.168.1.100:5432 root@your-vps-ip
# 通过 VPS 跳转访问内网的 PostgreSQL
2.3 后台运行
# -f 后台运行,-N 不执行远程命令
ssh -f -N -L 3306:127.0.0.1:3306 root@your-vps-ip
# 查找后台 SSH 隧道进程
ps aux | grep "ssh -f"
# 终止隧道
kill $(pgrep -f "ssh -f -N -L 3306")
三、远程端口转发(-R)
远程转发将 VPS 上的端口流量导回本地。典型场景是:让外网通过 VPS 访问你本地开发中的 Web 应用。
3.1 基本语法
ssh -R 远程端口:本地地址:本地端口 用户名@VPS地址
3.2 实际示例
# 将 VPS 的 8080 端口转发到本地的 3000 端口
ssh -R 8080:127.0.0.1:3000 root@your-vps-ip
# 访问 http://your-vps-ip:8080 即可看到本地应用
# 后台运行
ssh -f -N -R 8080:127.0.0.1:3000 root@your-vps-ip
3.3 配置允许外部访问
默认情况下远程转发只监听 VPS 的 localhost。要允许外部访问,需要修改 SSH 配置:
# 编辑 VPS 上的 SSH 配置
vi /etc/ssh/sshd_config
# 添加或修改以下行
GatewayPorts yes
# 重启 SSH 服务
systemctl restart sshd
然后使用绑定地址:
ssh -R 0.0.0.0:8080:127.0.0.1:3000 root@your-vps-ip
四、动态端口转发(-D)
动态转发在本地创建一个 SOCKS5 代理服务器,所有流量通过 SSH 隧道加密传输。
4.1 基本用法
# 创建 SOCKS5 代理
ssh -D 1080 root@your-vps-ip
# 后台运行
ssh -f -N -D 1080 root@your-vps-ip
# 使用代理(命令行工具)
curl --socks5 127.0.0.1:1080 https://example.com
# 使用代理(环境变量)
export ALL_PROXY=socks5://127.0.0.1:1080
curl https://example.com
五、跳板机(ProxyJump)
当目标服务器不能直接访问时,可以通过中间的搬瓦工 VPS 作为跳板:
5.1 命令行方式
# 通过跳板机连接目标服务器
ssh -J root@jump-vps-ip root@target-server-ip
# 多级跳转
ssh -J root@jump1-ip,root@jump2-ip root@target-ip
5.2 SSH Config 配置
# 编辑 ~/.ssh/config
Host jump-server
HostName your-vps-ip
User root
Port 22
IdentityFile ~/.ssh/id_rsa
Host internal-server
HostName 192.168.1.100
User admin
ProxyJump jump-server
Host db-server
HostName 192.168.1.200
User root
ProxyJump jump-server
LocalForward 3306 127.0.0.1:3306
配置完成后可以直接使用别名连接:
ssh internal-server
ssh db-server
六、SSH 隧道保活与自动重连
6.1 SSH 配置保活
# 编辑 ~/.ssh/config(客户端)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
6.2 使用 autossh 自动重连
# 安装 autossh
apt install autossh -y
# 使用 autossh 建立自动重连的隧道
autossh -M 20000 -f -N -L 3306:127.0.0.1:3306 root@your-vps-ip
# -M 20000:监控端口,用于检测连接是否存活
6.3 使用 Systemd 管理隧道
# 创建 Systemd 服务文件
cat > /etc/systemd/system/ssh-tunnel.service <<EOF
[Unit]
Description=SSH Tunnel to VPS
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/autossh -M 0 -N -o "ServerAliveInterval=60" -o "ServerAliveCountMax=3" -L 3306:127.0.0.1:3306 root@your-vps-ip
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# 启动并设置开机自启
systemctl daemon-reload
systemctl enable ssh-tunnel
systemctl start ssh-tunnel
systemctl status ssh-tunnel
七、安全注意事项
- 使用密钥认证:隧道场景中建议使用 SSH 密钥而非密码,既安全又方便自动化。
- 限制转发权限:在
sshd_config中使用AllowTcpForwarding控制谁可以建立隧道。 - 绑定地址:本地转发默认绑定 127.0.0.1,避免不必要地绑定 0.0.0.0。
- 防火墙配置:远程转发端口需要在 VPS 防火墙中放行。
# 只允许特定用户使用隧道(VPS 上配置)
# /etc/ssh/sshd_config
Match User tunnel-user
AllowTcpForwarding yes
X11Forwarding no
PermitTTY no
ForceCommand /bin/false
八、常见问题排查
# 隧道端口被占用
ss -tlnp | grep 3306
# 更换本地端口即可
# 连接超时
ssh -v -L 3306:127.0.0.1:3306 root@your-vps-ip
# -v 显示详细调试信息
# 远程转发不生效
# 检查 sshd_config 中 GatewayPorts 设置
grep GatewayPorts /etc/ssh/sshd_config
# 权限被拒绝(1024 以下端口需要 root)
ssh -L 80:127.0.0.1:80 root@your-vps-ip
# 改用高端口如 8080
总结
SSH 隧道是搬瓦工 VPS 运维中非常实用的技术,能够安全地穿透网络边界访问各种服务。本地转发用于访问远程服务,远程转发用于暴露本地服务,动态转发用于创建 SOCKS 代理。配合 autossh 和 Systemd 可以实现隧道的持久化运行。建议同时参考 VPS 基础管理教程了解更多 SSH 使用技巧。选购搬瓦工 VPS 请查看全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 循环折扣。