两台在不同局域网(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变动都需要重新查询。
- 将端口暴露在公网有一定安全风险。
操作步骤:
在SSH服务器上:
- 确保已安装并启动SSH服务。
- 设置一个静态的内网IP地址(如
192.168.1.100
),防止DHCP分配的IP地址变化导致转发失效。 - 查看防火墙设置,确保
22
端口是开放的。
获取公网IP:
- 在SSH服务器的网络中,打开浏览器访问
ip.sb
、whatismyip.com
等网站,记下显示的公网IP地址。
- 在SSH服务器的网络中,打开浏览器访问
在路由器上设置端口转发:
- 登录到SSH服务器所在网络的路由器管理界面(通常是
192.168.1.1
或192.168.0.1
)。 - 找到“端口转发”、“虚拟服务器”或“Port Forwarding”等菜单。
- 添加一条新规则:
- 外部端口 (或服务端口):
2222
(建议不要用默认的22
,以增加安全性) - 内部端口 (或私有端口):
22
- 内部IP地址 (或IP地址):
192.168.1.100
(你为SSH服务器设置的静态内网IP) - 协议:
TCP
- 外部端口 (或服务端口):
- 保存并应用设置。
- 登录到SSH服务器所在网络的路由器管理界面(通常是
在SSH客户端上连接:
- 打开你的终端或SSH工具。
- 使用以下命令进行连接:
其中# 格式: ssh -p [外部端口] [用户名]@[路由器的公网IP] ssh -p 2222 your_username@123.45.67.89
your_username
是SSH服务器上的用户名,123.45.67.89
是你查到的公网IP。
方法二:使用内网穿透工具 (Tunneling) - 最简单方便的方法
对于不想或不能配置路由器的用户来说,这是最简单的方法。这类工具的原理是,两台电脑都主动连接到一个公共的服务器,然后这个公共服务器负责在它们之间“中继”数据。
优点:
- 无需配置路由器,无视网络环境的复杂性。
- 通常几条命令就能搞定,非常方便。
- 对公网IP类型没有要求。
缺点:
- 依赖第三方服务,连接速度和稳定性受限于服务商。
- 免费服务通常有带宽和连接时长的限制。
常用工具推荐:
1. ngrok
- 简介:非常知名的内网穿透工具,简单易用。
- 操作步骤:
- 在SSH服务器上:
- 去 ngrok官网 注册一个账号。
- 下载并解压 ngrok。
- 根据官网提示,配置你的
authtoken
:./ngrok authtoken [你的Token]
。 - 运行以下命令,将本地的22端口暴露出去:
./ngrok tcp 22
- 查看ngrok提供的地址:
- 运行后,ngrok的终端界面会显示一个公网地址,例如
tcp://0.tcp.ngrok.io:12345
。
- 运行后,ngrok的终端界面会显示一个公网地址,例如
- 在SSH客户端上连接:
- 使用ngrok提供的地址和端口进行连接:
# 格式: ssh -p [端口] [用户名]@[ngrok提供的域名] ssh -p 12345 your_username@0.tcp.ngrok.io
- 使用ngrok提供的地址和端口进行连接:
- 在SSH服务器上:
2. ZeroTier
- 简介:它创建一个虚拟的局域网(SD-WAN),让加入这个网络的设备感觉就像在同一个局域网内一样,可以直接用虚拟IP互相访问。
- 操作步骤:
- 去 ZeroTier官网 注册并创建一个私有网络 (Private Network),你会得到一个
Network ID
。 - 在SSH服务器和SSH客户端两台电脑上都安装ZeroTier客户端。
- 两台电脑都使用
zerotier-cli join [你的Network ID]
命令加入你创建的网络。 - 回到ZeroTier官网的管理页面,你会看到两台设备等待授权,勾选它们前面的
Auth?
复选框。 - 授权后,ZeroTier会为每台设备分配一个虚拟IP地址(如
10.147.17.x
)。 - 现在,你可以直接在SSH客户端上,使用SSH服务器的ZeroTier虚拟IP进行连接了:
ssh your_username@10.147.17.100
- 去 ZeroTier官网 注册并创建一个私有网络 (Private Network),你会得到一个
方法三:反向SSH隧道 (Reverse SSH Tunnel) - 最高级的技巧
如果你的SSH客户端有一台拥有公网IP的服务器(或可以通过端口转发访问),而SSH服务器处于一个严格限制的网络中(无法配置路由器),这个方法就非常有用。
原理:
让被访问的SSH服务器主动发起一个连接到SSH客户端(或一个公网服务器,我们称之为“中介服务器”),并在这个连接上建立一个“反向通道”。之后,客户端就可以通过这个通道“回头”访问服务器。优点:
- 可以穿透最严格的防火墙,因为连接是由“内部”主动发起的。
- 非常灵活和强大。
缺点:
- 概念上比较复杂。
- 需要一台拥有公网IP的中介服务器(可以是你的SSH客户端,也可以是云服务器)。
操作步骤(假设你有一台公网服务器
jump.server.com
作为中介):在SSH服务器上(被访问的电脑):
- 执行以下命令,连接到中介服务器,并建立反向隧道:
# 格式: ssh -R [中介服务器端口]:localhost:[本地SSH端口] [中介服务器用户]@[中介服务器地址] ssh -R 8888:localhost:22 jump_user@jump.server.com
-R
表示反向隧道。8888
:在中介服务器上监听的端口。localhost:22
:将请求转发到本机(SSH服务器)的22端口。- 这个命令需要保持运行。
- 执行以下命令,连接到中介服务器,并建立反向隧道:
在中介服务器上操作:
- 现在,登录到中介服务器
jump.server.com
。 - 你会发现
8888
端口正在被监听。从这台服务器上,你可以通过访问自己的8888
端口来连接到远端的SSH服务器:
这里的ssh -p 8888 your_username@localhost
your_username
是SSH服务器上的用户名。
- 现在,登录到中介服务器
如果你想从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服务器网络环境受限,但你有公网服务器资源。 |
给你的建议:
- 如果你是初学者或想快速解决问题:强烈推荐 ZeroTier 或 ngrok。ZeroTier更适合长期使用,因为它创建了一个稳定的虚拟网络。
- 如果你想拥有完全的控制权,并且不介意折腾路由器:选择 端口转发。记得配合DDNS和增强SSH安全(如使用密钥登录、修改端口、禁用密码登录)。
- 如果你是高级用户,且场景特殊:可以研究 反向SSH隧道。