防污染 DNS 和 SNI Proxy

一、背景知识

Dnsmasq

这是一个要上天的软件,具有 DHCP Server、DNS Server、DNS Forwarding、TFTP Server、PXEboot Server 等各种功能。
这里,我们将主要使用其 DNS 转发功能。

SNIServer Name Indication

简单来说,是 TLS 协议的扩展,在握手开始的时候,就告知服务器目标网站的Hostname,这样一个https服务器上面就可以部署多个具有不同证书的网站,根据目标网站的Hostname而采用不同的证书。
其实HTTP/1.1很早就有了这种 "Virtual Host"(虚拟主机)的概念,SNI 只是让HTTPS也支持这个罢了

SNI Proxy

说白了,这就是个HTTPS代理软件,和基本的nginx反代什么的概念差不多。只是它专门设计用来代理HTTPS站点,并可以独立运行,而不依赖任何第三方软件。

二、防污染 DNS

1.  基本逻辑:

国外 vps1,国内 vps2 或者 你的OpenWrt 路由器

vps1 运行 dnsmasq,监听53和5353端口,TCP/UDP 都监听,上游 DNS 为 8.8.8.8、8.8.4.4

vps2 运行 dnsmasq,上游为 vps1的地址,使用5353端口,并配置 dnsmasq-china-list,也就是把常见国内站点使用国内dns解析,列表外的站点查询上游DNS

有些人的方案是,仅使用一个国内vps,使用 DNSCrypt 连接 opedns 等提供加密通道的上游DNS,也是不错的。

2. Dnsmasq 的基本配置

因为这个没什么好说的,这里以国内vps2为例,简单说明一下

3. iptables 转发5353端口的查询

上面 dnsmasq 默认监听的是53端口的 TCP/UDP 连接,下面我们通过 iptables 将5353端口的查询转发至53端口,这个可以用来解决部分 ISP 的  dns 污染问题。(看个人需要,是否在两个vps上面都打开5353端口,毕竟一些操作系统的网络设置不支持 DNS 自定义端口...)

当然,你最好把这段命令放到 /etc/rc.local 里面去,这样下次重启就不要再运行这段命令啦。

4. 国内站点加速

这里有两种思路:

方案一:准备 被墙网站 的列表,统一查询国外 dns,其余的走国内DNS;参考 gfwlist

方案二:准备 国内站点 列表,这部分走国内,其他的查询国外 dns;参考 dnsmasq-china-list

很显然,我们选择了第二种

其实里面都是下面这样的配置条目,指定特定泛域名的上游服务器

当然,如果你想让国内站点使用适合你的 DNS服务器进行查询,可以通过该项目提供的脚本实现一键替换

5. SNI Proxy 站点的NS记录

方案一,泛域名
按照下面的配置,可以将某个泛域名统一解析到相应的 IP 上

方案二,单域名
如果不需要进行泛解析,只要对几个单域名进行解析,也可以像下面这样

 /etc/my_hosts 文件内容的书写格式同系统的 /etc/hosts,所以也很方便

三、SNI Proxy

1.  安装

看 Readme 去吧 ,没什么好说的
https://github.com/dlundquist/sniproxy

2. 配置

这里直接拿一份别人的配置来改改咯

vi /etc/sniproxy.conf

3. 启动守护进程

命令很简单,注意要有root权限,然后就自动在后台跑着了

4. http 重定向到 https

因为我们的SNI Proxy 只针对 HTTPS 站点,所以如果用户发起HTTP请求,我们必须做好跳转。
在 nginx 的 默认站点配置文件里进行如下修改:

 

参考资料:

https://ttt.tt/153/

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

https://github.com/dlundquist/sniproxy

https://en.wikipedia.org/wiki/Server_Name_Indication

https://blog.phoenixlzx.com/2014/03/11/setup-custom-dns-with-dnsmasq/

https://gist.github.com/phoenixlzx/bd9ae2629e3e1e72e978

https://github.com/cokebar/gfwlist2dnsmasq

《防污染 DNS 和 SNI Proxy》有3个想法

    1. 你好,有什么问题你可以在评论这个问的。
      毕竟隐私问题嘛,理解万岁:)

发表回复

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


The reCAPTCHA verification period has expired. Please reload the page.