golang快速轻量级DNS代理与广告拦截插件blocky的使用
Golang快速轻量级DNS代理与广告拦截插件blocky的使用
Blocky是一个用Go编写的本地网络DNS代理和广告拦截器,具有以下特点:
主要特性
拦截功能
- 使用外部列表(广告拦截、恶意软件)拦截DNS查询并支持白名单
- 可按客户端组(儿童、智能家居设备等)定义允许/拒绝列表
- 定期重新加载外部允许/拒绝列表
- 支持正则表达式
- 可拦截请求域、响应CNAME(深度CNAME检查)和响应IP地址(针对IP列表)
高级DNS配置
- 自定义特定域名的DNS解析
- 条件转发到外部DNS服务器
- 可为每个客户端组定义上游解析器
性能优化
- 可自定义DNS查询答案缓存
- 预取和缓存常用查询
- 同时使用多个外部解析器
- 内存占用低
协议支持
- DNS over UDP和TCP
- DNS over HTTPS (DoH)
- DNS over TLS (DoT)
快速开始
使用Docker运行示例
# 使用Docker运行Blocky
docker run -d --name blocky \
-v ./config.yml:/app/config.yml \
-p 4000:4000 \
-p 53:53/udp \
spx01/blocky
配置文件示例 (config.yml)
# 上游DNS服务器配置
upstream:
default:
- 1.1.1.1
- 8.8.8.8
# 拦截列表配置
blocking:
blackLists:
ads: # 广告拦截列表
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
malware: # 恶意软件拦截列表
- https://mirror1.malwaredomains.com/files/justdomains
# 白名单配置
whiteLists:
ads:
- "whitelist.txt" # 本地白名单文件
# 客户端分组配置
clientGroupsBlock:
default: # 默认组
- ads
- malware
kids: # 儿童组
- ads
- malware
- "adult" # 额外拦截成人内容
# 端口配置
ports:
dns: 53
http: 4000
https: 443
tls: 853
# 日志配置
logLevel: info
Go代码集成示例
package main
import (
"context"
"fmt"
"github.com/0xERR0R/blocky/api"
)
func main() {
// 创建Blocky API客户端
client := api.NewClient("http://localhost:4000")
// 查询DNS解析
resp, err := client.Query(context.Background(), "example.com", "A")
if err != nil {
fmt.Printf("查询失败: %v\n", err)
return
}
fmt.Printf("查询结果: %+v\n", resp)
// 获取拦截列表
lists, err := client.BlockLists(context.Background())
if err != nil {
fmt.Printf("获取拦截列表失败: %v\n", err)
return
}
fmt.Printf("当前拦截列表: %+v\n", lists)
}
安装方式
-
Docker安装:
docker pull spx01/blocky
-
二进制安装:
- 从GitHub Releases页面下载对应平台的二进制文件
- 直接运行即可
-
Kubernetes安装:
- 使用社区提供的Helm chart部署
Blocky支持x86-64和ARM架构,可在树莓派等设备上运行良好。
完整文档
完整文档和配置示例请参考项目文档页面。
更多关于golang快速轻量级DNS代理与广告拦截插件blocky的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang快速轻量级DNS代理与广告拦截插件blocky的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang快速轻量级DNS代理与广告拦截插件Blocky使用指南
Blocky简介
Blocky是一款用Golang编写的快速、轻量级DNS代理和广告拦截工具,具有以下特点:
- 高性能DNS代理服务器
- 广告和跟踪器拦截功能
- 支持DNS-over-TLS (DoT)和DNS-over-HTTPS (DoH)
- 自定义域名重定向
- 查询日志记录
- 支持多种黑名单格式
安装Blocky
使用Docker安装
docker run -d --name blocky \
-v ./config.yml:/app/config.yml \
-p 53:53/tcp -p 53:53/udp \
-p 4000:4000 \
spx01/blocky
直接下载二进制文件
从GitHub Releases页面下载对应平台的二进制文件: https://github.com/0xERR0R/blocky/releases
基本配置
创建config.yml
配置文件:
upstream:
default:
- 1.1.1.1
- 8.8.8.8
blocking:
blackLists:
ads:
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
trackers:
- https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt
clientGroupsBlock:
default:
- ads
- trackers
port: 53
httpPort: 4000
logLevel: info
高级配置示例
upstream:
default:
- tcp-tls:1.1.1.1:853
- https://dns.google/dns-query
special:
- 192.168.1.1
blocking:
blackLists:
ads:
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
- /path/to/local/blacklist.txt
whiteLists:
whitelist:
- https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/whitelist.txt
clientGroupsBlock:
default:
- ads
192.168.1.0/24:
- ads
blockType: zeroIp
bootstrapDns: 1.1.1.1
port: 53
httpPort: 4000
prometheus:
enable: true
path: /metrics
queryLog:
type: csv
target: /logs/query.log
logRetentionDays: 7
edis:
enabled: true
addresses:
- redis:6379
使用Golang集成Blocky
虽然Blocky本身是一个独立应用,但你可以在Golang项目中集成其功能:
package main
import (
"context"
"fmt"
"net"
"time"
"github.com/miekg/dns"
)
func queryDNS(server, domain string) ([]string, error) {
c := new(dns.Client)
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn(domain), dns.TypeA)
m.RecursionDesired = true
r, _, err := c.Exchange(m, net.JoinHostPort(server, "53"))
if err != nil {
return nil, err
}
var ips []string
for _, ans := range r.Answer {
if a, ok := ans.(*dns.A); ok {
ips = append(ips, a.A.String())
}
}
return ips, nil
}
func main() {
// 使用本地Blocky实例查询
ips, err := queryDNS("127.0.0.1", "example.com")
if err != nil {
fmt.Println("DNS query failed:", err)
return
}
fmt.Println("IP addresses:", ips)
}
性能优化技巧
-
启用缓存:
caching: minTime: 30 maxTime: 600
-
使用Redis缓存:
redis: enabled: true addresses: - redis:6379
-
调整并发设置:
blocking: concurrency: 100
监控与日志
Blocky提供Prometheus指标端点(默认在:4000/metrics
)和查询日志功能:
queryLog:
type: csv
target: /var/log/blocky/query.log
logRetentionDays: 7
prometheus:
enable: true
path: /metrics
常见问题解决
-
DNS查询慢:
- 检查上游DNS服务器响应时间
- 启用缓存
- 考虑使用更快的上游DNS如Cloudflare或Google
-
广告拦截不生效:
- 确认黑名单已正确加载
- 检查客户端分组配置
- 查看日志确认拦截规则是否应用
-
内存使用高:
- 减少缓存时间
- 限制日志保留天数
- 使用更小的黑名单
Blocky是一个功能强大且灵活的DNS解决方案,特别适合需要广告拦截和隐私保护的环境。通过合理的配置,它可以成为你网络基础设施中高效可靠的DNS组件。