Archlinx-DNS分流方案


 最近闲着无聊,突发奇想,研究了一下DNS国内外分流方案,查看了些其他人的方案和资料,最终确定了对应的方案

DNS分流方安案

环境准备

  • 安装Clash

#创建clash部署目录
mkdir -p /home/youname/tools/clash
#下载Clash到指定目录
wget https://github.com/Dreamacro/clash/releases/download/v1.10.6/clash-linux-amd64-v3-v1.10.6.gz -O /home/youname/tools/clash/clash-linux.gz
#解压并赋予执行权限
gzip -d /home/younams/tools/clash/cnix/clash-linux.gz && chmod +x /home/youname/tools/clash/cnix/clash-linux
  • 创建Clash的==systemd==配置文件

    /usr/lib/systemd/system/clash.service

[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/bash /home/weilin/tools/clash/start.sh
ExecReload=/usr/bin/bash /home/weilin/tools/clash/start.sh
ExecStop=/bin/kill -SIGTERM $MAINPID
#Restart=on-failure
User=weilin
Group=weilin

[Install]
WantedBy=multi-user.target
  • 配置Clash服务,并查看服务状态

sudo systemctl daemon-reload
sudo systemctl --now enable clash
sudo systemctl status clash

配置订阅


因为在用的机场本身就有提供clash订阅的功能,我是直接下载订阅文件,对文件进行修改,达到我的要求。

  • 创建clash基础配置信息

port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: Rule
log-level: silent
external-controller: '0.0.0.0:9090'
secret: ''
dns:
  enable: true
  listen: 127.0.0.1:53006
  enhanced-mode: redir-host       # redir-host or fake-ip
  # fake-ip-range: 198.18.0.1/16    # Fake IP addresses pool CIDR
  use-hosts: true                 # lookup hosts and return IP record
  nameserver:
    - 119.29.29.29      # DNSpod DNS 17ms
    - 223.5.5.5         # 阿里 19ms
  # 提供 fallback 时,如果GEOIP非 CN 中国时使用 fallback 解析
  fallback:
    - tls://8.8.8.8:853         # Google DNS over TLS 50ms
    - tls://8.8.4.4:853         # cloudflare DNS over TLS 50ms
    - https://1.1.1.1/dns-query # cloudflare DNS over HTTPS
    - https://dns.google/dns-query # Google DNS over HTTPS

  # 强制DNS解析使用`fallback`配置
  fallback-filter:
    # true: CN使用nameserver解析,非CN使用fallback
    geoip: true
    # geoip设置为false时有效: 不匹配`ipcidr`地址时会使用`nameserver`结果,匹配`ipcidr`地址时使用`fallback`结果。
    ipcidr:
      - 240.0.0.0/4
      - 127.0.0.1/8
      - 0.0.0.0/32
    domain:
      - +.google.com
      - +.facebook.com
      - +.twitter.com
      - +.youtube.com
      - +.xn--ngstr-lra8j.com
      - +.google.cn
      - +.googleapis.cn
      - +.googleapis.com
      - +.gvt1.com
  • 创建订阅更新脚本

#!/bin/bash
echo `date "+%Y-%m-%d %H:%M:%S"` >> /data1/scripts/update_clash/log/update.log
echo "start update clash" >> /data1/scripts/update_clash/log/update.log
SOURCE_CNIX_URL=订阅链接
wget $SOURCE_CNIX_URL -O "/data1/scripts/update_clash/cninx/config.yaml"
sed -i '1,14d' /data1/scripts/update_clash/cninx/config.yaml
cat /data1/scripts/update_clash/cninx/dns.yaml /data1/scripts/update_clash/cninx/config.yaml > /home/weilin/tools/clash/cnix/config.yaml
echo "success" >> /data1/scripts/update_clash/log/update.log
  • 等我后面研究一下怎么通过定时器进行定时更新,目前使用的是==crontab==进行更新

  • 测试代理

    • 执行更新脚本

    /data1/scripts/update_clash/update_clash.sh
    
    • 重启服务

    systemctl restart clash
    
    • 登录web界面

配置DNS

  • 配置==systemd-resolved==服务

[Resolve]
DNS=127.0.0.1
Domains=~.
[Resolve]
[Resolve]
DNSStubListener=no
[Resolve]
FallbackDNS=223.5.5.5#dns.alidns.com 1.1.1.1#cloudflare-dns.com 8.8.8.8#dns.google
  • 配置==SmartDNS==

    • 备份文件

    sudo mv smartdns.conf smartdns.conf.default
    
    • 配置文件

   # 修改 dns 监听地址
bind [127.0.0.1]:5380
bind [::1]:5380

#域名结果缓存个数
cache-size 1024

# 启用dns缓存持久化
cache-persist yes

# 开启dns缓存
cache-size 4096

# 设置dns持久化文件名(把它放在内存里,重启就消失,问题不大,主要是为了避免重启smartdns服务后的冷启动)
cache-file /tmp/smartdns.cache

# prefetch domain,预解析域名,会导致dns包的数量极大程度增加,原理就是提前查询dns,看网页的时候有一点加速
# prefetch-domain [yes|no]
prefetch-domain yes

#日志文件
log-file /var/log/smartdns.log
log-size 10M
log-num 10

#最小 TTL 值
rr-ttl-min 900

#过期缓存服务功能
serve-expired yes

# 添加上游 dns 服务器
server 1.1.1.1
server 223.5.5.5
server 223.6.6.6
server 8.8.8.8
server 119.29.29.29
server 182.254.116.116
server 114.114.114.119
server 114.114.114.114

::: tip 备注
设置dns监听地址和添加上游dns一定要,官方文档建议上游dns服务器不要超过10个,其它一些设置都是玄学科学优化
:::

  • 配置unbound

    • 创建 /etc/default/unbound 配置文件

    # /etc/default/unbound
    # 这个默认会修改 /etc/resolv.conf 文件,设成 false 禁用掉
    RESOLVCONF="false"
    ROOT_TRUST_ANCHOR_UPDATE="false"
    
    • 修改 unbound 配置文件

    # /etc/unbound/unbound.conf
    server:
      verbosity: 2
      num-threads: 4
      interface: 127.0.0.1
      port: 53
      do-ip4: yes
      do-udp: yes
      do-tcp: no
      # 关掉上游 dns 才能使用本地 dns 服务
      do-not-query-localhost: no
      access-control: 0.0.0.0/0 allow
      include: "/etc/unbound/unbound.conf.d/*.conf"
      forward-zone:
        name: "."
        forward-addr: 127.0.0.1@53006
    
    • 添加 unbound 到开机自动启

    sudo systemctl --now enable unbound.service
    
  • ==dnsmasq-china-list==配置

    git clone https://github.com/felixonmars/dnsmasq-china-list.git --depth 1
    
    • 创建 unbound 配置文件

    cd dnsmasq-china-list
    make SERVER=127.0.0.1@5380 unbound
    
    • 删除 /etc/unbound/unbound.conf.d/ 下默认配置文件后拷贝 dnsmasq-china-list 下创建的 unbound 配置文件该目录下

    rm -f /etc/unbound/unbound.conf.d/*
    cp *unbound.conf /etc/unbound/unbound.conf.d/
    
    • 重启 unbound 服务

    systemctl restart unbound
    

::: tip 参考文献
使用 clash 搭建透明网关实现旁路科学上网自由
Archlinux国内外dns分流方案
:::