golang快速轻量级DNS代理与广告拦截插件blocky的使用

Golang快速轻量级DNS代理与广告拦截插件blocky的使用

Blocky是一个用Go编写的本地网络DNS代理和广告拦截器,具有以下特点:

Blocky Logo

主要特性

拦截功能

  • 使用外部列表(广告拦截、恶意软件)拦截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)
}

安装方式

  1. Docker安装

    docker pull spx01/blocky
    
  2. 二进制安装

    • 从GitHub Releases页面下载对应平台的二进制文件
    • 直接运行即可
  3. 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)
}

性能优化技巧

  1. 启用缓存

    caching:
      minTime: 30
      maxTime: 600
    
  2. 使用Redis缓存

    redis:
      enabled: true
      addresses:
        - redis:6379
    
  3. 调整并发设置

    blocking:
      concurrency: 100
    

监控与日志

Blocky提供Prometheus指标端点(默认在:4000/metrics)和查询日志功能:

queryLog:
  type: csv
  target: /var/log/blocky/query.log
  logRetentionDays: 7

prometheus:
  enable: true
  path: /metrics

常见问题解决

  1. DNS查询慢

    • 检查上游DNS服务器响应时间
    • 启用缓存
    • 考虑使用更快的上游DNS如Cloudflare或Google
  2. 广告拦截不生效

    • 确认黑名单已正确加载
    • 检查客户端分组配置
    • 查看日志确认拦截规则是否应用
  3. 内存使用高

    • 减少缓存时间
    • 限制日志保留天数
    • 使用更小的黑名单

Blocky是一个功能强大且灵活的DNS解决方案,特别适合需要广告拦截和隐私保护的环境。通过合理的配置,它可以成为你网络基础设施中高效可靠的DNS组件。

回到顶部