在 OS X 上 避免 DNS 泄露

最近墙越来越高了,随着法西斯节和月饼的关系,不少梯子也被拆了。甚至几个梯子开发者也被?,所以说,除了“如何科学上网”这个问题之外,“如何安全上网”这个问题也变得越来越不可让人忽略。

不仅仅是为了你我都懂的用途,就是一般的使用电脑上网,我觉得这个问题也应当得到重视。你在网络上面的一言一行都被你的服务商、ISP事无巨细地记录着……这原本是好的目的——一旦歹徒在通过网络行凶,我们就能够快速将其抓获——不过,一旦这些信息落入了坏人之手,那将不堪设想。

一般我们会想,那些浏览记录什么的有什么重要的呢?只要我的账号密码安全就好了啊!事实上,正是这些信息,给了黑客可乘之机。你的这些材料,都将成为社会工程学的攻击素材。

那么DNS泄露又是什么呢?

使用浏览器上网,你输入的域名就要依靠DNS来翻译成IP地址——电脑可不懂什么是域名。所以,也许你访问的内容经过了https加密,但ISP一样可以记录你究竟访问了那些网站!

就算你使用了VPN等代理来访问网络,你的DNS仍然有可能是本地解析的,这将导致你的隐匿行踪变得毫无意义!——这就是个人隐私的头号威胁:DNS泄露

目前来讲,当你使用VPN的时候,DNS应该是远程解析的,但有些提供商并不支持它;另外如果你使用socks代理,那么只有 5 才支持远程DNS解析

另外

你如果使用了pac,那你需要一份按照域名来选择代理的 pac 而不是IP。——因为它还是会先解析出IP再判断是否需要代理。

否则,你就可能泄露了DNS:

什么是DNS泄露
什么是DNS泄露

DNS透明转发

这时候就有人提出,如果使用VPN,为了避免DNS污染(其实也是泄露的一种),要使用第三方的公共DNS服务,比如谷歌的 8.8.8.8 ,但如果你的DNS泄露了,即使使用了公共DNS也无济于事:

DNS透明转发
DNS透明转发

你以为你访问到了第三方的公共DNS上,其实你还是访问了ISP的DNS服务器上。

关于DNS泄露的更多内容访问:https://dnsleaktest.com/what-is-a-dns-leak.html

要测试DNS泄露,访问:https://dnsleaktest.com

使用 dnscrypt 和 dnsmasq

dnscrypt 是 Open DNS 的一个项目,它允许你加密地访问DNS服务器,并解析域名。就好像使用https访问网站一样。而 dnsmasq 则是一个轻量级的DNS服务器,我们本地架设它来缓存DNS解析回复,这样就不用在同一时间里重复解析同一域名多次了——毕竟加密DNS解析不比明文解析快的。

注意

其实大多数 Linux 系统当中 dnsmasq 都是默认自带的——它并不臃肿,也不会耗费多少资源。

准备

为了安装 dnscrypt 和 dnsmasq ,你需要安装 Xcode ——我们需要用到Xcode 附带的一些命令行工具。

在安装了Xcode之后,使用命令来安装Homebrew:

它是个类似 apt-get 或者 yum 的包管理器,安装它之后,你或许需要如下设置:

brew update 慢 解决办法 镜像更新源

安装 dnsmasq

使用 brew install dnsmasq 来安装它。

我们编辑它的配置:

比如说如下配置:

再写入一条额外的配置: echo "conf-dir=/usr/local/etc/dnsmasq.d" >> /usr/local/etc/dnsmasq.conf 来让配置目录生效以放入更多规则:

对于国内比如淘宝京东这类网站,我想你不会去代理,那么也就没必要加密处理了,由于国内多用了cdn加速,我们有国外DNS解析的话会导致走到国外线路上,速度很慢。如果你需要加密,就跳过这一步即可?。

设置启动:

使用 sudo lsof -ni UDP:53 或者 ps -ef | grep '[d]nsmasq' 来验证dnsmasq已经启动。

dnsmasq 虽然被用作了DNS缓存,它一般也会用在微型服务器上比如OpenWRT上作为DHCP服务器。事实上它在这方面用的更多。不过不用担心,我们安装的dnsmasq默认不开启DHCP功能。

安装 dnscrypt

使用 brew install dnscrypt-proxy 来安装dnscrypt。

设置启动:

编辑配置文件,把本地监听地址改为 127.0.0.1:5355来配合dnsmasq:

<string>/usr/local/opt/dnscrypt-proxy/sbin/dnscrypt-proxy</string> 这行下面插入: <string>--local-address=127.0.0.1:5355</string> ,好避免和dnsmasq冲突并只允许dnsmasq访问到它:

最后,使用 sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnscrypt-proxy.plist 启动服务。

使用 sudo lsof -ni UDP:5355 或者 ps -ef | grep '[d]nscrypt' 来验证服务已经生效。

dnscrypt 还有个对应的 dnscrypt-wrapper,它兼容dnscrypt-proxy的加密——也就是说你可以用它来搭建自己的dnscrypt服务器而不必使用公用dnscrypt服务器。——这用来抵御DNS污染~你可以参考页尾“延伸阅读”里的链接来了解更多。

配置网络

打开 偏好设置→网络→高级→DNS选项卡 ,只填入 127.0.0.1 并保存即可。

设置DNS
设置DNS

验证

使用dig来分别验证二者是否正常工作:

 

来自丹麦的dnscrypt服务器
来自丹麦的dnscrypt服务器

延伸阅读

编译安装 dnscrypt-wrapper 搭建防污染 DNS 服务器

dnsmasq (简体中文)

OS X 上的隐私安全指南

“在 OS X 上 避免 DNS 泄露”的5个回复

  1. launchctl load 是否可以再开启另外一个 dnscrypt 实例呢?
    例如我想用两个端口对应两条线路
    127.0.0.1:5301 — cisco
    127.0.0.2:5302 — fvz-rec-hk-ztw-01

    1. 理论上可以,你需要再拷贝一份plist,然后把端口改掉,这样应该能启动两个实例,我没有试过,如果这样不行,那应该就不行了,你自己试试看。
      另外一种方法是用docker起服务,这样的话起几个都ok了。
      或者用传统linux方式写脚本 :)

  2. macOS最新系统中执行sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnscrypt-proxy.plist启动不生效,但是我可以通过shadowsocksx访问google、facebook,这是什么情况呢?执行dig http://www.google.com @127.0.0.1 -p 5355也是connection timed out; no servers could be reached,但是可以访问

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.