0%

docker运行overture

1
2
19.01.30 初始化
19.07.22 添加dockerhub相关内容

导语

  • 升级overture时候,才发现配置文件有更改,且支持了dot,索性扔进docker里面,方便维护.

需求

  • 国内/国外分流,国内网站交给国内DNS,国外的交给墙外无污染DNS.
  • 对CDN友好,访问百度,我在广州,你DNS分配个青岛的地址要闹那样.
  • 带有DNS缓存,加速解析.
  • 跨平台(小),出门不能一直带着路由器啊.
  • docker运行,自动更新分流list文件.

方案

  • 国内/国外分流

  • 分流可使用ChinaDNS.

    • 无污染DNS
      • 墙外DNS,但udp-53端口,基本被劫持.需要特别方式规避.
        • 非标准DNS端口 例如 opendns的udp-5353端口 tcp-443端口
        • DNS over HTTPS ,支持最好的是google-dns及 Cloudflare-dns,其中google-dns比较麻烦,还需要自行寻找可用的google ip地址.
        • DNS over TLS ,与上一个类似.
        • DNSCrypt ,支持此项的公共DNS很多,与此被干扰的也比较厉害.
      • ss/ssr-vpn-v2ray 等代理解析dns.
      • 一直可用的中科大DNS 北方还好.
  • 对CDN友好选择支持EDNS的上游DNS,国内主流都支持了,除了114.

  • 带有DNS缓存,这个用的较多的 dnsmasq ,当作下游DNS.

  • 跨平台(大雾),一般都在路由器搞搞.

最终定型

  • dnsmasq(可选) + overture + 上游加密DNS(可选)

  • overture DNS分流净化器,go语言编写,解决chinadns不稳定而编写.

    • 得益于go的跨平台能力,基本通吃.
    • 已经支持DNS缓存
    • 支持tcp / udp DNS查询
    • 比chinadns更加稳定.
  • 实际上如果只需要一个纯净DNS,只使用overture就足够了.

  • 当需要广告过滤时,添加dnsmasq.

  • overture可使用 非标准dns端口查询dns,解决上游DNS污染问题.非标准端口被大量干扰或dns查询全程保密,才需要使用DNSCrypt DNS over HTTPS等额外措施.

  • overture 已经支持 dns over tls,无需上游加密DNS

实施

  • 最新的releases,这里以 v1.5 为例.

配置文件

  • 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    {
    "BindAddress": ":53",
    "HTTPAddress": ":5555",
    "PrimaryDNS": [
    {
    "Name": "DNSPod",
    "Address": "119.29.29.29:53",
    "Protocol": "udp",
    "SOCKS5Address": "",
    "Timeout": 6,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    }
    ],
    "AlternativeDNS": [
    {
    "Name": "OpenDNS",
    "Address": "208.67.222.222:443",
    "Protocol": "tcp",
    "SOCKS5Address": "",
    "Timeout": 6,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    }
    ],
    "OnlyPrimaryDNS": false,
    "IPv6UseAlternativeDNS": false,
    "IPNetworkFile": {
    "Primary": "./ip_network_primary_sample",
    "Alternative": "./ip_network_alternative_sample"
    },
    "DomainFile": {
    "Primary": "./domain_primary_sample",
    "Alternative": "./domain_alternative_sample"
    },
    "HostsFile": "./hosts_sample",
    "MinimumTTL": 0,
    "CacheSize" : 0,
    "RejectQtype": [255]
    }
  • 主要变动

    • XXXXDNS下的 Protocol ,字段除 tcp udp 可选之外,增加了 tcp-tls ,使得无需上游加密DNS,使用 tcp-tls 时,对 Address 字段有要求, "servername:port@serverAddress", 一般可用 one.one.one.one:853@1.1.1.1.或者 one.one.one.one:853@1.0.0.1

    • 分流文件,细化为了 IPNetworkFile 和 DomainFile.

      • IPNetworkFile
        • 大致是当 PrimaryDNS 查询的结果在 Primary 字段对应文件时,立刻使用,忽略 AlternativeDNS 查询结果. 这里可以配置为国内ip的list文件.防止国内服务器解析到国外,配合支持 EDNS 的 PrimaryDNS,基本可以做到cdn的就近解析.
        • Alternative字段 可以忽略,作用类似.
      • DomainFile
        • 根据域名直接分流到对应的DNS进行解析. Primary 字段可以是常见国内域名,也可忽略. Alternative 使用处理过的 gfwlist ,即可做到被污染域名走 AlternativeDNS .
      • IPNetworkFile 需要 chinaiplist, DomainFile 需要 gfwlist. gfwlist 需要处理一下格式.

Dockerfile

  • 容器已经上传了dockerhub 可以直接 docker pull jasperhale/overture.

  • 至此我们确认了Dockerfile的主要内容.

    • 下载并解压最新的 releases ,这里是 amd64版本 ,树莓派3b 需要下载 arm64 版本.
    • 下载 chinaiplist gfwlist 处理格式.
    • 编辑默认的配置文件, 配置 chinalist gfwlist
    • 写入计划任务,自动更新分流文件.
  • 其他

    • 基础镜像使用 apline:3.8 仅 5M大小.
    • apline 使用的是 busybox ,命令与常用的有一些差别.包管理为 apk 命令.
    • 计划任务也与常用的略有不同.
  • Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    FROM alpine:3.8

    ENV VERSION v1.5

    WORKDIR /srv

    RUN set -xe && \
    mkdir overture && \
    cd /srv/overture && \
    apk add --no-cache unzip curl && \
    curl -fsSLO --compressed "https://github.com/shawn1m/overture/releases/download/${VERSION}/overture-linux-amd64.zip" && \
    curl https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/ d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; /sina\.cn/ d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/d' | sed '/ ^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^ [0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > gfwlist.txt && \
    curl https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt > china_ip_list.txt && \
    unzip -o "overture-linux-amd64.zip" -d /srv/overture && \
    rm -rf "overture-linux-amd64.zip" && \
    apk del unzip && \
    sed -i 's/ip_network_primary_sample/china_ip_list.txt/ g' config.json && \
    sed -i 's/domain_alternative_sample/gfwlist.txt/g' config.json && \
    echo '#!/bin/sh' > update.sh && \
    echo "curl https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/ ##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; / sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/ d' | sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > gfwlist.txt" >> update.sh && \
    echo "curl https://raw.githubusercochina_ip_list/master/china_ip_list.txt >> china_ip_list.txt" >> update.sh && \
    chmod u+x update.sh && \
    echo '0 2 * * * sh /srv/overture/update.sh'>>/var/spool/cron/crontabs/root

    CMD crond && cd /srv/overture && ./overture-linux-amd64 -l overture.log
  • 开箱即用,整体略混乱….配置文件未独立,不太符合docker的最佳实践.修改配置文件需要拷贝 /src/overture 再挂载回容器.

  • 有时间再整理,将配置文件/分流文件独立出来,或者加载到数据卷中. crond 的启动等,全部放入脚本文件.

  • 1.5编译的镜像大致6M左右.

docker-compose

  • 对应的 docker-compose

    1
    2
    3
    4
    5
    6
    7
    8
    9
    overture:
    container_name: overture
    image: overture
    restart: always
    ports:
    - "127.0.0.1:53:53/tcp"
    - "127.0.0.1:53:53/udp"
    volumes:
    - ./:/srv/overture
  • 需要提前拷贝出 /src/overture 文件夹,否则宿主机的目录会覆盖容器的 /src/overture ,造成无法启动.

  • 关联 udp53 和 tcp53 .

  • 使用 dig 命令查询,基本做到了 DNS 分流,和无污染 DNS .

  • ps: dig 9.x查询 edns 存在问题,需要 nocookie 参数.