当前位置:首页 > 未分类 > 正文内容

通过云主机SSH 反向端口转发访问无公网ip电脑的服务

xiaorui3个月前 (08-13)未分类45

利用 SSH 反向端口转发:轻松实现本地服务远程访问

在日常开发或服务器管理中,我们经常需要将本地服务暴露给外部网络访问,比如让客户临时访问你的本地开发环境,或者在没有公网 IP 的情况下让远程服务器访问内网服务。这时,SSH 反向端口转发就是一个简单高效的解决方案。本文将以实际命令为例,详细讲解其原理与应用。

什么是 SSH 反向端口转发?

SSH 端口转发分为本地端口转发反向端口转发


  • 本地端口转发:将远程服务映射到本地端口(如访问 localhost:8080 相当于访问远程服务器的 80 端口)。

  • 反向端口转发:将本地服务映射到远程服务器端口(如让远程服务器的 8888 端口指向你的本地 2202 端口)。


简单来说,反向端口转发能让外部网络通过远程服务器访问你本地的服务,这在本地设备没有公网 IP 时非常有用。

实战命令解析:一行代码实现反向转发

我们以这个命令为例,逐步拆解其作用:


bash
ssh -R 0.0.0.0:8888:localhost:2202 root@8.9.10.11 -p 22 -N -f

各参数含义详解:

  1. -R:表示启用反向端口转发,格式为 远程地址:远程端口:本地地址:本地端口
    • 0.0.0.0:8888:指定远程服务器的 8888 端口作为入口,0.0.0.0 表示允许远程服务器的所有网络接口访问(包括公网 IP)。

    • localhost:2202:表示将远程 8888 端口的请求转发到本地的 22 端口(本地服务运行的端口)。

  2. root@8.9.10.11:远程服务器的登录信息,root 是用户名,8.9.10.11 是远程服务器的公网 IP。
  3. -p 22:指定连接远程服务器的 SSH 端口(默认是 22,这里是自定义端口)。
  4. -N:表示不执行远程命令,仅用于端口转发(纯转发模式,不登录远程 shell)。
  5. -f:表示在后台运行 SSH 进程,不占用当前终端。

执行效果:远程访问本地服务

命令执行成功后,会在远程服务器上建立一个 “通道”:


  • 当有人访问远程服务器的 8.9.10.11:8888 时,请求会被自动转发到你的本地 localhost:22

  • 例如:如果你的本地 2202 端口运行着一个 Web 服务,那么通过 http://8.9.10.11:8888 就能访问这个本地服务。

操作步骤与注意事项

1. 前提条件

  • 本地设备已安装 SSH 客户端(Linux/macOS 内置,Windows 可使用 PowerShell 或 PuTTY)。

  • 拥有一台带公网 IP 的远程服务器(如 VPS),并能通过 SSH 登录(需知道 IP、端口、用户名和密码 / 密钥)。

  • 本地 22 端口已运行服务(如 Web 服务器、数据库等)。

2. 执行命令并验证

  1. 在本地终端执行上述命令,首次连接需确认远程服务器指纹(输入 yes),并输入远程服务器的登录密码。
  2. 验证转发是否生效:
    • 登录远程服务器,执行 netstat -tuln | grep 8888,若看到 0.0.0.0:8888 处于监听状态,说明转发成功。

    • 从外部设备访问 远程服务器IP:8888,测试是否能连接到本地服务。

3. 常见问题与解决

  • “端口被占用” 错误:远程服务器 8888 端口已被其他程序使用,可更换为其他端口(如 8080)。

  • 无法从外部访问:检查远程服务器防火墙是否开放 8888 端口,或 SSH 服务器配置是否允许反向转发。

    • 需在远程服务器的 /etc/ssh/sshd_config 中确保 GatewayPorts yes(默认可能为 no 或 clientspecified),修改后重启 sshd 服务。

  • 连接断开:SSH 连接可能因超时断开,可配合 autossh 工具实现自动重连(需额外安装)。

4. 安全最佳实践

  • 避免明文密码:命令中直接输入密码会暴露在历史记录中,建议配置 SSH 密钥登录(免密码且更安全):

    bash
    # 本地生成密钥对(一路回车)ssh-keygen -t ed25519# 将公钥上传到远程服务器ssh-copy-id -p 2202 root@8.9.10.11


  • 限制访问来源:若无需公网访问,可将 0.0.0.0 改为 127.0.0.1,仅允许远程服务器本地访问转发端口。

  • 及时关闭转发:用完后通过 ps aux | grep ssh 找到进程 ID,用 kill <PID> 关闭,避免安全隐患。

适用场景

  1. 本地开发调试:通过公网访问你的本地开发环境,无需部署到服务器。

  2. 内网服务暴露:将内网设备(如树莓派、NAS)的服务通过远程服务器暴露到公网。

  3. 临时文件传输:通过反向转发临时开放本地 FTP/SFTP 服务,方便远程传输文件。

总结

SSH 反向端口转发是一个轻量级且强大的工具,仅需一行命令就能打破内网限制,实现本地服务的远程访问。关键是理解 -R 参数的转发逻辑,并注意配置安全选项(如密钥登录、防火墙规则)。无论是开发调试还是临时服务暴露,它都能成为你的得力助手。


相关文章

1Panel安装及使用(Ubuntu服务器运维面板工具)

1Panel安装及使用(Ubuntu服务器运维面板工具)

1Panel 是一个现代化的 Linux 服务器运维管理面板,支持可视化管理服务器、网站、数据库等。在 Ubuntu 上安装 1Panel 非常简单,以下是具体步骤:...

Linux系统备份及恢复的一个方案

Linux系统备份及恢复的一个方案

本文为借鉴经验并按实际梳理,测试成功,环境如下:VMware虚拟机Ubuntu20.04系统、实体电脑Ubuntu20.04系统主要思路如下:由于linux系统一切皆文件的理念。通过tar工具将除启动...

Mysql数据库主从模式配置及切换方案

Mysql数据库主从模式配置及切换方案

有一个项目的需求,同时配置两台服务器,两台服务器的mysql数据库、系统图片、视频等资源等实时同步,在出现故障时迅速切换。(通过mysql主从复制、rsync数据同步、nginx负载均衡的方案实现)通...

虚拟机模拟mongodb配置多节点副本集,实现事务特性

虚拟机模拟mongodb配置多节点副本集,实现事务特性

一、环境环境:Ubuntu 22,完成mongd、mongosh、mongodump安装,第一步先进行备份(这里端口用的是27070):(注意,这里配置内部地址,在远程连接时无法连接,或者加上直连参数...

Linux通过手机USB网络共享上网设置方法

多数情况下,服务器无法直接联网,需通过手机连线上网。设置方法如下:终端中查看现有网络接口:ip addr 或 ifconfig连接好数据线并在手机设置中打开“通过USB共享网络”再次查看是否将USB识...