Linux 自建DNS 并使用SNI Proxy实现科学上网 —— DNSmasq配置教程

本文最后更新于 2018年1月20日 22:31 可能会因为没有更新而失效。如已失效或需要修正,请留言!

本文章由 @南琴浪 投稿,由 @Toyo 排版并完善,原文地址:https://www.nanqinlang.com/dnsmasq.html

DNSmasq是一款小巧且方便地用于配置DNS服务和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能,并且提供本地缓存查询请求的功能。同时搭配 SNI Proxy代理的话,可以实现只使用DNS就能科学上网!

目前 自建DNS 效果不如以前,防火墙针对性更强,如非必须,不推荐使用!

安装步骤

包管理器 安装

# CentOS 系统:
yum update
yum install -y dnsmasq

# Debian/Ubuntu 系统:
apt-get update
apt-get install -y dnsmasq

源码编译 安装

DNSmasq 官方网站:http://www.thekelleys.org.uk/dnsmasq/

编译需要相关组件支持,所以安装编译依赖包:

# CentOS 系统:
yum update
yum -y groupinstall "Development Tools"

# Debian/Ubuntu 系统:
apt-get update
apt-get install -y build-essential

获取最新版本:

dnsmasq_ver=$(wget -qO- http://www.thekelleys.org.uk/dnsmasq/ | awk -F'/"dnsmasq-' '/dnsmasq-[2-9].[0-9][0-9].tar.gz/">dnsmasq/{print $2}' | cut -c 1-4 | sort -V | tail -1)

下载解压编译:

wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-${dnsmasq_ver}.tar.gz
tar -xzf dnsmasq-${dnsmasq_ver}.tar.gz
cd dnsmasq-${dnsmasq_ver}
make install
ldconfig
# 编译安装完毕后,可以删除没用的源码文件了。
cd ..
rm -rf dnsmasq-${dnsmasq_ver} && rm -rf dnsmasq-${dnsmasq_ver}.tar.gz

包管理器 安装后,查看下DNSmasq的版本:

dnsmasq -v
# 以下是输出结果,只要不是提示 找不到命令就没事( -bash: dnsmasq: command not found )
Dnsmasq version x.xx Copyright (c) 2000-2012 Simon Kelley
Compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack

This software comes with ABSOLUTELY NO WARRANTY.
Dnsmasq is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2 or 3.

配置文件

Dnsmasq的配置文件为:dnsmasq.conf

包管理器 方式安装的配置文件位置为:/etc/dnsmasq.conf

本教程只介绍配置DNS服务,以下部分只指出DNS服务的相关配置。

首先复制一份配置文件的备份,然后清空原配置文件,并根据下面的参数说明写入配置内容:

cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
echo "" > /etc/dnsmasq.conf
# 打开配置文件并根据下面的参数说明写入配置内容,按 I键 进入编辑模式,改完后按 ESC键 退出并输入 :wq 保存并退出。
vi /etc/dnsmasq.conf

配置文件参数说明:

port=53
 # 指定DNSmasq的监听端口,默认为53端口,也可设置为5353端口从而防止53端口DNS污染(但某些设备如win并不支持非53端口)

resolv-file=/xxx/xx.conf
 # 指定DNSmasq获取上游DNS服务器地址的文件,不配置此项则默认从 /etc/resolv.conf(linux默认DNS配置文件) 获取

strict-order
 # 严格按照 resolv-file 参数指定的文件中按从上到下的顺序发送DNS解析请求,直至获取解析应答成功为止

listen-address=
 # 指定DNSmasq监听的地址,若仅提供为本机使用可设置为 127.0.0.1 ,留空或设置为 0.0.0.0 即任何人都可访问

address=/xxx.xx/x.x.x.x
 # 自定义某些地址的解析服务器,可以 过滤或者指定 某些网站(支持ipv6,直接写ipv6的地址即可)
 # 过滤广告或者某域名,例如配置 address=/www.nanqinlang.com/127.0.0.1
 # 把广告域名解析请求发送到错误的解析服务器IP 127.0.0.1 即可屏蔽该域名的访问
 # 也可以把 www.google.com 等指向一个国外的SNI代理IP,即可实现DNS科学上网

server=208.67.222.222#5353
 # 指定上游DNS解析服务器,此处推荐设置为可使用5353端口的opendns

bogus-nxdomain=208.67.222.222
 # 用于防止DNS污染/劫持,参数和上面 server 项填写相同的 ip ,但不支持非53端口。

conf-dir=/etc/dnsmasq.d
 # 加载 /etc/dnsmasq.d 文件夹内的配置文件

配置文件示例:

点击展开 查看示例

自定义地址解析 单独建立一个配置文件:

vi /etc/dnsmasq.d/sniporxy.conf

然后按格式写入自定义地址解析,示例如下:

这里可以配合我的另一个教程:一个 反代无需证书 适用于DNS/Hosts的小工具 —— SNI Proxy代理 安装教程

把谷歌等域名的解析IP指定为 SNI Proxy代理的IP,当你使用这个DNS时,就会通过解析为SNI代理 IP,然后通过SNI代理访问谷歌,这就是使用自建DNS实现科学上网(和Hosts方式原理是一样的,不过一个在云服务器上,一个在本地)。

注意:这里都是默认泛域名,比如 /google.com/1.1.1.1 代表 google.com, www.google.com, api.google.com 等域名全部解析为 1.1.1.1

address=/google.com/1.1.1.1
address=/google.com.hk/1.1.1.1
address=/google.co.jp/1.1.1.1
address=/gmail.com/1.1.1.1
address=/youtube.com/1.1.1.1
注意:如果 这个文件或配置文件 修改了,那么需要重启 DNSmasq后才能生效。

GFWList转为DNSmasq的SNI配置文件

大家可能觉得如果用上面的自己创建的 SNI配置文件的话,要写全被墙的网站域名会很麻烦,于是我就找到了这个 python的脚本(由 @犬走つばき 提供脚本项目地址),可以把 gfwlist的PAC转成 DNSmasq的SNI配置文件。

Python脚本项目:https://github.com/R0uter/Dnsmasq-sniproxy-conf

首先下载这个 python脚本:

wget -N --no-check-certificate https://raw.githubusercontent.com/R0uter/Dnsmasq-sniproxy-conf/master/gfwlist2dnsmasq-sni-conf.py

然后替换脚本内默认的SNI代理IP(127.0.0.1)为自己的IP,加入你的SNI代理IP为1.1.1.1,那么这样(你可以用 vi 等编辑器修改第12行的IP):

sed -i 's/127.0.0.1/1.1.1.1/' gfwlist2dnsmasq-sni-conf.py

修改后,可以使用 cat gfwlist2dnsmasq-sni-conf.py 查看一下第12行的IP是否为自己的SNI代理IP,如果正确,那么继续。

先确定你的 Linux系统中安装了 Python :

python -V

# 如果返回的是 python的版本信息那就继续下面步骤,如果返回的是 命令找不到(-bash: python: command not found),那么请安装 python:
# CentOS 系统:
yum install python -y
# Debian/Ubuntu 系统:
apt-get install python -y

然后我们运行脚本:

python gfwlist2dnsmasq-sni-conf.py

运行脚本后会输出转换的信息,输出完后,就会在当前文件夹下生成一个 sni.conf 文件,把他移动到 /etc/dnsmasq.d/ 文件夹内即可。

mv sni.conf /etc/dnsmasq.d/sni.conf

然后重启 DNSmasq就会生效。

/etc/init.d/dnsmasq restart

需要注意的是,因为 GFWList是一直更新的,所以你的SNI配置文件也要定时更新,步骤一样,运行脚本就会自动获取最新的GFWList文件并转换成DNSmasq的SNI配置文件。

使用说明

启用DNSmasq服务

/etc/init.d/dnsmasq start

停止DNSmasq服务

/etc/init.d/dnsmasq stop

重启DNSmasq服务(当修改配置文件后,需要重启)

/etc/init.d/dnsmasq restart

卸载 DNSmasq

如果 /etc/dnsmasq.d 目录有文件,那么需要先删除这个目录才能正常卸载:

# 先删除这个目录
rm -rf /etc/dnsmasq.d 

# CentOS 系统 
yum remove dnsmasq -y 

# Debian/Ubuntu 系统: 
apt-get remove --purge dnsmasq -y

其他说明

这个可能是防火墙的问题,因为DNS是UDP传输的,所以只开放UDP端口即可。

iptables -I INPUT -m state --state NEW -m udp -p udp --dport 端口 -j ACCEPT

# 删除防火墙规则,内容一样把 -I 换成 -D 就行了:
iptables -D INPUT -m state --state NEW -m udp -p udp --dport 端口 -j ACCEPT

在PC/路由器/移动设备中设置DNS为你的VPS IP,端口设置53(如有) 即可。

转载请超链接注明:月下博客 » Linux 自建DNS 并使用SNI Proxy实现科学上网 —— DNSmasq配置教程
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

留言评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code