这个是逗比根据地的备份镜像站(非官方)。牢记域名: [doubibackup.com]。搜索:标签云
投稿文章 | 广告合作 | Telegram 群组 / 公告频道 / 使用教程
广告

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

网络资源 南琴浪 30评论
广告
本文最后更新于 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配置教程
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

赞 (27)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(30)个小伙伴在吐槽
  1. 我担心的是自建的DNS会被放大攻击利用。我这建dnsmasq的目的是给同服务器上的VPN用,是不是只要设置监听端口为127.0.0.1就可以避免了?还请指教,谢谢!
    SUMMER2018-07-09 13:34 回复
  2. 现在可用吗
    ALEX2018-02-16 22:05 回复
  3. 别说翻墙了,就连正常的网页都没办法解析。能不能写一篇格式化的教程,只要照着做就能OK的?
    交易者2017-07-01 11:48 回复
    • 那行吧 我之后把我的配置文件贴出来
      南琴浪2017-08-03 14:41 回复
  4. 搭完内网nslookup有反应 用外网就不行了可能是什么原因找了一下午原因还是找不到是哪里问题,端口扫描也显示我这个外网ip确实开放了53端口了,我已经设置了安全组全部端口转发了
    heike2017-05-09 18:56 回复
    • 显示DNS request timed out,应该是没有连上dns, 而且netstat -uanp查询显示 udp6 0 0 :::53 :::* 24094/dnsmasq
      heike2017-05-09 19:22 回复
      • 和udp 0 0 0.0.0.0:53 0.0.0.0:* 24094/dnsmasq
        heike2017-05-09 19:24 回复
        • 我把listen-address=改成自己的内网ip意外成功了。不造为什么。
          heike2017-05-09 20:15 回复
  5. 可以试试我整理的dnsmasq规则。 https://raw.githubusercontent.com/sy618/hosts/master/dnsmasq/dnsfq
    6192017-05-09 00:02 回复
  6. [email protected]:/home/lyf# service dnsmasq restart Job for dnsmasq.service failed. See 'systemctl status dnsmasq.service' and 'journalctl -xn' for details. 提示此错误该如何解决求教!谢谢!
    Hilo2017-04-29 00:50 回复
    • 你的是debian8吗 那就应该用systemctl而不是service; 如果是启动失败就得检查下配置文件
      南琴浪2017-05-03 23:18 回复
  7. 建这个服务器有什么要求吗?怎么我见建不到?别说翻墙了,就连正常的网页都没办法解析。
    chx8182017-04-22 22:10 回复
    • 是linux就行的 完全不能解析的话应该是哪里配置有误
      南琴浪2017-04-23 20:45 回复
  8. 是不是只要是国外的vps,53端口都会被污染,因为我试了下阿里云的貌似就可以正常解析dns
    ecareyu2017-04-16 10:16 回复
    • 是,墙会监听 53端口,而DNS都是明文的UDP,所以很容易被墙发现,然后伪造假的IP提前返回给你,达到污染的目的。
      Toyo2017-04-16 10:36 回复
    • 国内dns根本就不需要污染(不存在污染这回事) 本来就是被监管 已经和谐过的。
      南琴浪2017-04-21 20:45 回复
  9. 这个可以应用到路由器里面吗?
    Matt90492017-04-05 09:24 回复
    • 应该是可以的。
      Toyo2017-04-05 10:21 回复
  10. 之前试过了,解析出来的依然是被污染的IP,去广告到确实是可以滴
    owen2017-03-30 23:31 回复
    • 监听端口使用5353的就可以绕过53污染了
      南琴浪2017-03-31 00:08 回复
      • 围观本人!
        kurokitomoko2017-03-31 09:12 回复
  11. 只要把gfwlist里面的网址全部复制就可以愉悦科学了吧 :lol: 好麻烦
    kurokitomoko2017-03-30 21:50 回复
    • 不过这个可以应用到ps4呢 :lol:
      kurokitomoko2017-03-30 21:59 回复
    • 我记得网上有那些整理好的 DNS列表,直接替换里面的SNI代理IP为自己的SNI代理IP,然后放到 /etc/dnsmasq.d/ 文件夹下即可。
      不过我找不到那个链接了。。。
      Toyo2017-03-30 22:10 回复
      • 这个妾这里有,是个python脚本的来着,上次找dnscrypt的时候偶然发现
        犬走つばき2017-04-04 07:57 回复
        • 已经加入脚本使用步骤到文章里了 :lol:
          Toyo2017-04-04 14:11 回复
          • 厉害 超级详细有用的教程! 回帖的小伙伴也好有爱 :idea:
            s0r2017-04-05 20:39 回复