起因

  1. 学校的DNS经常抽风,但换外网DNS速度变慢,且未登网关时不可用。
  2. 墙— hosts文件变的很长很长。

于是就想用Dnsmasq来做DNS缓存以及特殊域名的解析。

步骤:

  1. 首先环境是ArchLinux + NetworkManager
  2. 安装Dnsmasq: pacman -S dnsmasq
  3. 新建/etc/resolv.conf.myDNSoverride文件 # 首行必须是127.0.0.1,其余可以填已知的DNS服务器 nameserver 127.0.0.1 nameserver 202.113.16.10 nameserver 202.99.96.68 nameserver 8.8.8.8
  4. 配置/etc/dnsmasq.conf # 反注释以下两行 listen-address=127.0.0.1 conf-dir=/etc/dnsmasq.d # 配置dnsmasq读取的resolv文件 resolv-file=/etc/resolv.conf.myDNSoverride
  5. 建立dnsmasq配置目录,拷贝特殊配置。 mkdir /etc/dnsmasq.d wget https://smarthosts.googlecode.com/svn/trunk/dnsmasq.conf\ -O /etc/dnsmasq.d/crosswall.conf
  6. 启动Dnsmasq服务: /etc/rc.d/dnsmasq start
  7. 配置当前网络的DNS为127.0.0.1,这个和网络管理器有很大的关系。 具体参考wiki。下面主要说说NetworkManger下的设置方法。
    1. 如果你的网络是DHCP模式,那么NM会自动复写/etc/resolv.conf 为从DHCP服务器上获取的DNS地址。
    2. 此时需要在 /etc/NetworkManager/dispatcher.d 下新建dnsoverride.sh,给运行权限: #!/bin/bash cp -f /etc/resolv.conf.myDNSoverride /etc/resolv.conf 便可在连接建立后恢复默认DNS。
    3. 如果你的网站是手动分配IP,那么直接在DNS一栏中填入127.0.0.1即可。 主要是因为手动填写的DNS优先级很高,会不断复写resolv.conf
  8. 测试: dig archlinux.org | grep Query

Update

  1. Wicd设置:
    • wicd可以指定全局DNS,但会被dhcpcd所覆盖
    • nameserver 127.0.0.1写入/etc/resolv.conf.head文件即可。