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(如有) 即可。
|