ssh(4)端口转发

在 Linux 中,SSH 端口转发是一种非常有用的技术,可以通过 SSH 连接将本地或远程的端口流量转发到指定目标

SSH 端口转发的三种主要类型

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

将本地计算机的某个端口转发到远程服务器或远程服务器可访问的另一台机器。

语法:

1
ssh -L [本地地址:]本地端口:目标地址:目标端口 用户名@远程服务器

示例:

1
ssh -L 8080:localhost:80 [email protected]

解释:将本地计算机的 8080 端口转发到远程服务器的 80 端口。访问 localhost:8080 时,流量会通过 SSH 隧道到达远程服务器的 80 端口。

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

将远程服务器的某个端口转发到本地计算机或本地网络中的另一台机器。

语法:

1
ssh -R [远程地址:]远程端口:目标地址:目标端口 用户名@远程服务器

示例:

1
ssh -R 9000:localhost:3000 [email protected]

解释:远程服务器的 9000 端口会被转发到本地计算机的 3000 端口。远程服务器上的客户端访问 remote-server:9000 时,流量会到达本地主机的 3000 端口。

注意:需要远程服务器的 SSH 配置中启用 GatewayPorts(默认是 no),否则只能在本机(远程服务器)上访问转发端口。修改 /etc/ssh/sshd_config

GatewayPorts yes

然后重启 SSH 服务:sudo systemctl restart sshd

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

通过 SOCKS 代理动态转发流量,适用于需要访问多个目标的情况。

语法:

1
ssh -D [本地地址:]本地端口 用户名@远程服务器

示例:

1
ssh -D 1080 [email protected]

解释:在本地计算机的 1080 端口创建一个 SOCKS5 代理,应用程序可以通过此代理访问远程网络中的任意地址。

常用选项

  • -f:让 SSH 在后台运行。
  • -N:不执行远程命令,仅进行端口转发。
  • -g:允许其他主机连接转发的端口(适用于本地或远程转发)。
  • -p:指定远程服务器的 SSH 端口(如果不是默认的 22)。

实际示例

  1. 本地转发 - 访问远程内网服务
    假设远程服务器是跳板机,想访问其内网的数据库(192.168.1.100:3306):

    1
    ssh -L 3306:192.168.1.100:3306 [email protected]

    然后在本地通过 localhost:3306 连接数据库。

  2. 远程转发 - 暴露本地服务给远程访问
    将本地 Web 服务(localhost:8080)暴露给远程服务器:

    1
    ssh -R 8080:localhost:8080 [email protected]

    远程服务器上的用户访问 remote-server:8080 即可看到本地 Web 服务。

  3. 动态转发 - 配置浏览器代理
    使用动态转发访问远程网络:

    1
    ssh -D 1080 -fN [email protected]

    配置浏览器使用 SOCKS5 代理(localhost:1080),即可通过远程服务器访问网络。

注意事项

  • 安全性:端口转发可能暴露服务,建议使用强密码或密钥认证。
  • 防火墙:确保本地和远程的防火墙允许相关端口流量。
  • 持久化:如果需要保持转发,可以结合 autossh 工具实现自动重连。