[保姆级教程] 解决不同局域网电脑无法SSH的问题

两台在不同局域网(LAN)但都能上网的电脑,无法直接通过各自的内网IP(如 192.168.1.10)进行SSH连接,因为这些IP地址只在它们各自的局域网内有效。

要解决这个问题,核心思想是需要一个双方都能访问的"中间人"或"公共地址"。互联网就是这个桥梁。

下面我将为你介绍几种常用且有效的方法,从易到难,各有优劣。


基本概念

在开始之前,我们先明确几个角色:

  • SSH服务器 :你想要被连接 的电脑。这台电脑上需要安装并运行SSH服务(通常是OpenSSH Server)。
  • SSH客户端 :你用来发起连接的电脑。这台电脑上需要有SSH客户端工具(Linux/macOS自带,Windows可使用PowerShell、PuTTY或Windows Terminal)。

方法一:端口转发 (Port Forwarding) - 最经典的方法

这是最传统、最直接的方法,前提是你能够控制SSH服务器所在局域网的路由器

  • 原理

    在SSH服务器所在的局域网路由器上设置一条规则:"所有访问路由器某个特定端口(如 2222)的外部请求,都转发到局域网内SSH服务器的 22 端口上"。这样,SSH客户端只需要连接到路由器的公网IP和那个特定端口,就能访问到内部的电脑。

  • 优点

    • 设置好后连接稳定,速度快(直接点对点通信)。
    • 无需依赖第三方服务。
  • 缺点

    • 必须有路由器的管理权限
    • SSH服务器所在网络的公网IP必须是可访问的(部分运营商提供的是内网IP,无法从外部访问)。
    • 如果公网IP是动态变化的,需要配合 DDNS (动态域名解析) 使用,否则每次IP变动都需要重新查询。
    • 将端口暴露在公网有一定安全风险。
  • 操作步骤

    1. 在SSH服务器上

      • 确保已安装并启动SSH服务。
      • 设置一个静态的内网IP地址(如 192.168.1.100),防止DHCP分配的IP地址变化导致转发失效。
      • 查看防火墙设置,确保 22 端口是开放的。
    2. 获取公网IP

      • 在SSH服务器的网络中,打开浏览器访问 ip.sbwhatismyip.com 等网站,记下显示的公网IP地址。
    3. 在路由器上设置端口转发

      • 登录到SSH服务器所在网络的路由器管理界面(通常是 192.168.1.1192.168.0.1)。
      • 找到"端口转发"、"虚拟服务器"或"Port Forwarding"等菜单。
      • 添加一条新规则:
        • 外部端口 (或服务端口)2222 (建议不要用默认的22,以增加安全性)
        • 内部端口 (或私有端口)22
        • 内部IP地址 (或IP地址)192.168.1.100 (你为SSH服务器设置的静态内网IP)
        • 协议TCP
      • 保存并应用设置。
    4. 在SSH客户端上连接

      • 打开你的终端或SSH工具。

      • 使用以下命令进行连接:

        bash 复制代码
        # 格式: ssh -p [外部端口] [用户名]@[路由器的公网IP]
        ssh -p 2222 your_username@123.45.67.89 

        其中 your_username 是SSH服务器上的用户名,123.45.67.89 是你查到的公网IP。


方法二:使用内网穿透工具 (Tunneling) - 最简单方便的方法

对于不想或不能配置路由器的用户来说,这是最简单的方法。这类工具的原理是,两台电脑都主动连接到一个公共的服务器,然后这个公共服务器负责在它们之间"中继"数据。

  • 优点

    • 无需配置路由器,无视网络环境的复杂性。
    • 通常几条命令就能搞定,非常方便。
    • 对公网IP类型没有要求。
  • 缺点

    • 依赖第三方服务,连接速度和稳定性受限于服务商。
    • 免费服务通常有带宽和连接时长的限制。
常用工具推荐:

1. ngrok

  • 简介:非常知名的内网穿透工具,简单易用。
  • 操作步骤
    1. 在SSH服务器上

      • ngrok官网 注册一个账号。

      • 下载并解压 ngrok。

      • 根据官网提示,配置你的 authtoken./ngrok authtoken [你的Token]

      • 运行以下命令,将本地的22端口暴露出去:

        bash 复制代码
        ./ngrok tcp 22
    2. 查看ngrok提供的地址

      • 运行后,ngrok的终端界面会显示一个公网地址,例如 tcp://0.tcp.ngrok.io:12345
    3. 在SSH客户端上连接

      • 使用ngrok提供的地址和端口进行连接:

        bash 复制代码
        # 格式: ssh -p [端口] [用户名]@[ngrok提供的域名]
        ssh -p 12345 your_username@0.tcp.ngrok.io

2. ZeroTier

  • 简介:它创建一个虚拟的局域网(SD-WAN),让加入这个网络的设备感觉就像在同一个局域网内一样,可以直接用虚拟IP互相访问。
  • 操作步骤
    1. ZeroTier官网 注册并创建一个私有网络 (Private Network) ,你会得到一个 Network ID

    2. SSH服务器SSH客户端两台电脑上都安装ZeroTier客户端。

    3. 两台电脑都使用 zerotier-cli join [你的Network ID] 命令加入你创建的网络。

    4. 回到ZeroTier官网的管理页面,你会看到两台设备等待授权,勾选它们前面的 Auth? 复选框。

    5. 授权后,ZeroTier会为每台设备分配一个虚拟IP地址(如 10.147.17.x)。

    6. 现在,你可以直接在SSH客户端上,使用SSH服务器的ZeroTier虚拟IP 进行连接了:

      bash 复制代码
      ssh your_username@10.147.17.100

方法三:反向SSH隧道 (Reverse SSH Tunnel) - 最高级的技巧

如果你的SSH客户端 有一台拥有公网IP的服务器(或可以通过端口转发访问),而SSH服务器处于一个严格限制的网络中(无法配置路由器),这个方法就非常有用。

  • 原理

    让被访问的SSH服务器 主动发起一个连接到SSH客户端(或一个公网服务器,我们称之为"中介服务器"),并在这个连接上建立一个"反向通道"。之后,客户端就可以通过这个通道"回头"访问服务器。

  • 优点

    • 可以穿透最严格的防火墙,因为连接是由"内部"主动发起的。
    • 非常灵活和强大。
  • 缺点

    • 概念上比较复杂。
    • 需要一台拥有公网IP的中介服务器(可以是你的SSH客户端,也可以是云服务器)。
  • 操作步骤 (假设你有一台公网服务器 jump.server.com 作为中介):

    1. 在SSH服务器上(被访问的电脑):

      • 执行以下命令,连接到中介服务器,并建立反向隧道:

        bash 复制代码
        # 格式: ssh -R [中介服务器端口]:localhost:[本地SSH端口] [中介服务器用户]@[中介服务器地址]
        ssh -R 8888:localhost:22 jump_user@jump.server.com
        • -R 表示反向隧道。
        • 8888:在中介服务器上监听的端口。
        • localhost:22:将请求转发到本机(SSH服务器)的22端口。
        • 这个命令需要保持运行。
    2. 在中介服务器上操作

      • 现在,登录到中介服务器 jump.server.com

      • 你会发现 8888 端口正在被监听。从这台服务器上,你可以通过访问自己的 8888 端口来连接到远端的SSH服务器:

        bash 复制代码
        ssh -p 8888 your_username@localhost

        这里的 your_usernameSSH服务器上的用户名。

    3. 如果你想从SSH客户端直接连接

      • 你可以先SSH到中介服务器,再执行第二步的操作。

      • 或者配置SSH跳转(ProxyJump),一步到位:
        在你的SSH客户端(~/.ssh/config)中添加配置:

        复制代码
        Host my-remote-pc
            HostName localhost
            Port 8888
            User your_username
            ProxyJump jump_user@jump.server.com

        然后你就可以直接用 ssh my-remote-pc 连接了。


总结与推荐

方法 优点 缺点 适用场景
端口转发 性能好,稳定,无第三方依赖 需要路由器权限,需要公网IP,有安全风险 长期、稳定的家庭或办公室服务器访问。
内网穿透 (ngrok) 极其简单,无需任何配置 依赖第三方,免费版有限制 临时调试、快速分享、初学者入门。
虚拟局域网 (ZeroTier) 简单,安全,像在局域网一样方便 依赖第三方,需要安装客户端 需要连接多台设备,构建安全的私有网络。
反向SSH隧道 功能强大,可穿透严格防火墙 概念复杂,需要一台公网服务器 SSH服务器网络环境受限,但你有公网服务器资源。

给你的建议:

  • 如果你是初学者或想快速解决问题 :强烈推荐 ZeroTierngrok。ZeroTier更适合长期使用,因为它创建了一个稳定的虚拟网络。
  • 如果你想拥有完全的控制权,并且不介意折腾路由器 :选择 端口转发。记得配合DDNS和增强SSH安全(如使用密钥登录、修改端口、禁用密码登录)。
  • 如果你是高级用户,且场景特殊 :可以研究 反向SSH隧道
相关推荐
泽虞12 分钟前
《LINUX系统编程》笔记p3
linux·运维·服务器·c语言·笔记·面试
苹果醋32 小时前
Java并发编程-Java内存模型(JMM)
java·运维·spring boot·mysql·nginx
dingcb1682 小时前
4090服务器无法sudo apt update 问题解决
运维·服务器
头发那是一根不剩了2 小时前
服务器硬盘进行分区和挂载
linux·运维·服务器
心一信息3 小时前
如何通过华为无线控制器添加一个名为yunwei的无线网络
运维·网络·华为
TDengine (老段)3 小时前
TDengine IDMP 运维指南(4. 使用 Docker 部署)
运维·数据库·物联网·docker·时序数据库·tdengine·涛思数据
三婶儿3 小时前
在没有客户端的客户环境下,如何用 Python 一键执行 MySQL 与达梦数据库 SQL
运维·后端·python
xcs194053 小时前
AI 自动化编程 trae 体验2 帮我分析一个项目
运维·自动化
彬彬醤4 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
Sadsvit6 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos