文章

🔄 Linux端口转发

使用 SSH 进行本地端口转发的简单方法

🔄 Linux端口转发

SSH 端口转发简介

SSH 提供了三种强大的端口转发(端口映射)功能,可以帮助我们建立安全的网络通道:

  1. 本地转发(Local Forwarding)
  2. 远程转发(Remote Forwarding)
  3. 动态转发(Dynamic Forwarding)

本地端口转发

本地转发最常用,它允许将本地端口的连接转发到远程服务器。当你访问本地的 127.0.0.1:本地端口 时,流量会通过 SSH 通道转发到 目标主机:目标端口

基本语法

1
ssh -L [本地IP:]本地端口:目标主机:目标端口 跳板机用户名@跳板机IP

常用参数说明

  • -L:指定本地端口转发
  • -C:启用压缩
  • -f:后台运行
  • -N:不执行远程命令
  • -g:允许远程主机连接本地转发的端口

实际示例

  1. 最简单的本地转发:
    1
    
    ssh -L 8080:localhost:80 [email protected]
    
  2. 使用后台模式(常用):
    1
    
    ssh -CfNg -L 8080:target.server:80 [email protected]
    
  3. 指定本地IP(允许其他机器访问):
    1
    
    ssh -CfNg -L 0.0.0.0:8080:target.server:80 [email protected]
    

远程端口转发

远程转发允许将远程服务器的端口转发到本地机器,常用于内网穿透场景。

基本语法

1
ssh -R [远程IP:]远程端口:目标主机:目标端口 跳板机用户名@跳板机IP

实际示例

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

动态端口转发

动态转发创建一个 SOCKS 代理,所有应用程序都可以使用这个代理访问远程网络。

基本语法

1
ssh -D [本地IP:]本地端口 跳板机用户名@跳板机IP

实际示例

1
ssh -CfNg -D 1080 [email protected]

常见使用场景

  1. 访问内网服务
    1
    2
    
    # 通过跳板机访问内网服务器
    ssh -L 8080:internal.server:80 [email protected]
    
  2. 数据库远程访问
    1
    2
    
    # 本地访问远程数据库
    ssh -L 3306:localhost:3306 [email protected]
    
  3. 内网穿透
    1
    2
    
    # 将内网服务暴露到公网
    ssh -R 8080:localhost:80 [email protected]
    
  4. 科学上网
    1
    2
    
    # 创建 SOCKS5 代理
    ssh -D 1080 [email protected]
    

故障排查

  1. 连接被拒绝
    • 检查防火墙设置
    • 确认目标端口是否开放
    • 验证 SSH 服务器配置是否允许端口转发
  2. 连接断开
    • 添加心跳包保持连接:
      1
      
      ssh -o ServerAliveInterval=60 -L 8080:target:80 user@server
      
  3. 权限问题
    • 确认是否有目标端口的访问权限
    • 检查 SELinux 设置

安全建议

  1. 避免使用 0.0.0.0 绑定所有接口,除非必要
  2. 设置强密码或使用密钥认证
  3. 限制端口转发的 IP 范围
  4. 定期更新 SSH 服务器和客户端
  5. 使用防火墙限制端口访问

持久化配置

~/.ssh/config 中添加配置可以简化命令:

1
2
3
4
5
6
Host tunnel
    HostName remote.server
    User username
    LocalForward 8080 target:80
    ServerAliveInterval 60
    ServerAliveCountMax 3

之后只需要执行:

1
ssh tunnel

参考资料

本文由作者按照 CC BY 4.0 进行授权