Nhop 一款基于C语言的轻量级,高性能的内网穿透工具。支持内网访客中继,不暴露服务端口在公网上。

1 阅读5分钟

【内网穿透】Nhop 实战指南:两大核心部署场景与配置详解

github地址:github.com/yu47/Nhop

💡 写在前面

大多数人使用内网穿透,都是为了**“把内网服务暴露给公网”**,方便进行 Web 测试或提供外部访问。

但是,如果我们要访问的内网服务包含了敏感数据(如公司内部的 Gitlab、私有数据库),直接将其暴露在公网 IP 上无异于“裸奔”,极易遭到爆破和扫描。这时,我们就需要一种更安全的**“内网中继”**方案。

今天,我们就来深度剖析并实战演练 Nhop 的两大核心部署模型:对外暴露服务模型内网访客中继模型(Client-Server-Client)

🌟 Nhop 的核心优势

  1. 极致轻量:由纯 C 语言编写,编译后的可执行文件体积极小(几百KB级别),运行时的内存占用甚至可以忽略不计。
  2. 高性能,低延迟:底层直接采用高效的 I/O 多路复用模型,数据转发效率极高,没有多余的 GC(垃圾回收)开销。
  3. 跨平台支持:支持在 Linux、Windows以及各种基于 ARM 的嵌入式系统上运行。
  4. 极简配置:抛弃了复杂的配置文件,通过几条简单的命令行参数即可拉起服务,非常适合极客和喜欢“开箱即用”的开发者。

🏗️ 场景 1:对外暴露服务 (Server-Agent 模型)

这是最经典的内网穿透场景。通过部署在公网的 Server 节点,直接将内网的服务端口映射到公网上,供外部用户直接访问。

scene1.png

📡 流量路径

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 客户端,通过公网服务器的身份校验后,与目标内网设备建立起一条安全的端到端隧道。

scene2.png

📡 架构图解

Plaintext

[内网环境 A - 目标机器]                  [公网环境 - VPS]                [内网环境 B - 访客机器]
 运行业务 (如 MySQL 3306)                                              需要连接 MySQL 的电脑
        |                                       |                                |
 +---------------+                      +---------------+                  +---------------+
 |  Nhop Agent   |====== 安全隧道 =======|  Nhop Server  |====== 安全隧道 ==|  Nhop Client  |
 +---------------+  (主动连接 Server)     +---------------+  (主动连接 Server) +---------------+

流量路径: Client (访客) -> Server (中转) -> Agent (被访端) -> Target Service (目标服务)

🌟 场景2的核心优势

  1. 极致安全:公网 VPS 不开放任何业务端口(如 3306、22),黑客即使扫描你的公网 IP,也根本找不到任何服务的入口。
  2. 按需打通:只有运行了正确配置的 Nhop 访客客户端,才能接入这条隧道,相当于在公网上拉了一根隐形的私有网线。
  3. 穿透隔离网络:完美解决两个处于不同 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 -> 目标服务 的路径进行高速且安全的转发。