【内网穿透】Nhop 实战指南:两大核心部署场景与配置详解
github地址:github.com/yu47/Nhop
💡 写在前面
大多数人使用内网穿透,都是为了**“把内网服务暴露给公网”**,方便进行 Web 测试或提供外部访问。
但是,如果我们要访问的内网服务包含了敏感数据(如公司内部的 Gitlab、私有数据库),直接将其暴露在公网 IP 上无异于“裸奔”,极易遭到爆破和扫描。这时,我们就需要一种更安全的**“内网中继”**方案。
今天,我们就来深度剖析并实战演练 Nhop 的两大核心部署模型:对外暴露服务模型 与 内网访客中继模型(Client-Server-Client) 。
🌟 Nhop 的核心优势
- 极致轻量:由纯 C 语言编写,编译后的可执行文件体积极小(几百KB级别),运行时的内存占用甚至可以忽略不计。
- 高性能,低延迟:底层直接采用高效的 I/O 多路复用模型,数据转发效率极高,没有多余的 GC(垃圾回收)开销。
- 跨平台支持:支持在 Linux、Windows以及各种基于 ARM 的嵌入式系统上运行。
- 极简配置:抛弃了复杂的配置文件,通过几条简单的命令行参数即可拉起服务,非常适合极客和喜欢“开箱即用”的开发者。
🏗️ 场景 1:对外暴露服务 (Server-Agent 模型)
这是最经典的内网穿透场景。通过部署在公网的 Server 节点,直接将内网的服务端口映射到公网上,供外部用户直接访问。
📡 流量路径
Plaintext
External Client (外部访客) -> Nhop Server (公网) -> Nhop Agent (内网) -> Target Service (目标服务)
🛠️ 实战配置指南
Server 示例文件:conf/node_scene1_c_hub.conf
Agent 示例文件:conf/node_scene1_b_agent.conf
第一步:启动 Nhop Server (公网端)
在公网 VPS 上配置并启动 Server:
Bash
./Nhop -n server.conf
server.conf 配置如下:
mode=server
bind_addr=0.0.0.0:9000
token=nhop-demo
crypto_mode=off
第二步:启动 Nhop Agent (内网端)
在运行目标服务(如 8080 端口的 Web 服务)的内网机器上启动 Agent:
Bash
./Nhop -n agent.conf
agent.conf 配置如下:
Ini, TOML
mode=agent
server_addr=127.0.0.1:9000 # 实际使用中,请将此处替换为 Server 的公网 IP
token=nhop-demo
crypto_mode=off
[service.web]
target_addr=127.0.0.1:8080 # 本地实际运行的服务端口
listen_addr=0.0.0.0:20880 # 期望 Server 在公网上暴露的访问端口
配置生效后,外部用户即可通过访问 Server公网IP:20880 直接访问到你内网的 8080 服务。
🏗️ 场景 2:通过 Server 访问内网服务 (内网访客中继模型)
在“场景2”中,公网的 VPS 不再直接对外开放业务端口,而是纯粹作为一个 数据中转站(Relay Hub) 。
访问者所在的设备也需要运行一个 Nhop 客户端,通过公网服务器的身份校验后,与目标内网设备建立起一条安全的端到端隧道。
📡 架构图解
Plaintext
[内网环境 A - 目标机器] [公网环境 - VPS] [内网环境 B - 访客机器]
运行业务 (如 MySQL 3306) 需要连接 MySQL 的电脑
| | |
+---------------+ +---------------+ +---------------+
| Nhop Agent |====== 安全隧道 =======| Nhop Server |====== 安全隧道 ==| Nhop Client |
+---------------+ (主动连接 Server) +---------------+ (主动连接 Server) +---------------+
流量路径: Client (访客) -> Server (中转) -> Agent (被访端) -> Target Service (目标服务)
🌟 场景2的核心优势
- 极致安全:公网 VPS 不开放任何业务端口(如 3306、22),黑客即使扫描你的公网 IP,也根本找不到任何服务的入口。
- 按需打通:只有运行了正确配置的 Nhop 访客客户端,才能接入这条隧道,相当于在公网上拉了一根隐形的私有网线。
- 穿透隔离网络:完美解决两个处于不同 NAT 环境下的局域网设备互访问题。
🛠️ 实战配置指南
假设我们有如下环境:
- VPS 服务器:IP
198.51.100.1,用于运行 Nhop Server。 - 内网目标机(A) :运行着 MySQL 数据库,端口
3306。 - 内网访客机(B) :你的笔记本,想要通过本地的
33060端口安全连接到机器A的数据库。
第一步:在 VPS 启动 Nhop Server (中转节点)
服务器端主要负责接收两边客户端的连接并进行流量桥接。
Bash
# 启动 Nhop 服务端
./Nhop -n server.conf
server.conf 配置:
(注:加入了 token 验证机制,防止非法客户端蹭用你的中转服务器。)
Ini, TOML
mode=server
bind_addr=0.0.0.0:9000
token=nhop-demo
crypto_mode=off
第二步:在目标机器(A)启动 Nhop Agent (被访端)
在运行 MySQL 的内网机器上,启动客户端。
Bash
# 启动客户端A
./Nhop -n agent.conf
agent.conf 配置:
Ini, TOML
mode=agent
server_addr=198.51.100.1:9000
token=nhop-demo
crypto_mode=off
[service.db]
target_addr=127.0.0.1:3306
第三步:在访客机器(B)启动 Nhop Client (访问端)
在你的笔记本上,同样启动 Nhop 客户端,通过把远程的 service.db 映射到本地。
Bash
# 启动客户端B (访客模式)
./Nhop -n client.conf
client.conf 配置:
Ini, TOML
mode=client
server_addr=198.51.100.1:9000 # 实际使用中,请替换为 Server 的公网 IP
token=nhop-demo
crypto_mode=off
[service.db]
listen_addr=0.0.0.0:33060
第四步:见证奇迹
现在,你的笔记本和内网目标机已经通过 VPS 建立了一条隐形隧道。你只需要打开数据库客户端(如 Navicat 或 DataGrip),连接 本地 的 33060 端口:
Bash
mysql -h 127.0.0.1 -P 33060 -u root -p
连接成功!流量将按照 笔记本 -> VPS -> 内网主机A -> 目标服务 的路径进行高速且安全的转发。