内网穿透工具选型笔记:nps / frp / ew / ngrok
搞内网穿透,说白了就是让公网能访问到你内网那台机器。我这几年轻量级渗透、远程桌面、临时调试 Webhook 都干过,工具换来换去,最后常用的就这四个。下面按我的使用场景讲讲怎么选、坑在哪。
nps-npc:适合不想写配置、喜欢 web 管理的
如果你有公网 VPS,又不想碰配置文件,nps 是首选。它分服务端 nps 和客户端 npc,Go 写的,跨平台,web 管理端挺全,可以建客户端、加隧道、看流量。
我当时用是因为要快速给多个内网机器开代理,web 界面点几下就行,不需要记一堆 ini 语法。每个客户端分配一个 vkey,服务端和客户端配对用。配置核心就两处:
服务端 conf/nps.conf 里改 web 登录和 bridge 端口:
web_host=你的IP或域名
web_username=admin
web_password=你的密码
web_port=8080
bridge_type=tcp
bridge_port=443 # 默认 8024,但防火墙只放行 443 时改成 443
启动服务端:
./nps start
客户端连接命令:
./npc -server=你的IP:443 -vkey=唯一验证密码 -type=tcp
坑:web 管理端方便,但也意味着暴露面大,别把管理端口直接裸奔公网,至少改默认密码。另外如果内网机器出网受限,bridge 端口一定要改到能出去的端口上。
frp:最主流,生态最好,长期用选它
frp 是今天最常用的内网穿透工具,文档多、社区活跃、功能丰富。支持 TCP、UDP、HTTP、HTTPS,还有加密、压缩、限速、TLS、范围端口映射、插件(static_file)等。如果你要稳定跑生产,或者需要各种奇奇怪怪的功能,frp 是默认选项。
配置不复杂,一份 frps.ini 一份 frpc.ini。服务端:
[common]
bind_port = 7000
token = abcdefgh # 服务端和客户端要一致
客户端:
[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
然后 ./frps -c frps.ini、./frpc -c frpc.ini 就完事了。远程桌面就把 local_port 改成 3389,SSH 就 ssh -oPort=6000 test@x.x.x.x。HTTP 服务再加一行 vhost_http_port = 8080,客户端里设 type = http 和 custom_domains。
几个有用但容易忽略的点:
- 防火墙屏蔽 SSH 协议时,在 frpc 里加
use_encryption = true和use_compression = true。 - 面板状态
dashboard_port = 7500,但注意 proxy 数量多了会卡,官方也提示别乱开。 - 端口批量映射可以用
range:语法,例如local_port = 6000-6006,6007,会自动拆成多个 proxy。
坑:frp 配置灵活,但版本更新频繁,网上抄的配置可能在新版本失效,记得看官方 release 的 breaking change。
ew:应急和内网渗透才用的老古董
ew(EarthWorm)是纯 C 写的,轻量、单文件、跨平台,但只支持 SOCKS5 代理,而且项目已经停止更新了。所以日常生产别用它,它最适合的是「拿到一台机器的权限,想快速把内网流量代理出来做渗透」的场景。
正向代理:
./ew -s ssocksd -l 1080
反弹代理(公网主机先监听,内网机器回连):
./ew -s rcsocks -l 1080 -e 8888 # 公网 VPS 上
./ew -s rssocks -d 1.1.1.1 -e 8888 # 目标内网机器上
它还能做多级级联,比如 lcx_listen、lcx_tran、lcx_slave 组合起来,把深层次的 TCP 服务转发出来。但说实话,现在有更多现代选择(比如 frp 的 socks5 插件),除非环境受限必须用静态编译的老工具,否则别在生产环境折腾它。
坑:不更新就是最大的坑。如果你只是需要 socks5 代理,其实 frp 也能配 plugin = socks5,没必要上 ew。
ngrok:临时演示、本地调试 Webhook 最方便
ngrok 是闭源的,官方提供托管服务,注册账号填 authtoken 就能用,不需要自己准备公网服务器。特别适合本地起了个服务,想让远端同事临时看一下,或者调试微信/支付回调。
常用命令:
ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_****
ngrok http 80
ngrok tcp 3389
文件共享也可以:
ngrok http -auth="user:password" file:///Users/alan/share
坑:免费版域名是随机的,每次重启都会变,没法固定;官方 UI 里看流量和重放要付费。另外闭源,数据都要经过官方服务器,敏感场景慎用。自己搭个 frp 其实也就多花几分钟,但长期用还是 frp 稳妥。
最后说句实在话
内网穿透没有银弹。想省事、有 web 管理需求就 nps;要长期稳定、功能全面就 frp;应急渗透再考虑 ew;临时开个公网入口就 ngrok。
你现在的内网穿透方案是什么?有没有遇到过 frp 版本升级后配置不兼容的坑?我最近在纠结要不要给 frp 写 systemd 托管,求实测过的同学聊聊。