- 项目GitHub源码地址:
https://github.com/0xERR0R/blocky - 常用广告域名黑名单来源:
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts - 配置文件设置步骤:
upstreams:
groups:
default: ## 配置默认的DNS服务器
- 223.5.5.5
- 114.114.114.114
blocking:
denylists:
ads: ## 配置广告黑名单,可选择将文件下载到NAS本地并指定路径
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
clientGroupsBlock:
default:
- ads
customDNS:
customTTL: 1h
mapping: # 配置自定义域名,将其解析到NAS的IP地址
n100.com: 192.168.31.30
j1900.cn: 192.168.31.20
ports:
dns: 53
http: 4000
- 快速启动命令示例:
docker run --name blocky \
-v /path/to/config.yml:/app/config.yml \
-p 4000:4000 -p 53:53/udp \
spx01/blocky
完成上述安装和启动流程后,将电脑或移动设备的DNS服务器地址修改为NAS的IP,即可体验到无广告干扰的纯净DNS解析服务。
Blocky DNS代理功能详解
Blocky 是一款采用 Go 语言编写的本地网络 DNS 代理与广告拦截工具,具备以下核心特性:
-
高效拦截功能 - 支持使用外部列表(如广告和恶意软件黑名单)以及自定义允许列表来阻止不良DNS查询
- 可根据不同客户端组(例如儿童设备或智能家居设备)定义独立的允许和拒绝列表
- 自动定期更新外部允许和拒绝列表内容
- 提供正则表达式支持,增强匹配灵活性
- 支持拦截请求域名、响应中的CNAME记录(深度CNAME检测)以及响应IP地址(基于IP列表过滤)
-
高级DNS配置选项 - 不仅仅局限于广告拦截
- 为特定域名设置自定义DNS解析规则
- 支持条件式转发到外部DNS服务器
- 可按客户端组别定义上游DNS解析器
-
性能优化机制 - 显著提升网络速度和响应效率
- 可自定义DNS查询结果的缓存时间,加速解析过程并减少外部查询次数
- 支持预取和缓存常用查询结果
- 允许同时使用多个外部DNS解析器
- 占用内存资源极少,运行轻量高效
-
多协议支持能力 - 兼容现代DNS通信协议
- 支持通过UDP和TCP进行标准DNS查询
- 集成DNS over HTTPS(DoH)功能
- 提供DNS over TLS(DoT)加密传输
-
安全与隐私保护 - 确保通信过程安全可靠
- 支持现代DNS扩展功能,如DNSSEC和eDNS
- 完全自由配置阻止列表,无隐藏过滤行为
- 可作为DoH端点提供服务
- 在配置中使用随机上游解析器,分散DNS流量以增强用户隐私
- Blocky 不收集任何用户数据、遥测信息或统计资料
-
系统集成特性 - 提供丰富的监控和分析工具
- 输出Prometheus格式的指标数据
- 提供预配置的Grafana仪表板(支持Prometheus和多种数据库)
- 支持以CSV格式或MySQL/MariaDB/PostgreSQL/Timescale数据库记录每日及每客户端的DNS查询,便于深度分析
- 提供多种REST API接口
- 包含命令行工具(CLI)
-
简易配置管理 - 基于YAML格式的单一或多配置文件
- 维护操作简单直观
- 备份和恢复配置便捷
-
简单安装与部署 - blocky 设计注重易用性
- 无状态运行(无需数据库或临时文件)
- 提供支持多架构的Docker镜像
- 单二进制文件部署
- 兼容x86-64和ARM架构,适合在Raspberry PI等设备上运行
- 社区提供Helm chart用于Kubernetes环境部署
Blocky在实际网络环境中的应用案例
- 创建清爽无干扰的上网环境
许多用户经常受到类似“是兄弟就来砍我”或“澳门新葡京”等弹窗广告的骚扰。通过配置blocky并使用上述denylists黑名单,可以有效减少这类广告的显示。该黑名单会持续更新,具备抓包分析能力的用户还可以自行添加本地记录,进一步定制广告过滤规则。
- 结合nginx实现应用流量分发
在NAS上部署多个服务时,往往需要记忆不同端口号,这给访问带来不便。通过在blocky中配置自定义域名(例如 n100.com),并将其指向NAS的IP地址(注意:n100.com 并非实际购买的域名,仅用于内部记忆,用户可随意定义类似域名),可以简化访问流程。
配合nginx配置示例如下:
## 游戏应用2048
server {
listen 80;
server_name 2048.n100.com; # 使用易于记忆的二级域名
# 通过该域名可直接访问部署的2048游戏
root /usr/local/games/2048-master;
index index.html index.htm;
}
# Transmission下载工具
server {
listen 80 ;
server_name tr.n100.com; # 配置域名直接指向Transmission服务
location /{
proxy_pass http://127.0.0.1:9091;
}
}
# van-nav导航服务
server {
listen 80 ;
server_name nav.n100.com;
location /{
proxy_pass http://127.0.0.1:6412;
}
}
... # 其他服务配置类似,不再重复列举
尽管这些域名并非实际注册,但在blocky系统中,用户可以自由定义并使用任何域名来指向内部服务,实现便捷的本地网络管理。
部署建议与总结
部署DNS代理最便捷的方式是在路由器中安装相应插件。如果路由器不支持外部插件安装,建议将主DNS服务器地址设置为NAS的IP,次要DNS地址配置为公共DNS(如114.114.114.114),这样即使NAS出现故障,也不会影响基本的上网功能。这种方法在保证功能性的同时,提供了冗余备份,确保网络服务的稳定性。