如何通过Linux SFTP实现端口转发,轻松实现远程访问的详细步骤和技巧?

更新于
2026-08-21 21:04:30
2阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

在日常运维中,远程文件传输往往是最频繁的操作之一。是当安装部署在私有网络或被防火墙屏蔽时直接使用默认的 SFTP往往会遇到“连不上服务器”或“端口被占用”的痛点。

说到使用者痛点一,网络不通导致连不上服务器

很多同事在内部网或云厂商 VPC 内访问外部 SFTP 时常遇到「Connection refused」或「Connection timed out」。至于这通常是因为,

如何通过Linux SFTP实现端口转发,轻松实现远程访问的详细步骤和技巧?
  • 服务器只开放了非标准端口
  • 公网 IP 被防火墙限制。只允许特定 IP 或子网访问
  • 本地机器被 NAT 或代理屏蔽了直连功能

至于使用者痛点二,手动配置 SSH 隧道繁琐且易出错

每次需要连接不同的服务时都要记住一串 ssh -L ... 命令,且命令行参数易忘、拼写错误,导致连接失败。是在多台机器、多服务交互时更是耗时耗力。

准备工作的观点是,确认 SSH 服务可用且已开启端口转发

确认目标主机已安装并启动 OpenSSH Server,而且配置允许端口转发:

# /etc/ssh/sshd_config
AllowTcpForwarding yes
PermitOpen any
# 重新启动后生效
sudo systemctl restart sshd

说到方法一。使用 SSH 命令行一次性完成本地与远程端口映射

假设你需要把本地的 2222 端口映射到远程服务器 example.com 的 SFTP 端口,同时目标 SFTP 使用非标准端口 60001,则可以执行:

# 建立隧道,将本地2222映射到远程SFTP
ssh -L 2222:example.com:60001
# 随后在另一个终端窗口中使用SFTP连接本地转发的2222号端口:
sftp -oPort=2222 localhost
# 或者直接指定:
sftp -P 2222 localhost

为什么这样做能解决连通性问题?

SSH 隧道会穿透 NAT 与防火墙,仅需保证 SSH 能连通即可;一旦隧道建立,本地就像直接访问目标服务器一样。

方法二这方面,利用 ~/.ssh/config 自动化设置隧道与 SFTP 链接

如果你经常需要同一台服务器。可以把隧道和 SFTP 的配置写进 .ssh/config只需一次命令就可以完成所有操作。

# ~/.ssh/config
Host my-sftp-tunnel
HostName example.com # 外部IP或域名
User your_user # 登录使用者名
Port 22 # SSH默认22,如果不是22请改成实际SSH监听端口
# 本地转发:把本机12345映射到远程example.com的SFTP
LocalForward 12345 localhost:60001
# 指定SFTP使用自定义Port
RemoteCommand sftp -oPort=12345 localhost
# 使用方式:
# 打开SSH会话。同时建立隧道并自动调用SFTP:
ssh my-sftp-tunnel -N # -N表示不执行远程命令,仅保持隧道打开
# 在另一个终端开始进入SFTP:
sftp -P12345 localhost # 自动连接已经映射好的本地12234号接口

至于优点,

  • 一次性配置,即可复用多次无需记忆长命令。
  • .config 支持多主机、多条隧道,管理方便。
  • SCP/SFTP等工具均可通过自定义Port调用,保持一致性。

验证连接是否成功及排查常见错误

  1. NAT/防火墙检查: 确保你的机器能够正常 ping 通外部主机。 例如 wget https://example.com/robots.txt
  2. Ssh日志查看: /var/log/auth.log /var/log/secure ,查看是否有 “Connection closed by” 等信息。
  3. <强度TCP监听检查: netstat -tln | grep :12345
  4. <强度SFTPD 日志: 查看 /var/log/auth.log 是否有 “Accepted publickey for …老实说,” 表示认证成功。
  5. <强度Error:“Connection refused” 或 “No route to host” 时: 检查是否正确指定了目标 IP + port,在 .config 中没有拼写错误;确认目标主机上对应服务已启动并监听该port。

小技巧 & 高级场景

  • SCP 同步文件夹快速同步:
    scp -r -P12345 ./local_folder username@localhost:/remote/path/

  • MFA 与密钥登录结合提高安全性: 使用 SSH 密钥 + 双因素 MFA 可确保即使有人截获流量也无法登录;配合隧道可以进一步隔离网络层面风险。
  • Multiplexing 提高效率: 在 .config 中添加
    KbdInteractiveAuntication no
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h:%p
    ControlPersist yes
    
    `即可让多次 sftp/shell 会话共享同一 TCP 链路。
  • Nginx+Stunnel + SFTP 混合方案: 如果公司内网对外仅暴露 HTTPS。可通过 Nginx+Stunnel 做 TLS 隧道,再将内部 SFTP 放置于 TLS 后面;此时只需将 Stunnel 的 HTTPS 输出映射到本地,接下来再按照这个方法进行链路跳转。
  • 通过上述步骤。你可以彻底摆脱因网络限制导致的“连不上服务器”的烦恼,实现从任意客户端对内部 SFTP 的安全访问。无论是单个项目还是团队协作,只要合理配置 SSH 隧道和 ~/.ssh/config。就能让文件传输变得既安全又端口转发,比较容易做到远程访问的详细步骤和技巧?" src="/img01/1348813907,3819915714&fm=253&fmt=auto&app=138&f=jpg"/>

    标签:Linux

    在日常运维中,远程文件传输往往是最频繁的操作之一。是当安装部署在私有网络或被防火墙屏蔽时直接使用默认的 SFTP往往会遇到“连不上服务器”或“端口被占用”的痛点。

    说到使用者痛点一,网络不通导致连不上服务器

    很多同事在内部网或云厂商 VPC 内访问外部 SFTP 时常遇到「Connection refused」或「Connection timed out」。至于这通常是因为,

    如何通过Linux SFTP实现端口转发,轻松实现远程访问的详细步骤和技巧?
    • 服务器只开放了非标准端口
    • 公网 IP 被防火墙限制。只允许特定 IP 或子网访问
    • 本地机器被 NAT 或代理屏蔽了直连功能

    至于使用者痛点二,手动配置 SSH 隧道繁琐且易出错

    每次需要连接不同的服务时都要记住一串 ssh -L ... 命令,且命令行参数易忘、拼写错误,导致连接失败。是在多台机器、多服务交互时更是耗时耗力。

    准备工作的观点是,确认 SSH 服务可用且已开启端口转发

    确认目标主机已安装并启动 OpenSSH Server,而且配置允许端口转发:

    # /etc/ssh/sshd_config
    AllowTcpForwarding yes
    PermitOpen any
    # 重新启动后生效
    sudo systemctl restart sshd
    

    说到方法一。使用 SSH 命令行一次性完成本地与远程端口映射

    假设你需要把本地的 2222 端口映射到远程服务器 example.com 的 SFTP 端口,同时目标 SFTP 使用非标准端口 60001,则可以执行:

    # 建立隧道,将本地2222映射到远程SFTP
    ssh -L 2222:example.com:60001
    # 随后在另一个终端窗口中使用SFTP连接本地转发的2222号端口:
    sftp -oPort=2222 localhost
    # 或者直接指定:
    sftp -P 2222 localhost
    

    为什么这样做能解决连通性问题?

    SSH 隧道会穿透 NAT 与防火墙,仅需保证 SSH 能连通即可;一旦隧道建立,本地就像直接访问目标服务器一样。

    方法二这方面,利用 ~/.ssh/config 自动化设置隧道与 SFTP 链接

    如果你经常需要同一台服务器。可以把隧道和 SFTP 的配置写进 .ssh/config只需一次命令就可以完成所有操作。

    # ~/.ssh/config
    Host my-sftp-tunnel
    HostName example.com # 外部IP或域名
    User your_user # 登录使用者名
    Port 22 # SSH默认22,如果不是22请改成实际SSH监听端口
    # 本地转发:把本机12345映射到远程example.com的SFTP
    LocalForward 12345 localhost:60001
    # 指定SFTP使用自定义Port
    RemoteCommand sftp -oPort=12345 localhost
    # 使用方式:
    # 打开SSH会话。同时建立隧道并自动调用SFTP:
    ssh my-sftp-tunnel -N # -N表示不执行远程命令,仅保持隧道打开
    # 在另一个终端开始进入SFTP:
    sftp -P12345 localhost # 自动连接已经映射好的本地12234号接口
    

    至于优点,

    • 一次性配置,即可复用多次无需记忆长命令。
    • .config 支持多主机、多条隧道,管理方便。
    • SCP/SFTP等工具均可通过自定义Port调用,保持一致性。

    验证连接是否成功及排查常见错误

    1. NAT/防火墙检查: 确保你的机器能够正常 ping 通外部主机。 例如 wget https://example.com/robots.txt
    2. Ssh日志查看: /var/log/auth.log /var/log/secure ,查看是否有 “Connection closed by” 等信息。
    3. <强度TCP监听检查: netstat -tln | grep :12345
    4. <强度SFTPD 日志: 查看 /var/log/auth.log 是否有 “Accepted publickey for …老实说,” 表示认证成功。
    5. <强度Error:“Connection refused” 或 “No route to host” 时: 检查是否正确指定了目标 IP + port,在 .config 中没有拼写错误;确认目标主机上对应服务已启动并监听该port。

    小技巧 & 高级场景

    • SCP 同步文件夹快速同步:
      scp -r -P12345 ./local_folder username@localhost:/remote/path/

  • MFA 与密钥登录结合提高安全性: 使用 SSH 密钥 + 双因素 MFA 可确保即使有人截获流量也无法登录;配合隧道可以进一步隔离网络层面风险。
  • Multiplexing 提高效率: 在 .config 中添加
    KbdInteractiveAuntication no
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h:%p
    ControlPersist yes
    
    `即可让多次 sftp/shell 会话共享同一 TCP 链路。
  • Nginx+Stunnel + SFTP 混合方案: 如果公司内网对外仅暴露 HTTPS。可通过 Nginx+Stunnel 做 TLS 隧道,再将内部 SFTP 放置于 TLS 后面;此时只需将 Stunnel 的 HTTPS 输出映射到本地,接下来再按照这个方法进行链路跳转。
  • 通过上述步骤。你可以彻底摆脱因网络限制导致的“连不上服务器”的烦恼,实现从任意客户端对内部 SFTP 的安全访问。无论是单个项目还是团队协作,只要合理配置 SSH 隧道和 ~/.ssh/config。就能让文件传输变得既安全又端口转发,比较容易做到远程访问的详细步骤和技巧?" src="/img01/1348813907,3819915714&fm=253&fmt=auto&app=138&f=jpg"/>

    标签:Linux