在渗透测试或日常开发运维中,直接访问内网资源常常是一个挑战。无论是调试本地服务,还是管理远程设备,内网穿透技术都提供了关键的解决方案。本文将站在实用角度,对比解析四款常用的内网穿透工具:nps-npc、frp、ew以及ngrok,涵盖其核心原理、特点与详细使用方法,帮助你根据实际场景做出选择。
0x01 nps-npc
1.1 简介
nps 是一款轻量级、高性能、功能强大的内网穿透代理服务器。它支持 TCP、UDP 流量转发,几乎可以承载任何基于 TCP/UDP 的上层协议,例如访问内网网站、调试本地支付接口、SSH 连接、远程桌面以及内网 DNS 解析等。此外,它还集成了内网 HTTP 代理、SOCKS5 代理乃至 P2P 通信模式,并配备了一个功能完善的 Web 管理界面。
其基本架构非常简单:
- 一台拥有公网 IP 的服务器(VPS)运行服务端(NPS)。
- 一台或多台位于内网的设备运行客户端(NPC)。

1.2 特点
- Go 语言编写:具备良好的并发性能和跨平台特性。
- 支持多种协议:TCP、UDP、HTTP(S)、SOCKS5 等。
- Web 管理端:提供直观的图形化界面,便于配置和管理客户端与隧道。
1.3 使用方法
首先,从 GitHub 发布页下载对应版本:https://github.com/ehang-io/nps/releases
NPS 服务端安装与配置
假设你使用的是 Linux AMD64 服务器,操作步骤如下:
cd ~
wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz
tar xzvf linux_amd64_server.tar.gz
cd ~/nps
解压后会得到 nps 可执行文件、conf 配置目录和 web 网页目录。核心配置文件是 conf/nps.conf:
vim conf/nps.conf
需要修改的配置项主要包括:
#web
web_host= 服务器IP或者域名
web_username= admin
web_password= 你的密码
web_port=8080
如果你所在的网络环境有出口防火墙限制,可能只允许 80、443 等常用端口出站,这时可以修改桥接端口以绕过限制:
#bridge
bridge_type=tcp
bridge_port=443 # 修改连接端口
bridge_ip=0.0.0.0
启动 NPS
# Mac/Linux
./nps start
# Windows
nps.exe start
NPC 客户端连接
在 Web 管理界面(http://服务器IP:8080)使用默认账号密码(admin/你的密码)登录后,可以在「客户端」页面新增一个客户端。成功添加后,系统会为该客户端生成一个唯一的验证密钥(vkey)。

在内网机器上,使用此 vkey 运行 NPC 客户端即可建立连接。连接命令也可以在客户端的详情页面找到:

./npc -server=你的IP:8024 -vkey=唯一验证密码 -type=tcp
创建代理隧道
客户端上线后,你就可以为其创建不同类型的穿透隧道了,例如 SOCKS5 或 HTTP 代理。

每个隧道都会对应一个服务端监听的端口。之后,你便可以通过连接服务端的这个端口,来访问内网中对应的服务了。这为管理复杂的 网络/系统 环境提供了极大的便利。
0x02 frp
2.1 简介
frp 是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,能够帮助你将内网服务安全、便捷地暴露到公网。

2.2 特点
- 多协议通信:客户端与服务端之间支持 TCP、KCP 以及 Websocket 协议。
- 端口复用:多个内网服务可以通过同一个服务端端口暴露。
- 插件丰富:提供静态文件服务、HTTPS 穿透等多种插件。
2.3 使用方法
下载地址:https://github.com/fatedier/frp/releases
1. 通过 RDP 访问内网 Windows 主机
首先配置服务端 frps.ini,建议启用 token 认证以提高安全性:
# frps.ini
[common]
bind_port = 7000
token = abcdefgh
启动 frps:
./frps -c ./frps.ini
接着在内网 Windows 主机上配置客户端 frpc.ini,假设公网服务器 IP 为 x.x.x.x:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = abcdefgh
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000
启动 frpc:
frpc.exe -c ./frpc.ini
现在,你就可以通过远程桌面连接 x.x.x.x:6000 来访问内网机器了。
2. 通过 SSH 访问内网 Linux 服务器
服务端配置同上。客户端 frpc.ini 配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = abcdefgh
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
连接时使用指定端口:
ssh -oPort=6000 user@x.x.x.x
3. 通过自定义域名访问内网 Web 服务
服务端配置需要启用 HTTP 代理端口:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
token = abcdefgh
客户端配置指向内网的 Web 服务(例如运行在 80 端口):
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = abcdefgh
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
将域名 www.yourdomain.com 解析到公网服务器 IP x.x.x.x,即可通过 http://www.yourdomain.com:8080 访问内网站点。
4. 高级功能
- Dashboard(统计面板):在
frps.ini 中配置 dashboard_port 等相关参数,即可通过 Web 界面查看连接状态。
- 加密与压缩:在客户端代理配置中设置
use_encryption = true 和 use_compression = true,可提升通信安全性和效率,尤其适用于对流量有严格监控的网络/系统环境。
- 范围端口映射:支持一次性映射多个连续或离散端口,简化配置。
0x03 ew
3.1 简介
EW(EarthWorm)是一套经典的便携式网络穿透工具,提供 SOCKS v5 代理架设和端口转发两大核心功能。虽然目前项目已停止更新,但其设计思想在多级网络跳板场景中仍有参考价值。

3.2 特点
- C 语言编写:体积小巧,执行效率高。
- 支持多级级联:可通过多条命令构建复杂的代理链,穿透多层内网。
- 纯 SOCKS5 代理:功能专注。
3.3 使用方法
1. 正向 SOCKS5 代理
在内网目标机器上直接启动一个 SOCKS5 服务:
$ ./ew -s ssocksd -l 1080
2. 反弹 SOCKS5 代理
适用于目标机器无法直接连接外部,但能主动出网的情况。
a) 在公网 VPS 上监听:
$ ./ew -s rcsocks -l 1080 -e 8888
b) 在内网目标机器上反弹连接:
$ ./ew -s rssocks -d [公网VPS_IP] -e 8888
成功后在 VPS 上即享有一个通往内网的 SOCKS5 代理(端口1080)。
3. 多级级联
利用 lcx_listen、lcx_slave、lcx_tran 等命令可以进行端口转发,串联多条隧道。例如一个三级级联的 SOCKS 代理链:
# 第一级(公网VPS)
$ ./ew -s rcsocks -l 1080 -e 8888
# 第二级(跳板机A)
$ ./ew -s lcx_slave -d [VPS_IP] -e 8888 -f [跳板机B_IP] -g 9999
# 第三级(跳板机B)
$ ./ew -s lcx_listen -l 9999 -e 7777
# 最终目标机
$ ./ew -s rssocks -d [跳板机B_IP] -e 7777
数据流向为:SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks。这种技术在复杂的安全/渗透/逆向测试场景中可能用到。
0x04 ngrok
4.1 简介
ngrok 是一个创建安全隧道的反向代理,允许你将本地服务暴露到公网。它的一大特色是能够捕获、分析和重放通道上的所有流量,极大方便了开发和调试。
4.2 特点
- 官方服务稳定:提供可靠的云端转发。
- 流量洞察:付费版提供详细的请求/响应记录和重放功能,是 运维 & 测试 的得力助手。
- 即开即用:无需自建服务器,快速获得公网地址。
4.3 使用方法
- 访问 ngrok 官网 (https://ngrok.com/) 注册并下载客户端。
- 使用官网提供的授权码进行认证:
./ngrok authtoken 你的授权码
- 暴露本地 HTTP 服务(如运行在 80 端口):
./ngrok http 80
执行后,ngrok 会分配一个随机的公网域名(如 https://xxxx.ngrok.io),所有发往该域名的流量都会被转发到你本地的 80 端口。

- Web 管理界面:运行客户端后,默认可以在
http://127.0.0.1:4040 查看基本的请求信息。更详尽的流量分析和重放功能需在官网控制台使用(付费功能)。

- 其他常用命令:
总结对比与选择建议
| 工具 |
核心优势 |
适用场景 |
是否需要公网服务器 |
上手难度 |
| nps-npc |
功能全面,Web管理强大,配置灵活 |
长期稳定的内网服务暴露、多协议代理需求 |
是 |
中等 |
| frp |
性能高,社区活跃,插件丰富,配置清晰 |
各类内网穿透需求,特别是需要高性能和定制化 |
是 |
中等 |
| ew |
体积小,支持多级跳转 |
临时性、多层级的内网穿透(尤其安全测试) |
是 |
较高 |
| ngrok |
无需自建服务器,提供流量分析 |
临时调试、演示、快速验证服务可用性 |
否(使用官方服务器) |
低 |
如何选择?
- 追求功能全面和便捷管理,且愿意维护一个服务端,选 nps。
- 注重性能、稳定性和社区生态,选 frp。
- 进行安全测试或需要穿透复杂网络结构,可尝试 ew。
- 只想快速临时暴露一个本地服务用于调试或演示,不想折腾服务器,选 ngrok。
每款工具都有其独特的定位和优势,理解其原理并根据实际项目需求进行选择,才能真正发挥内网穿透技术的价值。希望本文的对比和解析能帮助你在云栈社区或实际工作中更好地运用这些工具。