ChinaDNS 結合DNSMasq防dns挾持

ChinaDNS 與 DNSMasq 結合起來用,使其更加穩定並且可以支持 TCP 查詢,防止dns污染和挾持,DNSMasq 作爲主 DNS 服務端,將 ChinaDNS 作爲 DNSMasq 的上游 DNS

ChinaDNS安裝配置

1. 下載並編譯

  1. 如果你的系統中沒有makegcc就需要先安裝
# Ubuntu / Debian
apt-get install -y make gcc
# CentOS
yum install -y make gcc
  1. 下載 ChinaDNS 源碼並解壓編譯
cd /root
wget --no-check-certificate  https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz
tar -zxvf chinadns-1.3.2.tar.gz
mv chinadns-1.3.2 chinadns
cd chinadns
./configure && make
  1. 更新 chnrouter

cd /root/chinadn
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

2. 配置 supervisor 守護進程

防止 ChinaDNS 進程掛掉
如果你的系統中已經有 supervisor,那麼忽略安裝步驟,酌情參考除了安裝之外的配置步驟

  1. 安裝
# python2
pip install supervisord
# python3
pip install git+https://github.com/Supervisor/supervisor
  1. 初始化並修改配置文件
    此處和原先不一樣的一點:讓 ChinaDNS 在5353端口(或者其他非53端口)監聽,因爲我們要讓它做 DNSMasq 的上游 DNS
echo_supervisord_conf > /etc/supervisord.conf
echo "[program:chinadns]
command=/root/chinadns/src/chinadns -p 5353 -m -c /root/chinadns/chnroute.txt -s 114.114.114.114,208.67.222.222:443
user = root
autostart = true
autorestart = true" >> /etc/supervisord.conf
  1. 添加 supervisor 開機自啓
echo "supervisord -c /etc/supervisord.conf" >> /etc/rc.local
# 執行此命令以防系統沒有權限執行開機自啓腳本(by youngerzhong)
chmod +x /etc/rc.local

之後查看/etc/rc.local文件,如果有exit 0這行,就把它移動到文件的最後一行,即保證我們上面添加的這句在exit 0前面

  1. 啓動 supervisor
supervisord -c /etc/supervisord.conf

然後查看程序運行狀態

supervisorctl status

如果有輸出 chinadns 的運行狀態RUNNING就說明成功了

此時可以用dig命令檢查一下看 ChinaDNS 是否有正常運作

dig www.pixiv.net @127.0.0.1 -p 5353

#!/bin/sh

curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/chinadns/chinadns_chnroute.txt
killall chinadns
echo "Upgrade is complete!"

DNSMasq安裝配置

如果你已經有 DNSMasq,那麼忽略安裝步驟,酌情參考除了安裝之外的配置步驟

1. 安裝

Ubuntu / Debian

apt-get install dnsmasq

CentOS

CentOS yum安裝的 DNSmasq 版本可能比較舊可以先下載最新版編譯好,yum安裝完之後再替換掉bin文件。

先從 http://www.thekelleys.org.uk/dnsmasq/ 找到你想要的 DNSmasq 版本的源碼壓縮包的下載地址,例如我選擇的是我寫這篇文章時的最新版dnsmasq-2.70.tar.gz

下載對應的源碼壓縮包並解壓

cd /root
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.70.tar.gz
tar xf dnsmasq-2.70.tar.gz

編譯,源碼 make 不帶 etc 等

cd dnsmasq-2.70
make V=s

然後用 yum 安裝 DNSmasq

yum install dnsmasq

yum 安裝的是2.4.8版本,然後我們再用我們編譯好的最新版本替換

yes | cp -f ./src/dnsmasq /usr/sbin/dnsmasq

這時可以查看 DNSmasq 的版本檢驗一下

dnsmasq -v

看一下版本號,應該就是我們編譯好的版本了

配置實例詳解

編輯/etc/dnsmasq.conf文件,將下面提到的配置項解除註釋並進行更改

DNSmasq 的配置文件位於/etc/dnsmasq.conf,下面是 DNSmasq 中和 DNS 相關的配置項的說明。

此處的配置僅爲說明,請勿照抄配置


# 用指定的端口代替默認的DNS 53端口,如果設置爲0,則完全禁止DNS功能,只使用dhcp服務
port=5353

# 以下兩個參數告訴Dnsmasq過濾一些查詢:1.哪些公共DNS沒有回答 2.哪些root根域不可達。
# 從不轉發格式錯誤的域名
domain-needed
# 從不轉發不在路由地址中的域名
bogus-priv

# resolv-file配置Dnsmasq額外的向流的DNS服務器,通過下面的選項指定其他文件。
# 如果不開啓就使用linux主機默認的/etc/resolv.conf裏的nameserver。
resolv-file=/etc/dnsmasq.d/upstream_dns.conf

# 默認情況下Dnsmasq會發送查詢到它的任何上游DNS服務器上,如果取消註釋,
# 則Dnsmasq則會嚴格按照/etc/resolv.conf中的DNS Server順序進行查詢。
strict-order

# 以下兩個參數控制是否通過/etc/resolv.conf確定上游服務器,是否檢測/etc/resolv.conf的變化。
# 如果你不想Dnsmasq讀取/etc/resolv.conf文件或者其他文件,獲得它的servers,則取消註釋。
no-resolv
# 如果你不允許Dnsmasq通過輪詢/etc/resolv.conf或者其他文件來獲取配置的改變,則取消註釋。
no-poll

# 增加一個name server,一般用於內網域名
server=/localnet/192.168.0.1

# 設置一個反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析
server=/3.168.192.in-addr.arpa/10.1.2.3

# 增加一個本地域名,會在/etc/hosts中進行查詢
local=/localnet/

# 增加一個域名,強制解析到你指定的地址上
address=/double-click.net/127.0.0.1

# 同上,還支持ipv6
address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

# 增加查詢yahoo google和它們的子域名到***、search查找
ipset=/yahoo.com/google.com/***,search

# 你還可以控制Dnsmasq和Server之間的查詢從哪個網卡出去
server=10.1.2.3@eth1

# 指定源地址攜帶10.1.2.3地址和192.168.1.1的55端口進行通訊
[email protected]#55

# 改變Dnsmasq默認的uid和gid
user=
group=

# 如果你想Dnsmasq監聽某個端口爲dhcp、dns提供服務
interface=

# 你還可以指定哪個端口你不想監聽
except-interface=

# 設置想監聽的地址,如果你本機要使用寫上127.0.0.1。
listen-address=

# 如果你想在某個端口只提供dns服務,則可以進行配置禁止dhcp服務
no-dhcp-interface=

# On systems which support it, dnsmasq binds the wildcard address,
# even when it is listening on only some interfaces. It then discards
# requests that it shouldn't reply to. This has the advantage of
# working even when interfaces come and go and change address. If you
# want dnsmasq to really bind only the interfaces it is listening on,
# uncomment this option. About the only time you may need this is when
# running another nameserver on the same machine.
bind-interfaces

# 如果你不想使用/etc/hosts,則取消下面的註釋
no-hosts

# 如果你項讀取其他類似/etc/hosts文件,則進行配置
addn-hosts=/etc/banner_add_hosts

# 自動的給hosts中的name增加一個域名
expand-hosts

# 給dhcp服務賦予一個域名
domain=thekelleys.org.uk

# 給dhcp的一個子域賦予一個不同的域名
domain=wireless.thekelleys.org.uk,192.168.2.0/24

# 同上,不過子域是一個範圍
domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200

# dhcp分發ip的範圍,以及每個ip的租約時間
dhcp-range=192.168.0.50,192.168.0.150,12h

# 同上,不過給出了掩碼
dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h

# 自動加載conf-dir目錄下的配置文件
conf-dir=/etc/dnsmasq.d

# 設置dns緩存大小,默認爲150條

cache-size=150

修改完配置之後需要重啓 DNSmasq 以使配置生效

# 指定監聽 53 端口
port=53

# 禁止 DNSMasq 使用 resolv.conf
no-resolv
no-poll

# 指定監聽IP,將 x.x.x.x 換成你的 eth0 網卡IP(用 ifconfig 命令查看)
listen-address=127.0.0.1,x.x.x.x

# 指定額外配置文件夾
conf-dir=/etc/dnsmasq.d/`

如果你比較懶不想找而且只需要用 DNSMasq 做到本文所述功能,也可以直接
(注意替換x.x.x.x

echo "port=53
no-resolv
no-poll
listen-address=127.0.0.1,x.x.x.x
conf-dir=/etc/dnsmasq.d/" > /etc/dnsmasq.conf

然後運行以下命令寫入配置以將 ChinaDNS 作爲上游 DNS

echo "server=127.0.0.1#5353" > /etc/dnsmasq.d/chinadns.conf

重啓 DNSMasq

systemctl restart dnsmasq.service

配置過程中需要注意的幾點

把你的服務器作爲一個 DNS 服務器

  1. 配置中的listen-address必須爲你服務器的公網 IP
listen-address=你的公網IP
  1. 在防火牆中開放 53 端口
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
  1. 如果是 CentOS 的話需要保存並重啓防火牆使以上改動生效
service iptables save
service iptables restart

如果想強制重定向本地的 DNS 請求給 DNSmasq

eth0爲網卡名,請替換爲你自己機器的網卡名

iptables -t nat -A PREROUTING -i eth0 -p upd --dport 53 -j REDIRECT --to-port 53

然後重啓防火牆(如果是 CentOS)

如果想自定義上游 DNS

no-resolv
no-poll
server=x.x.x.x#端口  //不寫`#端口`默認是`53

使用上的一些建議

如果需要自定義上游 DNS 服務器,以及設置特定域名的 Host 之類的,建議寫到一個單獨的.conf配置文件裏,然後放到一個專門的文件夾,然後修改 DNSmasq 配置中的這條

conf-dir=配置文件夾

這樣的話以後修改配置就不需要頻繁修改主配置文件,而且也有利於配置的分塊

dnsmasq-china-list

dnsmasq-china-list項目維護了一張國內常用但是通過國外DNS會解析錯誤的網站域名的列表,保證List中的國內域名全部走國內DNS服務器解析。

項目地址: https://github.com/felixonmars/dnsmasq-china-list

使用

取消配置文件中conf-dir=/etc/dnsmasq.d這一行的註釋

如果此處你是用的是自己的配置文件夾,那麼久在後續步驟中將配置文件放入你自己的配置文件夾即可

隨便找一個地方將項目文件下載下來

git clone https://github.com/felixonmars/dnsmasq-china-list.git

然後將其中的accelerated-domains.china.confbogus-nxdomain.china.confgoogle.china.conf(可選)放到/etc/dnsmasq.d/目錄中
最後重啓 DNSmasq 即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章