搭建无污染无广告分流DNS over HTTPS服务器 1 __2023年6月25日 __3条评论 __313次阅读 __0人点赞 __Tao_Qi 前言 随手写一下搭建方式吧,和个人取舍的一些东西。 结构图
搭建使用的软件
- 中间件NGINX(可选) 用于阻止IP直接访问,作为反向代理使用。
- 前端服务端 m13253/dns-over-https 用于接受客户端DNS请求
- 服务端 AdguardTeam/AdGuardHome 用于可视化规则管理。
- 服务端 IrineSistiana/mosdns-cn 简单的分流工具,用于分流国内外域名。
搭建过程(源代码)
首先搭建dns-over-https服务器(官方的教程参考:这里)
- 首先根据自己的操作系统安装golang环境
- 运行
[code] # 创建gopath
mkdir ~/gopath
export GOPATH=~/gopath
# 拉取代码
cd /tmp
git pull https://github.com/m13253/dns-over-https
cd dns-over-https
# 编译安装
make && sudo make install
[/code]
3. 修改配置文件 `sudoedit /etc/dns-over-https/doh-client.conf`,参考配置:[code] # 监听端口,由于使用NGINX反向代理,故使用127.0.0.1监听本地。
listen = [
"127.0.0.1:8053",
# ":8053",
]
local_addr = ""
# 前端已嵌套CDN且反向代理已设置证书,无需再次设置证书。
cert = ""
key = ""
# 可以按需修改路径
path = "/dns-query"
# 这里用了两个地址,用于提高获取成功率。
upstream = [
"udp:127.0.0.1:53",
"tcp:127.0.0.1:53",
]
# 上游超时,最小1s
timeout = 1
# 上游超时重试次数
tries = 10
verbose = false
log_guessed_client_ip = false
ecs_allow_non_global_ip = false
ecs_use_precise_ip = false
# If DOH is used for a controlled network, it is possible to enable
# the client TLS certificate validation with a specific certificate
# authority used to sign any client one. Disabled by default.
# 这里可以设置对应的用户证书访问限制(使用CDN回源证书,限制为CDN访问),可以摒弃NGINX;多个443端口应用还是需要NGINX的,我们这边不用这些选项。
# tls_client_auth = true
# tls_client_auth_ca = "root-ca-public.crt"
[/code]
4. 安装服务(根据自己的操作系统)[code] sudo systemctl start doh-client.service
sudo systemctl enable doh-client.service
[/code]
搭建AdGuardHome服务器(官方的教程参考:这里)
- 下载对应的版本,安装
[code] # linux-amd64服务器运行
cd /tmp/
wget https://github.com/AdguardTeam/AdGuardHome/releases/latest/download/AdGuardHome_linux_amd64.tar.gz
tar -zxvf AdGuardHome_linux_amd64.tar.gz -C /usr/local/
cd /usr/local/AdGuardHome
./AdGuardHome -s install
[/code]
2. 访问服务器对应`http://IP:3000`,设置好用户名和密码。
3. 再次访问服务器对应`http://IP:3000`,配置好自己需要的过滤器,上游填写`127.0.0.1:60053`备用搭建mosdns-cn服务器
- 下载对应的版本,安装
[code] # linux-amd64服务器运行
cd /tmp/
wget https://github.com/IrineSistiana/mosdns-cn/releases/latest/download/mosdns-cn-linux-amd64.zip
mkdir /usr/local/mosdns
unzip mosdns-cn-linux-amd64.zip -d /usr/local/mosdns
chmod x /usr/local/mosdns/mosdns-cn
[/code]
2. 编写配置文件[code] cat < /usr/local/mosdns/config.yaml
server_addr: "127.0.0.1:60053"
cache_size: 0
lazy_cache_ttl: 0
lazy_cache_reply_ttl: 0
redis_cache: ""
min_ttl: 30
max_ttl: 0
hosts: []
blacklist_domain: []
insecure: false
ca: []
debug: false
log_file: ""
upstream: []
# 国内支持ECS的几家服务器
local_upstream:
- https://dot.pub/dns-query
- https://dns.alidns.com/dns-query
- https://doh.360.cn/dns-query
local_ip:
- /usr/local/mosdns/geoip.dat:cn
local_domain:
- /usr/local/mosdns/geosite.dat:cn
- /usr/local/mosdns/geosite.dat:apple
- /usr/local/mosdns/geosite.dat:akamai
- /usr/local/mosdns/geosite.dat:google-cn
- /usr/local/mosdns/geosite.dat:tld-cn
- /usr/local/mosdns/geosite.dat:category-games@cn
local_latency: 500
# 根据具体情况增删注释
remote_upstream:
# - udp://[2001:4860:4860::8888]
# - udp://8.8.8.8
# - udp://9.9.9.11
# - udp://[2620:fe::11]
- https://dns.google/dns-query
- https://dns11.quad9.net/dns-query
remote_domain:
- /usr/local/mosdns/geosite.dat:geolocation-!cn
working_dir: ""
cd2exe: false
EOF
[/code]
3. 下载对应分流规则的`geosite.dat`文件和`geoip.dat` (由于会不定时更新规则,建议加入crontab内获取并重启mosdns-cn服务)[code] curl -fSsL https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /usr/local/mosdns/geosite.dat
curl -fSsL https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat -o /usr/local/mosdns/geoip.dat
[/code]
4. 安装为服务[code] /usr/local/mosdns/mosdns-cn --service install --config /usr/local/mosdns/config.yaml
[/code]
- NGINX配置实例
[code] server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 域名;
server_tokens off;
access_log off;
allow 2400:cb00::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;
allow 173.245.48.0/20;
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 141.101.64.0/18;
allow 108.162.192.0/18;
allow 190.93.240.0/20;
allow 188.114.96.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 162.158.0.0/15;
allow 104.16.0.0/13;
allow 104.24.0.0/14;
allow 172.64.0.0/13;
allow 131.0.72.0/22;
deny all;
ssl_protocols TLSv1.2 TLSv1.3; # TLS 1.3 requires nginx >= 1.13.0
ssl_certificate CDN回源公钥pem证书路径;
ssl_certificate_key CDN回源私钥key证书路径;
# HTTP Security Headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=63072000";
# 按照dns-over-https的路径填写
location /dns-query {
limit_req zone=dns burst=5000 nodelay;
proxy_pass http://127.0.0.1:60053/dns-query;
# 用于识别subnet
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
}
# 用于管理AdGuardHome的
location /manage/ {
proxy_pass http://127.0.0.1:3000/;
}
# 禁止访问根目录
location / {
return 403;
}
}
[/code]
搭建过程(docker-compose) 这个比较简单
- 安装
docker-compose - 运行
[code] cd ~
cat < docker-compose.yml
version: '3'
networks:
dns-server:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.100.0.0/16
gateway: 172.100.0.1
- subnet: fd10::/64
gateway: fd10::1
services:
mosdns:
image: xuss/mosdns-cn:latest
hostname: mosdns
networks:
dns-server:
ipv4_address: 172.100.0.2
ipv6_address: fd10::2
volumes:
- "/etc/mosdns-cn/:/etc/mosdns-cn/"
restart: always
adguardhome:
image: adguard/adguardhome
hostname: adguardhome
networks:
dns-server:
ipv4_address: 172.100.0.3
ipv6_address: fd10::3
ports:
# - "127.0.0.1:3000:3000"
- "3000:3000"
depends_on:
- mosdns
volumes:
- "/etc/adguardhome/work/:/opt/adguardhome/work/"
- "/etc/adguardhome/conf/:/opt/adguardhome/conf/"
restart: always
doh-server:
image: satishweb/doh-server:latest
hostname: doh-server
ports:
# - "127.0.0.1:60053:60053"
- "60053:60053"
networks:
dns-server:
ipv4_address: 172.100.0.4
ipv6_address: fd10::4
environment:
UPSTREAM_DNS_SERVER: "udp:adguardhome:53"
DOH_HTTP_PREFIX: "/dns-query"
DOH_SERVER_LISTEN: ":60053"
DOH_SERVER_TIMEOUT: "1"
DOH_SERVER_TRIES: "10"
DOH_SERVER_VERBOSE: "false"
depends_on:
- mosdns
- adguardhome
restart: always
EOF
mkdir /etc/mosdns-cn
curl -fSsL https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /etc/mosdns-cn/geosite.dat
curl -fSsL https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat -o /etc/mosdns-cn/geoip.dat
cat < /etc/mosdns-cn/config.yaml
server_addr: "0.0.0.0:53"
cache_size: 0
lazy_cache_ttl: 0
lazy_cache_reply_ttl: 0
redis_cache: ""
min_ttl: 30
max_ttl: 0
hosts: []
blacklist_domain: []
insecure: false
ca: []
debug: false
log_file: ""
upstream: []
# 国内支持ECS的几家服务器
local_upstream:
- https://dot.pub/dns-query
- https://dns.alidns.com/dns-query
- https://doh.360.cn/dns-query
local_ip:
- /etc/mosdns-cn/geoip.dat:cn
local_domain:
- /etc/mosdns-cn/geosite.dat:cn
- /etc/mosdns-cn/geosite.dat:apple
- /etc/mosdns-cn/geosite.dat:akamai
- /etc/mosdns-cn/geosite.dat:google-cn
- /etc/mosdns-cn/geosite.dat:tld-cn
- /etc/mosdns-cn/geosite.dat:category-games@cn
local_latency: 500
# 根据具体情况增删注释
remote_upstream:
# - udp://[2001:4860:4860::8888]
# - udp://8.8.8.8
# - udp://9.9.9.11
# - udp://[2620:fe::11]
- https://dns.google/dns-query
- https://dns11.quad9.net/dns-query
remote_domain:
- /etc/mosdns-cn/geosite.dat:geolocation-!cn
working_dir: ""
cd2exe: false
EOF
sudo docker-compose up --build -d
[/code]
客户端选择
- AdGuardHome (安卓/iOS/电脑?)
- 开发者描述文件,按情况更改保存为后缀名为
.mobileconfig文件即可安装(iOS)
[code]
PayloadContent
DNSSettings
DNSProtocol
HTTPS
ServerName
域名
ServerURL
https://域名/dns-query
Name
DOH名称
PayloadDescription
DOH描述
PayloadDisplayName
DOH名称
PayloadIdentifier
com.apple.dnsSettings.managed.73aaaab3-6666-6666-6666-4305b5bc8123
PayloadType
com.apple.dnsSettings.managed
PayloadUUID
694c5006-6666-6666-6666-bcc536baa123
PayloadVersion
1
PayloadDescription
安装后可在:设置-通用-DNS与设备管理 里进行管理选择。
PayloadDisplayName
DOH名称
PayloadIdentifier
7326b27a-6666-6666-6666-a66b6b25c123
PayloadRemovalDisallowed
PayloadType
Configuration
PayloadUUID
1275e446-6666-6666-6666-87ba446a8123
PayloadVersion
1
[/code]
取舍
- AdGuardHome采用严格的证书校验形式(CDN回源证书无法通过校验),不可避免地需要普通的前端服务器来代替它。
- 采用NGINX更加灵活的限制客户端速率、增加源IP头等
- 没想到了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议
ntcebm5-neea说道: 2023年6月25日 下午10:55
gm说道: 2023年6月25日 下午10:55
pioneer说道: 2023年6月25日 下午10:56
发表回复 取消回复电子邮件地址不会被公开。必填项已用 标注 __ __

