OpenNHP/nhp-frp
GitHub: OpenNHP/nhp-frp
将 OpenNHP 网络隐藏协议与 frp 反向代理结合,通过加密敲门实现零信任端口隐藏的安全内网穿透隧道。
Stars: 3 | Forks: 2
# NHP-FRP
[English](README.md) | [中文](README_zh.md)
NHP-FRP 将 [OpenNHP](https://github.com/OpenNHP/opennhp)(网络基础设施隐藏协议)与 [frp](https://github.com/fatedier/frp)(快速反向代理)结合,为反向代理隧道提供**零信任网络访问**。
## 快速演示
通过**零配置**即刻试用 NHP-FRP —— 只需构建并运行:
```
# 构建客户端
make frpc # Linux/macOS
build.bat frpc # Windows
# 运行它
./bin/nhp-frpc # Linux/macOS
bin\nhp-frpc.exe # Windows
```
启动时,`nhp-frpc` 将显示您唯一的**机器 ID** 和公开 URL:
```
_ _ _ _ ____ _____ ____ ____
| \ | | | | | _ \ | ___| _ \| _ \
| \| | |_| | |_) |_____| |_ | |_) | |_) |
| |\ | _ | __/______| _| | _ <| __/
|_| \_|_| |_|_| |_| |_| \_\_|
nhp-frp 0.1.0 (client)
Machine ID: 70a22f85
nhp agent started successfully
Config portal available at http://127.0.0.1:7400
Public URL: http://70a22f85.ac.opennhp.org:6060
Admin API: http://70a22f85-admin.ac.opennhp.org:6060 (user: admin, password: 70a22f85)
File server listening on :8888 (serving .../bin/public)
```
在浏览器中打开 `http://.ac.opennhp.org:6060/` —— 您将看到来自您本机的 `bin/public/index.html`,它是通过 NHP 保护的隧道提供的。将其替换为您自己的内容即可即时共享文件。
### 演示数据流
```
Your Machine Demo Server (acdemo.opennhp.org) Browser
┌─────────────────┐ ┌─────────────────────────────────┐
│ │ 1. NHP Knock │ │
│ NHP Agent ─────│────── UDP ─────>│ NHP Server │
│ │ │ │ verify + open firewall │
│ │ 2. FRP Tunnel │ v │
│ FRP Client ────│──── TCP:7000 ──>│ nhp-frps (:7000) │
│ │ │ │ │ │
│ │ proxy │ │ │ vhost routing │
│ v │ │ v │
│ File Server │ │ :6060 │ ┌──────────┐
│ (:8888) │ │ .ac.opennhp.org │<────│ Browser │
│ │ │ │ │ │ │ requests │
│ v │ │ │ forward to client │ │ :6060 │
│ bin/public/ │<── HTTP ────────│────┘ │ └──────────┘
│ index.html │ via FRP tunnel │ │
│ │ │ │
│ Admin API ─────│── HTTP ────────>│ -admin │<─── Server
│ (:7400) │ via FRP tunnel │ (basic auth protected) │ management
└─────────────────┘ └─────────────────────────────────┘
Step 1: NHP Agent sends encrypted knock → server opens port for your IP only
Step 2: FRP client connects to server through the opened port
Step 3: Browser visits http://.ac.opennhp.org:6060
Step 4: Server routes request via FRP tunnel → your local file server (:8888)
Step 5: bin/public/index.html is returned to the browser
```
位于 `http://127.0.0.1:7400` 的**配置控制台**允许您通过内置的 Web 仪表板监控代理状态。
### 远程管理(Admin API)
客户端的 Admin API 通过 FRP 隧道暴露,允许服务器远程管理客户端。它受 HTTP Basic Auth 保护(用户名:`admin`,密码:客户端的机器 ID)。
```
# 获取客户端代理状态
curl -u admin: http://-admin.ac.opennhp.org:6060/api/status
# 获取当前客户端配置
curl -u admin: http://-admin.ac.opennhp.org:6060/api/config
# 远程更新客户端配置
curl -u admin: -X PUT \
-H "Content-Type: application/toml" \
-d @new-frpc.toml \
http://-admin.ac.opennhp.org:6060/api/config
# 重新加载客户端以应用新配置
curl -u admin: -X PUT http://-admin.ac.opennhp.org:6060/api/reload
```
## 什么是 NHP-FRP?
标准的 frp 会将服务器端口暴露给公共互联网,使其对端口扫描器可见且容易受到攻击。NHP-FRP 通过添加 NHP 层解决了这个问题,该层**默认隐藏服务器端口**,并仅向经过身份验证和授权的客户端开放。
**工作原理:**
1. NHP Agent(内置于 `nhp-frpc`)在连接之前向 NHP 服务器发送加密的“敲门”请求
2. NHP 服务器验证客户端身份,并**仅针对该特定客户端 IP** 开放 frp 服务器端口
3. frp 隧道通过现已开放的端口建立
4. 会话结束后端口再次隐藏,对所有其他流量不可见
这将 frp 转变为一个**零信任反向代理** —— 在经过验证的客户端需要访问之前,服务在网络上是完全不可见的。
## 架构
### 问题:标准的 frp
使用标准的 frp 时,服务器端口(例如 7000)始终处于开放状态,对互联网上的任何人可见:
```
Public Internet
┌──────────┐ ┌──────────────────────────┐
│ frpc │──── frp tunnel (TCP:7000) ────────>│ frps (:7000 OPEN) │
│ client │ │ │ │
└──────────┘ │ v │
│ Backend Services │
┌──────────┐ │ ┌─────────────────┐ │
│ Attacker │──── port scan / exploit ──────────>│ │ Web App :8080 │ │
│ │ :7000 is visible! │ │ SSH :22 │ │
└──────────┘ │ │ DB :3306 │ │
│ └─────────────────┘ │
└──────────────────────────┘
Private Network
```
**问题:** 端口 7000 暴露在整个互联网中。攻击者可以通过端口扫描发现它,然后尝试暴力破解攻击、利用漏洞或发起 DDoS 攻击。
### 解决方案:NHP-FRP
NHP-FRP 隐藏了所有服务器端口。它们仅在有限时间内为经过验证的客户端开放:
```
Public Internet
┌──────────────────────────┐
1. NHP Knock (UDP) │ │
┌──────────┐ ─────────────────────────────────> │ NHP Server (nhp-door) │
│ nhp-frpc │ │ │ 2. Verify identity │
│ client │ 3. Port opened │ │ Open firewall │
│ (with │ (for this IP only) │ v │
│ NHP │ │ Firewall │
│ Agent) │ ── 4. frp tunnel (TCP:7000) ─────> │ [allow client IP:7000] │
└──────────┘ │ │ │
│ v │
│ nhp-frps (:7000) │
┌──────────┐ │ │ │
│ Attacker │──── port scan ─────────── X ──────>│ v │
│ │ :7000 is INVISIBLE! │ Backend Services │
└──────────┘ (all ports closed) │ ┌─────────────────┐ │
│ │ Web App :8080 │ │
│ │ SSH :22 │ │
│ │ DB :3306 │ │
│ └─────────────────┘ │
└──────────────────────────┘
Private Network
```
**逐步流程:**
| 步骤 | 操作 | 详情 |
|------|--------|--------|
| 1 | **NHP Knock** | `nhp-frpc` 向 NHP 服务器发送加密的 UDP敲门数据包 |
| 2 | **验证并开放** | NHP 服务器验证客户端的加密身份,并指示防火墙**仅为此客户端的 IP** 开放端口 7000 |
| 3 | **端口已开放** | 防火墙现在允许来自该客户端 IP 的流量访问端口 7000。所有其他 IP 仍然看到该端口处于关闭状态 |
| 4 | **FRP 隧道** | `nhp-frpc` 通过现已可访问的端口建立 frp 隧道 |
| 5 | **服务访问** | 流量通过 frp 隧道流向私有网络中的后端服务 |
**结果:** 服务器在公共互联网上拥有**零暴露端口**。即使攻击者知道服务器的 IP 地址,端口扫描也不会返回任何结果。只有能够通过 NHP 的加密敲门证明其身份的客户端才能访问服务。
### 组件
| 二进制文件 | 描述 |
|--------|-------------|
| `nhp-frpc` | 内置 NHP Agent 的 frp 客户端 —— 在连接前执行 NHP 敲门 |
| `nhp-frps` | frp 服务器(轻量级封装,计划未来集成 NHP) |
| `nhp-agent.dll/.so/.dylib` | nhp-frpc 使用的 NHP SDK 共享库 |
## 项目结构
```
nhp-frp/
cmd/
frpc/ # nhp-frpc entry point (NHP Agent + frp client)
frps/ # nhp-frps entry point (frp server wrapper)
pkg/version/ # Version info (injected at build time)
web/frpc/ # Embedded admin dashboard (Vue.js)
hack/ # Build helper scripts
third_party/
opennhp/ # OpenNHP submodule (NHP SDK source)
bin/ # Build output + runtime directory
nhp-frpc(.exe)
nhp-frps(.exe)
etc/ # Configuration files (frpc.toml, frps.toml, nhp-frpc.toml)
public/ # Static files served by the built-in file server
logs/ # Runtime log files
sdk/ # NHP SDK shared libraries
build.bat # Windows build script
Makefile # Linux/macOS build script
```
本项目是上游 frp 的一个**轻量级封装** —— 它将 [frp v0.67.0](https://github.com/fatedier/frp) 作为 Go 模块依赖导入,而不是 fork 源码。此仓库中仅包含特定于 NHP 的代码,这使得上游升级非常简单(只需更改 `go.mod` 中的版本)。
## 构建
### 前置条件
- **Go** 1.23+
- **GCC**(用于通过 CGO 构建 NHP SDK 共享库)
- Linux:`apt install gcc` 或同等命令
- macOS:Xcode Command Line Tools
- Windows:带有 `mingw-w64-x86_64-gcc` 的 [MSYS2](https://www.msys2.org/)
### Linux / macOS
```
# 构建所有内容 (包含 SDK 的 nhp-frps + nhp-frpc)
make
# 构建单独目标
make frps
make frpc # includes SDK build
make build-sdk # SDK only
```
### Windows
```
:: Build everything
build.bat
:: Build individual targets
build.bat frps
build.bat frpc &:: includes SDK build
build.bat build-sdk &:: SDK only
:: Other commands
build.bat clean
build.bat help
```
## 配置
配置文件位于二进制文件旁边的 `bin/etc/` 目录中。NHP-FRP 使用与 frp 相同的 TOML 格式,并支持用于动态值的模板变量。
**frps(服务器):** `bin/etc/frps.toml`
```
bindPort = 7000
vhostHTTPPort = 6060
subDomainHost = "ac.opennhp.org"
log.to = "{{ .Envs.NHP_BIN_DIR }}/logs/nhp-frps.log"
log.level = "info"
```
**frpc(客户端):** `bin/etc/frpc.toml`
```
serverAddr = "acdemo.opennhp.org"
serverPort = 7000
auth.method = "token"
auth.token = "opennhp-frp"
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "{{ .Envs.NHP_MACHINE_ID }}"
[[proxies]]
name = "file-server"
type = "http"
localIP = "127.0.0.1"
localPort = 8888
subdomain = "{{ .Envs.NHP_MACHINE_ID }}"
[[proxies]]
name = "admin-api"
type = "http"
localIP = "127.0.0.1"
localPort = 7400
subdomain = "{{ .Envs.NHP_MACHINE_ID }}-admin"
```
**nhp-frpc.toml**(NHP 特定设置,与 frp 配置分开):
```
subDomainHost = "ac.opennhp.org"
vhostHTTPPort = 6060
```
有关完整的示例配置,请参阅 `bin/etc/`。有关 frp 配置的详细信息,请参阅 [frp 文档](https://github.com/fatedier/frp#configuration)。
NHP Agent 单独配置 —— 它从与 `nhp-frpc` 二进制文件相同的目录中读取其配置。有关 NHP 配置的详细信息,请参阅 [OpenNHP 文档](https://github.com/OpenNHP/opennhp)。
## 运行
```
# 启动服务器
./bin/nhp-frps
# 启动客户端 (NHP Agent 自动启动)
./bin/nhp-frpc
```
默认情况下,这两个二进制文件会从其旁边的 `etc/` 子文件夹(例如 `bin/etc/frps.toml`)读取配置。您可以使用 `-c` 进行覆盖:
```
./bin/nhp-frps -c /path/to/frps.toml
./bin/nhp-frpc -c /path/to/frpc.toml
```
当 `nhp-frpc` 启动时,它首先初始化执行加密敲门序列的 NHP Agent。一旦 NHP 握手成功,frp 客户端就会正常连接到服务器。
## 相关项目
- [frp](https://github.com/fatedier/frp) —— 上游快速反向代理
- [OpenNHP](https://github.com/OpenNHP/opennhp) —— 网络隐藏协议实现
## 许可证
Apache License 2.0 —— 详见 [LICENSE](LICENSE)。
本项目基于 fatedier 的 [frp](https://github.com/fatedier/frp)(Apache 2.0)和 OpenNHP 团队的 [OpenNHP](https://github.com/OpenNHP/opennhp) 构建。
标签:DNS解析, frp, Go语言, NHP-FRP, OpenNHP, Python安全, Streamlit, UDP敲门, 内网穿透, 反向代理, 后端开发, 基础设施隐藏协议, 开源项目, 微隔离, 日志审计, 程序破解, 端口隐藏, 网络安全, 网络隐身, 访问控制, 防火墙, 隐私保护, 隧道代理, 零信任网络