A lightweight home network DNS ad-block system built on Unbound and NSD.
Adhole ไปๅคไธชไบ่็ฝๅผๆบ้ปๅๅๆบ่ๅๅๅๆฐๆฎ๏ผ่ชๅจๆธ
ๆดๅป้๏ผ่พๅบ้้
Unbound always_null ่ฏญๆณ็ Zone ้
็ฝฎๆไปถใๅฐๅ
ถ้จ็ฝฒๅฐๅฎถไธญ DNS ๆๅกๅจๅณๅฏๅฎ็ฐๅ
จ็ฝ่ฎพๅค็ไธ็ซๅผๅนฟๅๅๆถๆ็ฝ็ซๆฆๆชใ
Adhole aggregates domain blocklists from multiple open-source internet sources, performs automatic cleanup and deduplication, then outputs an Unbound always_null Zone config file. Deploy it as your home DNS resolver to block ads and malicious sites for every device on your network.
| ็นๆง | Feature |
|---|---|
| ๐ ๆ ็ฎก็้ขๆฟ โ ็บฏๅฝไปค่ก๏ผ้ ็ฝฎๅณๆๅพ | No Web UI โ CLI-only, config-as-code |
| ๐ ๅบไบ Unbound + NSD โ ้ซๆง่ฝๆฌๅฐ้ๅฝ่งฃๆๅจ | Based on Unbound + NSD โ high-performance local recursive resolver |
| ๐ ๅคๆบ่ๅ โ OISDใStevenBlackใๅจ่ๆ ๆฅ็ญๆฐๅไธชๆบ | Multi-source aggregation โ OISD, StevenBlack, threat intel, and dozens more |
| ๐ฆ ๆ่ดๅ็ผฉ โ zst ๆ ผๅผไป 11 MB | Ultra-compressed โ only ~11 MB in zst format |
| โก ้ถ่ฟ็ปด โ cron ่ชๅจๆๅๆดๆฐ | Zero-maintenance โ cron auto-pulls updates |
# 1. ๅฎ่ฃ
ไพ่ตๅ
sudo ./install_pkg.sh
# 2. ็ๆ Zone ๆไปถๅนถๆๅปบ
./scripts/main.sh sync
# 3. ๅฏๅจ DNS ๆๅก
sudo ./setup_dns.shๅฆๆไฝ ๅชๆณ็จๆๅฐ็ๆญฅ้ชค่ท่ตทๆฅ๏ผๅฏไปฅ็จๆไปฌๅๅคๅฅฝ็ ไธ้ฎๅฎ่ฃ ่ๆฌใ
- ไธ่ฝฝ VDI ้ๅ
- ่งฃๅๅๅจ VirtualBox ไธญๆณจๅ
.vdiๆไปถ๏ผๆฐๅปบ่ๆๆบ๏ผๆกฅๆฅ็ฝ็ปใ1024MB ๅ ๅญใ1 ๆ ธ CPU๏ผ - ้ป่ฎค็ปๅฝ๏ผ็จๆท
adhole๏ผๅฏ็ ไธบ็ญไธปๆบๅadhole-18 - ๅฐ่ทฏ็ฑๅจ DNS ๆๅๆญค่ๆบ IP ๅณๅฏ็ๆ
# 1. ไธ่ฝฝ qcow2 ้ๅ
wget https://github.com/LeisureLinux/adhole/releases/download/adhole/adhole-1.1.5_amd64.qcow2.zst
# 2. ่งฃๅ
zstd -d adhole-1.1.5_amd64.qcow2.zst
# 3. ๅฏผๅ
ฅ VM๏ผๆฟๆขไฝ ็็ฝ็ปๅ็งฐๅ SSH ๅ
ฌ้ฅ่ทฏๅพ๏ผ
virt-install --vcpu 1 --memory 2048 --name adhole \
--osinfo detect=on,name=debian11 --network=default \
--noautoconsole --import \
--disk adhole-1.1.5_amd64.qcow2้ป่ฎค่ดฆๆท๏ผdebian / LeisureLinux
SSH ่ฟๆฅ๏ผssh debian@adhole.local๏ผ้ avahi-daemon๏ผๆ virsh net-dhcp-leases default ๆฅ IP
ๅฐ็ฎๆ ๆบๅจๆ่ทฏ็ฑๅจ็ DNS ๆๅ Adhole ๆๅกๅจๅๆต่ฏ๏ผ
# Linux/Mac
dig +short www.baidu.com @<adhole-ip> # โ ๆญฃๅธธ IP
dig +short a.baidu.com @<adhole-ip> # โ 0.0.0.0๏ผๅทฒๆฆๆช๏ผ
# Windows CMD
nslookup
server <adhole-ip>
www.baidu.com # โ ๆญฃๅธธ IP
a.baidu.com # โ 0.0.0.0๏ผๅทฒๆฆๆช๏ผ Internet
โ
โโโโโโโโโดโโโโโโโโ
โ NSD โ โ Root zone slave, runs on 127.0.0.1:1053
โ (anti-hijack) โ Prevents ISP DNS hijacking
โโโโโโโโโฌโโโโโโโโ
โ
โโโโโโโโโดโโโโโโโโ
โ Unbound โ โ Local resolver on 0.0.0.0:53
โ + adhole.conf โ Forwards to NSD; intercepts ad domains
โโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโดโโโโโโโโ
โ Your Devices โ โ Phones, PCs, IoT...
โโโโโโโโโโโโโโโโโ
- NSD ไฝไธบ root zone ไปๆๅกๅจ่ฟ่กๅจ
127.0.0.1:1053๏ผ้ฒๆญข่ฟ่ฅๅๅซๆ - Unbound ็ๅฌ
0.0.0.0:53๏ผ้คlocal-zone้ ็ฝฎ็ๅๅๅคๅ จ้จ่ฝฌๅ็ป NSD - ๆฌๆบไฝฟ็จ
127.0.0.1:53๏ผUnbound๏ผไฝไธบๆฌๅฐ DNS ่งฃๆๅจ
# ไธ้ฎๆง่ก๏ผbuild โ upload โ pull
./scripts/main.sh sync
# ไนๅฏๅๆญฅๆง่ก
./scripts/main.sh build # ๆๅใๆธ
ๆดใ็ๆ adhole.conf.zst
./scripts/main.sh upload # ไธไผ ๅฐ GitHub Release
./scripts/main.sh pull # ๆๅๆๆฐ zone ๆไปถๅนถ้่ฝฝ
./scripts/main.sh pull ./custom.zst # ไปๆฌๅฐๆไปถ็ดๆฅ้จ็ฝฒ่ฏฆ็ป่ฏดๆ่ฏท่ง scripts/README.mdใ
็ผ่พ crontab ๅฎ็ฐๆฏๆฅ่ชๅจๆดๆฐ๏ผ
# ๆฏๅคฉๅๆจ 2:10 ๆง่ก
10 2 * * * cd /path/to/adhole && ./scripts/main.sh pull >/dev/null 2>&1้ฆๆฌกไฝฟ็จๅๅปบ่ฎฎๅจ็ป็ซฏๆๅจๆง่กไธๆฌก๏ผ็กฎ่ฎคๆ ่ฏฏๅๅๅ ๅ ฅๅฎๆถไปปๅกใ
ๅฎถไธญๅค่ฎพๅคไธ้ข็นๅๆข VPN๏ผ็จ WPAD ่ฎฉ่ฎพๅค่ชๅจ้ๆฉๆฏๅฆ่ตฐไปฃ็๏ผ
sudo ./wpad/wpad.sh setup # ๆทปๅ wpad.service + wpad.timerๅฎขๆท็ซฏๆต่งๅจ่ฎพ็ฝฎไธบใ่ชๅจๆฃๆตไปฃ็ใ๏ผ่ชๅจ่ทๅ http://wpad.local/wpad.datใiOS ๆ ้้ขๅค้
็ฝฎใ
adhole/
โโโ conf/ # DNS ๆๅกๅจ้
็ฝฎ
โ โโโ nsd.conf # NSD root zone slave ้
็ฝฎ
โ โโโ unbound.conf # Unbound ไธป้
็ฝฎ
โโโ data/ # ๆฐๆฎๆบไธไบงๅบ
โ โโโ block_urls.txt # HOSTS ๆ ผๅผ้ปๅๅๆบ URL
โ โโโ threat_urls.txt # ๅจ่ๆ
ๆฅๆบ URL๏ผๆจ้ฉฌ/้้ฑผ/้ด่ฐ่ฝฏไปถ๏ผ
โ โโโ text_urls.txt # ๆๆฌๆ ผๅผ้ปๅๅๆบ URL
โ โโโ adblock_urls.txt # Adblock/uBlock ่ฟๆปคๅ่กจๆบ URL๏ผBrave๏ผ
โ โโโ block_domains.txt # ่ชๅฎไนๅฐ้ๅๅ๏ผๆฏ่กไธไธช๏ผ
โ โโโ unblock_domains.txt # ็ฝๅๅๆ้ค้กน
โ โโโ result/ # ไบงๅบ็ฎๅฝ
โ โโโ adhole.conf.zst # ๆ็ป Zone ้
็ฝฎ๏ผๅ็ผฉ็๏ผ
โ โโโ adhole_status.txt # ๅๆบ็ถๆๆ่ฆ
โ โโโ grab_*.log # ๆฏๆฌก่ฟ่กๆฅๅฟ๏ผไฟ็ 10 ๅคฉ๏ผ
โโโ scripts/ # ๆๅปบ็ฎก็บฟไธๅทฅๅ
ท
โ โโโ main.sh # ๅ
ฅๅฃ๏ผbuild โ upload โ pull ็ฎก็บฟ
โ โโโ build_adhole.sh # ๆ ธๅฟๅผๆ๏ผๆๅใๆธ
ๆดใๅป้ใ็ๆ
โ โโโ dns-op.sh # DNS ๆไฝ่พ
ๅฉ
โ โโโ wpad-mgmt.sh # WPAD ็ฎก็
โ โโโ setup_dns.sh # DNS ๆๅกๅๅงๅ
โ โโโ install_pkg.sh # ไพ่ตๅ
ๅฎ่ฃ
โโโ wpad/ # WPAD ๆๅกๆไปถ
โ โโโ wpad.sh
โ โโโ wpad.service
โ โโโ wpad.timer
โโโ utils/ # ๆ้กนๅทฅๅ
ท
โโโ .proxy # HTTP/SOCKS ไปฃ็ๅฐๅ๏ผๅฏ้๏ผ
โโโ LICENSE
โโโ README.md
ๆๆๆฐๆฎๆบ้่ฟ็บฏๆๆฌๆไปถ็ฎก็๏ผๆ ้ไฟฎๆน่ๆฌไปฃ็ ใ
็ผ่พ data/block_urls.txt๏ผHOSTS ๆ ผๅผ๏ผๆ data/threat_urls.txt๏ผๅจ่ๆ
ๆฅ/TXT๏ผ๏ผ
https://raw.githubusercontent.com/example/custom-list/master/hosts๐ก Adblock / uBlock ่ฟๆปคๅ่กจ๏ผ
data/adblock_urls.txtๆฏๆ Adblock Plus / uBlock ่ฟๆปคๅ่กจ๏ผไพๅฆ Brave ็brave-lists๏ผใ่ๆฌๅชๆๅๅ ถไธญ็ๆดๅๅ่งๅ||domain.tld^ๅนถ่ฝฌๆขไธบ Unboundlocal-zone always_null๏ผURL ่ทฏๅพใ$domain=ใ ๅ ็ด ้่##ใ่ๆฌ##+jsไธ็ฝๅๅ@@่งๅๆ ๆณๅจ DNS ๅฑ่กจ่พพ๏ผไผ่ขซ่ทณ่ฟใ
็ผ่พ data/block_domains.txt๏ผๆฏ่กไธไธชๅๅ๏ผ
ads.myapp.com
tracking.evil.net็ผ่พ data/unblock_domains.txt๏ผ้ฒๆญข่ฏฏๆๆญฃๅธธไธๅก๏ผ
as.weixin.qq.com
pandora.xiaomi.com
cm.bilibili.com๐ก ๆฌข่ฟๆไบค PR ๅไบซไฝ ็่ชๅฎไนๅ่กจ๏ผContribute your
block_domains.txtorunblock_domains.txtvia PR.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Step 1: Initialize โ
โ โข Read proxy from ~/.proxy โ
โ โข Create cache dir $HOME/.cache/adhole โ
โ โข Clean logs older than 10 days โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Step 2: Fetch Remote Sources โ
โ โข grab_oisd() โ OISD UNBOUND list (cached 24h) โ
โ โข block() โ HOSTS-format lists (retry ร3) โ
โ โข block_text()โ Threat intel TXT files โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Step 3: Parse & Clean โ
โ โข Auto-detect hosts / local-zone / Adblock formats โ
โ โข Remove IPs, blanks, comments โ
โ โข Normalize to: local-zone "domain" always_null โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Step 4: Merge & Filter โ
โ โข Merge all sources + local block_domains.txt โ
โ โข Exclude whitelist from unblock_domains.txt โ
โ โข Lowercase + deduplicate + sort โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Step 5: Validate & Output โ
โ โข Syntax check via unbound-checkconf โ
โ โข Compress to .zst (~11 MB) โ
โ โข Generate status summary โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
้่ฏฏๅค็ / Error Handling๏ผไปปไฝๆๅๅคฑ่ดฅๆถ็ซๅณ้ๅบ๏ผexit 1๏ผ๏ผไธๆฑกๆๅทฒๆ็ปๆโโๆฒกๆๅนฒๅ็ๆฐๆฎๅฐฑไธ่ฏฅๅๅ
ฅ่พๅบ็ๆธ
ๅใ
| ้กน็ฎ | ่ฏดๆ | Note |
|---|---|---|
| โ DNSSEC | ไธบๅๅฐ้ฎ้ขๅทฒๅ ณ้ญ | Disabled to avoid resolution failures |
| ๐ ้ฒๅซๆ | NSD ไฝไธบ root server ้ฟๅ ่ฟ่ฅๅ DNS ๅซๆ | NSD acts as root to prevent ISP hijacking |
| ๐ ไปฃ็ | ๅฆ้่ฆ็ฟปๅขไธ่ฝฝ้ปๅๅ๏ผๅจ ~/.proxy ไธญๅๆไปฃ็ๅฐๅ |
Put proxy info in ~/.proxy: socks5://IP:port |
| ๐พ ็ฃ็ | ๆจ่ โฅ16GB SD ๅกๆๅญๅจ็ฉบ้ด | โฅ16GB recommended for SD card |
| ๐ ่ฏญ่จ | DNS ๆฌ่บซๆฏ็ๅญฆ๏ผ่ฐ่ฏๅฐ้พๆถๆ่ๅฟ | DNS is tricky โ be patient when debugging |
| ๆๅก | ็ซฏๅฃ | ็ปๅฎๅฐๅ | ่ฏดๆ |
|---|---|---|---|
| NSD | 1053 | 127.0.0.1 | root zone slave๏ผๅฏนๅคไธๅฏ่ง |
| Unbound | 53 | 0.0.0.0 | ไธป DNS ่งฃๆๅจ๏ผๆฅๅๅฑๅ็ฝๆฅ่ฏข |
ๆฃๆฅ็ซฏๅฃ็ถๆ๏ผ
ss -tln | grep -E ':(53|1053)\b'| ๅ ๅ | Package | ็จ้ | ๅฎ่ฃ ๆนๆณ |
|---|---|---|---|
curl |
โ | HTTP ่ฏทๆฑ | ็ณป็ป่ชๅธฆ / Built-in |
zstd |
zst | ๅ็ผฉ/่งฃๅ | apt install zstd |
parallel |
parsort | ้ซๆง่ฝๆๅบ | apt install parallel |
dos2unix |
โ | ๆข่ก็ฌฆ่ฝฌๆข | apt install dos2unix |
unbound |
unbound-checkconf | ้ ็ฝฎๆ ก้ช | apt install unbound |
gh |
GitHub CLI | Release ไธไผ | apt install gh |
sudo |
โ | ๆ้ๆๅ | ็ณป็ป่ชๅธฆ / Built-in |
MIT License โ Use at your own will, no warranty.
See LICENSE for details.
LeisureLinux (Albert Xu)
Bilibili ID: LeisureLinux
Email: albertxu@freelamp.com