内网穿透域名过滤是保障外部访问安全的核心手段,通过限制可访问的域名列表,能有效防止未授权域名绑定和恶意流量进入内网。 无论你用的是frp、ngrok还是云服务商的私网连接,域名过滤做不好,就等于把家门钥匙挂在门边。
为什么内网穿透必须做域名过滤
内网穿透的本质是在内网服务与公网之间开一条隧道,很多人以为这条隧道天然安全,实际上公网侧所有请求都会涌向你的穿透节点,如果不加过滤,任何解析到你公网IP的域名都能到达内网服务,业内专家指出,多数内网穿透泄露事件并非加密被破解,而是域名校验缺失导致的管理后台暴露。
具体影响有三个层面:
- 安全边界失效:攻击者把恶意域名解析到你的IP,直接绕过你的访问控制。
- 流量成本失控:未过滤的域名会引来大量扫描流量,占用穿透带宽和服务器资源。
- 业务数据污染:非法域名可能注入伪造的Host头,污染你的应用日志和统计。
行业共识认为,域名过滤是内网穿透的第一道闸门,重要性不亚于密码强度。
内网穿透域名过滤怎么设置才安全
要理解域名过滤,先抓住两个核心校验点:HTTP Host头和TLS的SNI字段,普通HTTP请求靠Host头识别目标域名,HTTPS请求则通过SNI在握手阶段暴露域名,过滤机制就是在这两个层面做白名单或黑名单匹配。
内网穿透域名过滤价格与免费方案对比
不同方案的过滤能力差异很大,价格也不是唯一衡量标准,下表对比了四种常见路径:
| 方案 | 域名过滤方式 | 成本形态 | 适用场景 |
|---|---|---|---|
| 自建frp | 配置文件指定customDomains,天然白名单 | 免费,需自担服务器成本 | 有Linux服务器、爱折腾的技术玩家 |
| ngrok免费版 | 强制分配随机域名,不支持自定义过滤 | 免费但域名不可控 | 临时演示、快速调试 |
| ngrok商用版 | 支持自定义域名和访问规则 | 按月订阅,价格随带宽上涨 | 需要稳定域名和团队协同 |
| 花生壳内网穿透 | 域名绑定需实名认证,自动过滤未授权域名 | 按带宽或通道数收费 | 家庭用户、中小型设备管理 |
免费方案并不等于零成本,自建frp占用一台公网服务器的带宽和CPU,ngrok免费版的随机域名无法用于正式业务,如果你需要长期固定的域名过滤规则,花点钱买托管服务其实更划算。
内网穿透 域名过滤 对比:自建frp与托管服务
自建frp的优势是规则完全可控,可以做到严格的域名白名单,只允许你预先登记的域名访问内网服务,缺陷是配置需要自己动手,出错时排查成本高。
托管服务(比如Cloudflare Tunnel或NatType)则把过滤逻辑内置在边缘节点,你不需要维护Nginx或frp配置,直接在控制台添加允许的域名即可,但同样有隐性限制:部分服务只校验域名,不校验路径和参数,过滤粒度不够细。
选择建议:
- 个人使用,追求可玩性:frp + Nginx双重过滤。
- 团队使用,需要审计日志:托管服务 + 前置CDN。
- 对安全要求极高:自建节点 + 企业级WAF规则。
内网穿透怎么设置域名过滤?一步步操作
以目前使用率最高的frp为例,演示从零配置域名白名单的完整流程,前提是你有一台公网Linux服务器和一个已备案域名(国内服务器需要)。
第一步:配置frps服务端
修改frps.ini,启用虚拟主机端口和子域名支持:
[common] bindPort = 7000 vhostHTTPPort = 8080 subdomainHost = frp.example.com
这里vhostHTTPPort是HTTP流量的统一入口,subdomainHost定义你的基础域名,所有请求到达这个端口后,frp会根据Host头路由到对应的内网服务。
第二步:配置frpc客户端
在需要暴露的内网机器上,编辑frpc.ini:
[web] type = http localPort = 80 customDomains = blog.example.com
customDomains就是你允许访问的域名白名单,只写这一个域名,其他域名即使解析到你的服务器IP也会被frp拒绝,注意,这里千万不要留空,留空等于放行所有Host。
第三步:用Nginx做二级域名过滤
frp自带的域名校验足够用,但如果你想把过滤规则做得更细,可以在frp前面加一层Nginx:
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
server {
listen 80 default_server;
return 444;
}
第二个default_server会拦截所有未匹配的域名,直接断开连接,这是最粗暴也最有效的黑名单兜底。
第四步:验证过滤是否生效
在服务器本地用curl测试:
curl -H "Host: blog.example.com" http://你的服务器IP:8080 curl -H "Host: evil.example.com" http://你的服务器IP:8080
第一条应返回内网服务的响应,第二条应返回连接被重置或404,如果两条都通,说明frp版本较老或配置有误,需要检查vhostHTTPPort和客户端类型是否匹配。
如果你用的是ngrok,更简单,在ngrok控制台绑定域名时,系统会要求你验证域名所有权,验证通过后只有这个域名能转发到你的隧道,花生壳则是在内网穿透管理后台添加域名白名单,路径略有不同,但原理一致。
域名过滤的常见陷阱与避坑指南
配置过滤不是加一行域名就完事,下面这几个坑几乎人人都踩过。
- 只过滤IP不校验Host:不少教程让你在防火墙里设置IP白名单,但穿透节点暴露的是同一个公网IP,不同域名都会解析到它,IP过滤无法阻止恶意域名访问,必须靠Host过滤。
- HTTP和HTTPS混用:frp的
vhostHTTPPort只处理HTTP流量,如果内网服务是HTTPS,需要额外配置vhostHTTPSPort和TLS证书,很多人在这一步失败,是因为把HTTP的过滤规则套在HTTPS上。 - 正则表达式使用不当:有些高级配置支持域名正则匹配,比如
.example.com,但要注意example.com和.example.com并不等价,后者不匹配裸域名,写规则时两个都要写。 - 忽视IPv6地址:相当一部分内网穿透节点有IPv6公网地址,攻击者可以用IPv6直接访问你的端口,绕过只针对IPv4的过滤规则,配置时务必确认监听地址是
0.0.0还是。
更稳妥的做法是额外加一层访问频率限制和UA黑名单,域名过滤只能解决“谁能访问”,不能解决“访问得多暴力”,把两者结合,才是完整的防护。
内网穿透域名过滤的Q&A
问:内网穿透域名过滤和端口转发有什么区别?
端口转发是直接把公网端口映射到内网服务,任何人扫到端口就能访问,唯一的门槛是端口号,域名过滤则是在HTTP层判断请求的Host或SNI字段,只允许指定域名通过,未匹配的请求直接丢弃,前者是网络层控制,后者是应用层控制,后者的安全粒度更高。
问:内网穿透域名过滤会影响访问速度吗?
过滤本身仅做字符串匹配和转发,损耗在微秒级,几乎不影响带宽和延迟,真正的性能瓶颈在穿透节点的带宽、TLS加解密以及后端服务的处理能力,如果你用的是自带域名过滤的托管服务,边缘节点还会做缓存,访问速度反而可能更快。
问:如何检查内网穿透域名过滤规则是否生效?
最简单的做法是从外部访问一个未配置的域名,观察是否被拒绝,更严谨的方式是在服务器上抓包,用tcpdump -i eth0 port 8080查看到达穿透端口的请求Host头,再对比frp日志中的拒绝记录,所有主流穿透工具都会在日志里输出“host not found”或“unknown domain”之类的信息,看到这类记录就说明过滤已在工作。