标题写的有点吹牛逼了,其实我原本是想来搭建一个内网用的透明代理的。但是最近时间不多,抽时间折腾了一下最后就弄了个 DNS,回头再说编译安装内网透明代理网关吧。

不过单单是跑一个 DNS 服务,我还是有不少收获的,尤其是关于 Raspberry Pi 的稳定性方面,所以拿出来记录一下,希望对别人有用。

photo_2018-12-19_21-02-15.jpg

目前淘宝上 Raspberry Pi 3 B+ 的版本售价一路走低,我原本是想买 Pine 64 的,但是发现前者有明显的价格优势,同时还有完善的文档支持,最后还是选择了前者。

而且大部分卖这个的店家还会给你一个套餐,包括充电器与外壳,还有散热铜片,虽然我觉得没啥用途,但是聊胜于无吧。

photo_2018-12-19_21-02-08.jpg

对于 Raspberry Pi 3 B+ 的型号来说,默认的操作系统是 Raspbian,也就是一个基于 Debian 的魔改版 Linux,大体上按照 Debian 的套路配置就可以了,下载官方镜像,写入 TF 卡,然后插入启动,就可以开始你的小服务器旅程了。

我在这个树莓派上跑的 DNS 服务是 Overture,一个国人开发的 DNS 分流服务,原理也很简单,根据部分白名单进行分流 DNS 解析,在国内的走 114 啊或者 DNSPod 啊,在国外的就走 Google 或者 OpenDNS 之类的,而且为了避免 DNS 污染,国外的 DNS 解析可以走特定端口。

Overture 的配置文件很简单粗暴,里面默认的写的很清楚,包括国内 IP 与国外 IP 分流

{
  "BindAddress": ":53",
  "PrimaryDNS": [
    {
      "Name": "DNSPod",
      "Address": "119.29.29.29:53",
      "Protocol": "udp",
      "SOCKS5Address": "",
      "Timeout": 6,
      "EDNSClientSubnet": {
        "Policy": "disable",
        "ExternalIP": ""
      }
},
    {
      "Name": "114DNS",
      "Address": "114.114.114.114:53",
      "Protocol": "udp",
      "SOCKS5Address": "",
      "Timeout": 5,
      "EDNSClientSubnet": {
        "Policy": "disable",
        "ExternalIP": ""
      }
    }
  ],
  "AlternativeDNS": [
    {
      "Name": "openDNS",
      "Address": "208.67.222.222:443",
      "Protocol": "tcp",
      "SOCKS5Address": "",
      "Timeout": 5,
      "EDNSClientSubnet":{
        "Policy": "disable",
        "ExternalIP": ""
      }
    },
    {
      "Name": "openDNS2",
      "Address": "208.67.222.222:5353",
      "Protocol": "tcp",
      "SOCKS5Address": "",
      "Timeout": 5,
      "EDNSClientSubnet": {
        "Policy": "disable",
        "ExternalIP": ""
      }
    } 
  ],
  "OnlyPrimaryDNS": false,
  "IPv6UseAlternativeDNS": false,
  "IPNetworkFile": {
    "Primary": "/opt/overture/china_ip_list.txt",
    "Alternative": "/opt/overture/ip_network_alternative"
  },
  "DomainFile": {
    "Primary": "/opt/overture/domain_primary",
    "Alternative": "/opt/overture/gfwlist.txt"
  },
  "DomainBase64Decode": true,
  "HostsFile": "/opt/overture/hosts",
  "MinimumTTL": 0,
  "CacheSize" : 4096,
  "RejectQtype": [255]
}

但是仅仅如此是不行的,里面的 china_ip_list.txt 之类的需要你自己去搜索,网络上都有,我就不再提供了。

值得一提的是对于国外的 DNS 查询,Overture 支持走 Sock5 代理,可以更好的保证稳定,也就是说你可以在上面跑一个科学上网,然后用这个途径查询即可。

Overture 官方提供了 Systemd service,只需要复制那个写好的文件,然后 Enable 就行了。

选区_657.png

到此为止 DNS 服务已经配置好了,切记看看运行日志,看看你指向的那几个 txt 文件和分流列表是不是正常读取了,不然就是悲剧啊。

接下来就是一个操蛋的问题了,一般来说这种服务是应该 7X24 小时运行的,但是对于 Raspberry Pi 这样的体量的机器来说,还是有其局限性。

1,本身 Lan 口是从 USB 带宽出来的,性能有限。
2,作为一个小开发板,稳定性有待考察。

第一点是性能问题,没办法,不过对于家庭的使用环境来说,我觉得还是没啥问题的,况且 Overture 还支持缓存,可以极大的缓解查询压力,哪怕将来补上透明网关代理,网络流量也不会太惨,毕竟只有分流的。

第二点我也意识到了,在使用的第三天,这个玩意就死机了。

后来莫名其妙的发现了解决办法……加 Swap 分区。

对于 Raspberry Pi 3 B+ 这个型号的小开发板来说,有一点非常重要:

虽然这傻逼玩意运行的时候几乎用不到 Swap,但是你没有 Swap 的话,它就会死

接下来说说在 Raspbian OS 上启用 Swap 的正确办法,网络上有很多其他套路,但都不是符合系统设计规范的:

sudo vim /etc/dphys-swapfile

将 CONF_SWAPSIZE 这个值取消注释,修改为你需要的 Swap 大小,一般 2G 差不多了。

然后你可以重启系统,我建议重启,不建议仅仅重启服务。

之后还可以结合 crontab -e 添加一个每天凌晨 4 点自动重启的计划任务,基本上就可以保证运行正常了。

选区_658.png

在单位配置的一个 Raspberry Pi 3 B+ 已经用了快 3 个月没有问题。

在家里配置的已经用了半个月,服务很 OK,希望能保持长久。

对了,Raspberry Pi 3 B+ 需要供电是 5V 3A,一般卖给你的商家会给你配个乐视的充电头,但实际上如果你达不到这个标准的话,它也能运行,只是不要在上面跑太多外设就好了。

毕竟 5V 3A 是针对火力全开的 Raspberry Pi 3 B+ 的。