| 2025-03-14
在如今的网络环境下,许多家庭和小型办公网络都没有公网 IP,这给实现外网访问内网服务带来了挑战。然而,基于 SSH 隧道的内网穿透方案可以巧妙地解决这一问题,让我们在无需公网 IP 的情况下,也能实现外网对内网设备的访问。
原理介绍
SSH(Secure Shell)是一种网络协议,常用于远程登录和文件传输等操作。基于 SSH 隧道的内网穿透原理是利用 SSH 协议建立一条加密通道,将内网服务的端口映射到外网可访问的服务器上。通过这个通道,外网用户可以通过访问服务器的特定端口,间接访问到内网设备上的服务。例如,我们在内网中有一台 Web 服务器,通过 SSH 隧道,将其 80 端口映射到有公网 IP 的服务器的某个端口(如 8080),外网用户就可以通过访问服务器的 8080 端口来访问内网的 Web 服务器。
实现步骤
1.准备工作:
-拥有一台有公网 IP 的服务器,且该服务器支持 SSH 服务并已开启。假设服务器 IP 为your_server_ip,SSH 服务端口为默认的 22(若修改过则填写修改后的端口)。
-在内网中需要被访问的设备(客户端),确保安装了 SSH 客户端工具。在 Linux 系统中,默认一般都安装了 OpenSSH 客户端;在 Windows 系统中,可以使用 PuTTY 等 SSH 客户端软件。
2.Linux 客户端配置:
-以在 Linux 客户端上映射本地 SSH 服务为例,打开终端,运行以下命令创建 SSH 隧道:
-ssh -N -f -R 8080:127.0.0.1:22 your_username@your_server_ip -p 22
--N参数表示不执行远程命令,仅建立隧道。
--f参数使 SSH 在后台运行。
--R参数用于反向隧道设置,格式为远程服务器端口:本地IP:本地端口,这里将本地的 SSH 服务(端口 22)映射到远程服务器的 8080 端口。
-your_username是在远程服务器上的用户名,your_server_ip是远程服务器的公网 IP,-p 22指定 SSH 连接的端口为 22。
-执行命令后,系统会提示输入远程服务器的密码,输入正确密码后,SSH 隧道就建立成功了。此时,外网用户可以通过your_server_ip:8080来访问内网设备的 SSH 服务。
-若要映射其他服务,如本地的 Web 服务(假设本地 Web 服务端口为 80),命令可修改为:
-ssh -N -f -R 8081:127.0.0.1:80 your_username@your_server_ip -p 22
-这里将远程服务器端口改为 8081,本地端口改为 80,用于映射 Web 服务。
3.Windows 客户端配置(以 PuTTY 为例):
-打开 PuTTY 软件。
-在 “Host Name (or IP address)” 栏中填写远程服务器的公网 IP,即your_server_ip。
-在 “Port” 栏中填写 SSH 服务端口,默认为 22。
-点击左侧菜单中的 “SSH”,再点击 “Tunnels”。
-在 “Source port” 栏中填写远程服务器上用于映射的端口,例如 8080。
-在 “Destination” 栏中填写 “本地 IP: 本地端口”,如 “127.0.0.1:3389”(假设要映射本地的远程桌面服务,默认端口 3389)。
-选择 “Remote” 单选按钮,表示创建反向隧道。
-点击 “Add” 按钮添加隧道规则。
-回到 PuTTY 主界面,点击 “Open” 按钮连接到远程服务器,输入服务器用户名和密码。连接成功后,SSH 隧道就建立好了。外网用户可以通过your_server_ip:8080来访问内网设备的远程桌面服务。
注意事项
1.安全性:由于 SSH 隧道涉及到将内网服务暴露到外网,安全至关重要。务必设置强密码,并定期更换远程服务器的 SSH 登录密码。同时,建议启用 SSH 密钥认证,进一步增强安全性。
2.端口冲突:在设置远程服务器端口和本地端口时,要确保端口未被其他服务占用,避免端口冲突导致隧道建立失败或服务异常。
3.稳定性
4.:SSH 隧道的稳定性可能受到网络状况的影响。若网络不稳定,可能会导致隧道中断。可以通过设置 Keepalive 参数来保持 SSH 连接的活跃,例如在 Linux 客户端的
5.~/.ssh/config
6.文件中添加以下内容:
7.Host your_server_ip
ServerAliveInterval 60
ServerAliveCountMax 3
-ServerAliveInterval表示每隔 60 秒向服务器发送一次心跳包,ServerAliveCountMax表示若连续 3 次心跳包未收到响应,则断开连接。
通过基于 SSH 隧道的内网穿透方案,我们可以在没有公网 IP 的情况下,实现外网对内网服务的访问,为远程办公、远程管理等应用场景提供了便利。但在使用过程中,要严格遵循安全规范,确保网络安全。
拓展阅读
-SSH 密钥认证设置:在 Linux 系统中,使用ssh -keygen命令生成密钥对,将公钥复制到远程服务器的~/.ssh/authorized_keys文件中。在 Windows 系统中,PuTTY 可以使用 PuTTYgen 工具生成密钥对,并在 PuTTY 配置中加载私钥进行认证。这样可以避免使用密码登录,提高安全性。
-SSH 隧道的高级应用:除了基本的端口映射,SSH 隧道还可以用于搭建 SOCKS 代理。通过设置合适的参数,将 SSH 隧道配置为 SOCKS 代理,内网设备可以通过该代理访问外网,同时也可以实现更复杂的网络访问控制。
-与花生壳内网穿透对比:花生壳内网穿透无需自己搭建服务器,配置相对简单,且提供了多种功能和应用场景支持。而基于 SSH 隧道的内网穿透方案需要有一台可信任的公网服务器,配置过程涉及到 SSH 命令和参数设置,对技术要求稍高,但在某些特定场景下,如已有可用的公网服务器且对网络控制有较高要求时,SSH 隧道方案更具优势。