MENU

xshell内网穿透服务本地服务或本地虚拟机端口

July 28, 2025 • 默认分类

适用于本地微信开发

好的,完全理解您的需求。您希望将公网服务器的 8866 端口作为入口,访问您本地(内网)电脑上运行在 8886 端口的服务。

这个场景非常适合使用 SSH 远程端口转发(Remote Port Forwarding),也常被称为 SSH 反向隧道

它的原理是:在您的本地电脑上发起一个 SSH 连接到您的公网服务器,并“命令”公网服务器监听 8866 端口,然后将所有发送到这个端口的流量,通过这条已经建立好的 SSH 连接,安全地转发回您本地电脑的 8886 端口。


操作步骤

您需要两步关键操作:

  1. (可能需要)修改公网服务器的 SSH 配置。
  2. 在您的本地电脑上执行 SSH 命令。

详细说明

步骤一:配置公网服务器 (Server)

为了让公网服务器监听的端口能被公网上的任何人访问(而不仅仅是服务器自己访问),您需要确保 SSH 服务的 GatewayPorts 选项被设置为 yes

  1. 登录您的公网服务器

    Bash

    ssh user@your_public_server_ip
  2. 编辑 SSH 配置文件 /etc/ssh/sshd_config。您可以使用 nanovim 编辑器。

    Bash

    sudo nano /etc/ssh/sshd_config
  3. 找到 GatewayPorts 这一行。

    • 如果它被注释掉了(前面有 # 号)并且写着 #GatewayPorts no,请去掉 # 号并把 no 改成 yes
    • 如果找不到这一行,请在文件末尾添加新的一行。
    • 最终确保文件中有这样一行:
    GatewayPorts yes
  4. 保存文件并重启 SSH 服务 以使配置生效。

    • 对于使用 Systemd 的系统 (如 Ubuntu 16+, CentOS 7+, Debian 8+):

      Bash

      sudo systemctl restart sshd
    • 对于一些老系统:

      Bash

      sudo service ssh restart

安全提示: 开启 GatewayPorts 意味着任何知道您服务器 IP 和 8866 端口的人都可以尝试访问您本地的服务。请确保您本地 8886 端口上运行的服务是安全的,或者在不需要时及时关闭隧道。

重要提示: 重启sshd服务器最好断开ssh链接,重新连接一下,以防止修改配置后没有生效的情况发生(很重要)


步骤二:在您的本地电脑 (Local Machine) 上执行命令

这是建立隧道的关键命令。请打开您本地电脑的终端或命令行工具,而不是在公网服务器上执行。

基础命令:

Bash

ssh -R 8866:localhost:8886 user@your_public_server_ip

命令解析:

  • ssh: SSH 客户端程序。
  • -R: 参数,表示进行远程端口转发 (Remote Port Forwarding)
  • 8866: 这是您希望在公网服务器上监听的端口。
  • localhost:8886: 这是流量最终要被转发到的目标。localhost 指的是本地电脑自己,8886 是本地电脑上服务的端口。
  • user@your_public_server_ip: 您用于登录公网服务器的用户名和 IP 地址。

执行此命令后,SSH 会要求您输入公网服务器的登录密码(或使用密钥自动登录)。连接成功后,隧道就建立好了。只要这个 SSH 连接保持活动状态,隧道就会一直工作。


如何访问

隧道建立成功后,您或互联网上的任何人都可以通过访问 http://your_public_server_ip:8866 (或使用其他协议,取决于您本地 8886 端口的服务类型)来访问您本地电脑上的服务了。


推荐:让隧道在后台稳定运行

上面的基础命令有一个缺点:如果您关闭了本地的终端窗口,SSH 连接就会断开,隧道也就失效了。为了让它在后台稳定运行,并且在网络波动时能自动重连,推荐使用以下更健壮的命令:

Bash

ssh -fN -R 8866:localhost:8886 user@your_public_server_ip -o ServerAliveInterval=60

新增参数解析:

  • -f: 表示 SSH 连接成功后,在后台运行。
  • -N: 表示不执行远程命令。这个参数告诉 SSH 客户端,我们仅仅是用来做端口转发的,不需要在远程服务器上打开一个 shell。
  • -o ServerAliveInterval=60: 这是一个非常有用的选项,表示每隔 60 秒,本地 SSH 客户端会向服务器发送一个“心跳包”以保持连接活跃,防止因网络空闲而被路由器或防火墙断开。

如何停止后台运行的隧道?

您需要找到这个 SSH 进程的 PID 并结束它:

Bash

# 查找正在运行的 SSH 隧道进程
ps aux | grep "ssh -fN -R 8866"

# 从输出中找到进程号 (PID),然后使用 kill 命令结束它
kill <PID>

高级工具: 如果您需要非常高的稳定性,可以考虑使用 autossh 工具。它专门用于监控和自动重启失败的 SSH 隧道,比 -o ServerAliveInterval 更可靠。

Bash

autossh -M 0 -fN -R 8866:localhost:8886 user@your_public_server_ip

(需要先通过 sudo apt install autosshyum install autossh 等方式安装 autossh

总结

  1. 检查并设置公网服务器 /etc/ssh/sshd_config 中的 GatewayPorts yes,然后重启 sshd 服务。
  2. 本地电脑上运行 ssh -fN -R 8866:localhost:8886 user@your_public_server_ip -o ServerAliveInterval=60
  3. 通过 your_public_server_ip:8866 访问您本地的服务。

好的,完全理解您的需求。您希望将公网服务器的 8866 端口作为入口,访问您本地(内网)电脑上运行在 8886 端口的服务。

这个场景非常适合使用 SSH 远程端口转发(Remote Port Forwarding),也常被称为 SSH 反向隧道

它的原理是:在您的本地电脑上发起一个 SSH 连接到您的公网服务器,并“命令”公网服务器监听 8866 端口,然后将所有发送到这个端口的流量,通过这条已经建立好的 SSH 连接,安全地转发回您本地电脑的 8886 端口。


操作步骤

您需要两步关键操作:

  1. (可能需要)修改公网服务器的 SSH 配置。
  2. 在您的本地电脑上执行 SSH 命令。

详细说明

步骤一:配置公网服务器 (Server)

为了让公网服务器监听的端口能被公网上的任何人访问(而不仅仅是服务器自己访问),您需要确保 SSH 服务的 GatewayPorts 选项被设置为 yes

  1. 登录您的公网服务器

    Bash

    ssh user@your_public_server_ip
  2. 编辑 SSH 配置文件 /etc/ssh/sshd_config。您可以使用 nanovim 编辑器。

    Bash

    sudo nano /etc/ssh/sshd_config
  3. 找到 GatewayPorts 这一行。

    • 如果它被注释掉了(前面有 # 号)并且写着 #GatewayPorts no,请去掉 # 号并把 no 改成 yes
    • 如果找不到这一行,请在文件末尾添加新的一行。
    • 最终确保文件中有这样一行:
    GatewayPorts yes
  4. 保存文件并重启 SSH 服务 以使配置生效。

    • 对于使用 Systemd 的系统 (如 Ubuntu 16+, CentOS 7+, Debian 8+):

      Bash

      sudo systemctl restart sshd
    • 对于一些老系统:

      Bash

      sudo service ssh restart
安全提示: 开启 GatewayPorts 意味着任何知道您服务器 IP 和 8866 端口的人都可以尝试访问您本地的服务。请确保您本地 8886 端口上运行的服务是安全的,或者在不需要时及时关闭隧道。

步骤二:在您的本地电脑 (Local Machine) 上执行命令

这是建立隧道的关键命令。请打开您本地电脑的终端或命令行工具,而不是在公网服务器上执行。

基础命令:

Bash

ssh -R 8866:localhost:8886 user@your_public_server_ip

命令解析:

  • ssh: SSH 客户端程序。
  • -R: 参数,表示进行远程端口转发 (Remote Port Forwarding)
  • 8866: 这是您希望在公网服务器上监听的端口。
  • localhost:8886: 这是流量最终要被转发到的目标。localhost 指的是本地电脑自己,8886 是本地电脑上服务的端口。
  • user@your_public_server_ip: 您用于登录公网服务器的用户名和 IP 地址。

执行此命令后,SSH 会要求您输入公网服务器的登录密码(或使用密钥自动登录)。连接成功后,隧道就建立好了。只要这个 SSH 连接保持活动状态,隧道就会一直工作。


如何访问

隧道建立成功后,您或互联网上的任何人都可以通过访问 http://your_public_server_ip:8866 (或使用其他协议,取决于您本地 8886 端口的服务类型)来访问您本地电脑上的服务了。


推荐:让隧道在后台稳定运行

上面的基础命令有一个缺点:如果您关闭了本地的终端窗口,SSH 连接就会断开,隧道也就失效了。为了让它在后台稳定运行,并且在网络波动时能自动重连,推荐使用以下更健壮的命令:

Bash

ssh -fN -R 8866:localhost:8886 user@your_public_server_ip -o ServerAliveInterval=60

新增参数解析:

  • -f: 表示 SSH 连接成功后,在后台运行。
  • -N: 表示不执行远程命令。这个参数告诉 SSH 客户端,我们仅仅是用来做端口转发的,不需要在远程服务器上打开一个 shell。
  • -o ServerAliveInterval=60: 这是一个非常有用的选项,表示每隔 60 秒,本地 SSH 客户端会向服务器发送一个“心跳包”以保持连接活跃,防止因网络空闲而被路由器或防火墙断开。

如何停止后台运行的隧道?

您需要找到这个 SSH 进程的 PID 并结束它:

Bash

# 查找正在运行的 SSH 隧道进程
ps aux | grep "ssh -fN -R 8866"

# 从输出中找到进程号 (PID),然后使用 kill 命令结束它
kill <PID>

高级工具: 如果您需要非常高的稳定性,可以考虑使用 autossh 工具。它专门用于监控和自动重启失败的 SSH 隧道,比 -o ServerAliveInterval 更可靠。

Bash

autossh -M 0 -fN -R 8866:localhost:8886 user@your_public_server_ip

(需要先通过 sudo apt install autosshyum install autossh 等方式安装 autossh

总结

  1. 检查并设置公网服务器 /etc/ssh/sshd_config 中的 GatewayPorts yes,然后重启 sshd 服务。
  2. 本地电脑上运行 ssh -fN -R 8866:localhost:8886 user@your_public_server_ip -o ServerAliveInterval=60
  3. 通过 your_public_server_ip:8866 访问您本地的服务。

xshell内网穿透服务本地服务或本地虚拟机端口.png