mos-chinadns

command module
v0.3.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 16, 2020 License: GPL-3.0 Imports: 20 Imported by: 0

README

mos-chinadns

一个简单的DNS解析器,实现基于域名与IP的分流,支持DoH,IPv6,EDNS Client Subnet


命令帮助

-c string
        [路径]json配置文件路径
-gen string
        [路径]生成一个json配置文件模板至该路径
-dir string
        [路径]变更程序的工作目录
-dir2exe
        变更程序的工作目录至可执行文件的目录

-v    调试模式,更多的log输出

配置文件说明

{
    // [IP:端口][必需] 监听地址
    "bind_addr": "127.0.0.1:53", 

    // [IP:端口] 本地服务器地址 建议:一个低延时但会被污染大陆服务器,用于解析大陆域名。
    "local_server": "223.5.5.5:53",     

    // [bool] 本地服务器是否屏蔽非A或AAAA请求。
    "local_server_block_unusual_type": false,

    // [IP:端口] 远程服务器地址 建议:一个无污染的服务器。用于解析非大陆域名。   
    "remote_server": "8.8.8.8:443", 

    // [URL] 远程DoH服务器的url,如果填入,远程服务器将使用DoH协议
    "remote_server_url": "https://dns.google/dns-query",  

    // [bool] 是否跳过验证DoH服务器身份 高危选项,会破坏DoH的安全性
    "remote_server_skip_verify": false, 

    // [int] 单位毫秒 远程服务器延时启动时间
    // 如果在设定时间(单位毫秒)后local_server无响应或失败,则开始请求remote_server。
    // 如果local_server延时较低,将该值设定为120%的local_server的延时可显著降低请求remote_server的次数。
    // 0表示禁用延时,请求将同时发送。
    "remote_server_delay_start": 0, 

    // [路径] 本地服务器IP白名单 建议:中国大陆IP列表,用于区别大陆与非大陆结果。
    "local_allowed_ip_list": "/path/to/your/chn/ip/list", 

    // [路径] 本地服务器IP黑名单 建议:希望被屏蔽的IP列表,比如运营商的广告服务器IP。
    "local_blocked_ip_list": "/path/to/your/black/ip/list",
    
    // [路径] 强制使用本地服务器解析的域名名单 建议:中国的域名。
    "local_forced_domain_list": "/path/to/your/domain/list",

    // [路径] 本地服务器域名黑名单 建议:希望强制打开国外版而非中国版的域名。
    "local_blocked_domain_list": "/path/to/your/domain/list",

    // [CIDR] EDNS Client Subnet 
    "remote_ecs_subnet": "1.2.3.0/24"
}

三分钟快速上手 & 预设配置

在这里下载最新版本:release

一份最新的中国大陆IPv4与IPv6的地址表chn.list和域名表chn_domain.list已包含在release的zip包中。

chn.list数据来自APNICchn_domain.list数据来自felixonmars/dnsmasq-china-list LICENSE

将预设配置复制并保存至config.json,确保chn.listchn_domain.listconfig.jsonmos-chinadns在同一目录。

用以下命令启动

mos-chinadns -c config.json -dir2exe
预设配置1 通用 按大陆IP与域名分流

使用中国大陆IP表chn.list和域名表chn_domain.list分流。国内域名使用阿里云DNS解析,国际域名使用OpenDNS解析。

{
    "bind_addr": "127.0.0.1:53",
    "local_server": "223.5.5.5:53",
    "remote_server": "208.67.222.222:443",
    "local_allowed_ip_list": "./chn.list",
    "local_forced_domain_list": "./chn_domain.list"
}
预设配置2 通用 按大陆IP与域名分流 远程服务器使用DoH

使用中国大陆IP表chn.list和域名表chn_domain.list分流。国内域名使用阿里云DNS解析,国际域名使用Google DoH解析。

{
    "bind_addr": "127.0.0.1:53",
    "local_server": "223.5.5.5:53",
    "remote_server": "8.8.8.8:443",
    "remote_server_url": "https://dns.google/dns-query",
    "local_allowed_ip_list": "./chn.list",
    "local_forced_domain_list": "./chn_domain.list"
}
预设配置3 单DoH客户端模式

使用Google DoH作为上游服务器,解析所有域名。

建议启用ECS使解析更精确。如何启用?

{
    "bind_addr": "127.0.0.1:53",
    "remote_server": "8.8.8.8:443",
    "remote_server_url": "https://dns.google/dns-query",
    "remote_server_skip_verify": false,
    "remote_server_delay_start": 0
}

分流效果

国内域名交由local_server解析,无格外延时。国外域名将会由remote_server解析,确保无污染。

dig www.baidu.com 演示
ubuntu@ubuntu:~$ dig www.baidu.com @192.168.1.1 -p5455

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> www.baidu.com @192.168.1.1 -p5455
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57335
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		561	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	250	IN	A	36.152.44.96
www.a.shifen.com.	250	IN	A	36.152.44.95

;; Query time: 4 msec
;; SERVER: 192.168.1.1#5455(192.168.1.1)
;; WHEN: Sun Mar 15 18:17:55 PDT 2020
;; MSG SIZE  rcvd: 149
dig www.google.com 演示
ubuntu@ubuntu:~$ dig www.google.com @192.168.1.1 -p5455

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> www.google.com @192.168.1.1 -p5455
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2719
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.google.com.			IN	A

;; ANSWER SECTION:
www.google.com.		280	IN	A	74.125.68.99
www.google.com.		280	IN	A	74.125.68.105
www.google.com.		280	IN	A	74.125.68.104
www.google.com.		280	IN	A	74.125.68.103
www.google.com.		280	IN	A	74.125.68.106
www.google.com.		280	IN	A	74.125.68.147

;; Query time: 72 msec
;; SERVER: 192.168.1.1#5455(192.168.1.1)
;; WHEN: Sun Mar 15 18:19:20 PDT 2020
;; MSG SIZE  rcvd: 223

实现细节

黑白名单

流程

  1. 如果指定了域名白名单->匹配域名->白名单中的域名将被本地服务器解析
  2. 如果指定了域名黑名单->匹配域名->黑名单中的域名将被远程服务器解析
  3. 如果指定了IP黑名单->匹配本地服务器返回的IP->丢弃黑名单中的结果。
  4. 如果指定了IP白名单->匹配本地服务器返回的IP->不在白名单的结果将被丢弃。

远程服务器的结果一定会被接受

域名黑/白名单格式

采用按域向前匹配的方式,与dnsmasq匹配方式类似。每个表达式一行。

规则:

  • cn相当于*.cn。会匹配所有以cn结尾的域名,example.cnwww.google.cn
  • google.com相当于*.google.com。会匹配www.google.com, www.l.google.com,但不会匹配www.google.cn

比如:

cn
google.com
google.com.hk
www.google.com.sg

IP黑/白名单格式

由单个IP或CIDR构成,每个表达式一行,支持IPv6,比如:

1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
2001:dd8:1a::/48

2.2.2.2
3.3.3.3
2001:ccd:1a

性能

IP列表与域名列表均已做性能优化。IP列表采用二分搜索,数据仅存储在一个对象上。域名列表采用Hash,数据仅存储在三个对象上。无需担心长列表的匹配时间与GC的压力。

关于EDNS Client Subnet (ECS)

remote_ecs_subnet 填入自己的IP段即可启用ECS。如不详请务必留空。

启用ECS最简单的方法:

  • 百度搜索IP,得到自己的IP地址,如1.2.3.4
  • 将最后一位变0,并加上/24。如1.2.3.41.2.3.0/24
  • 1.2.3.0/24填入remote_ecs_subnet

更多ECS资料请参考rfc文档:EDNS Client Subnet

关于DNS-over-HTTPS (DoH)

填入同时填入remote_serverremote_server_url即可启用DoH模式。请求方式为RFC 8484 GET。

想了解有那些服务器支持DoH,请参阅维基百科公共域名解析服务列表

关于文件路径

建议使用-dir2exe选项将工作目录设置为程序所在目录,这样的话配置文件-c路径和配置文件中的路径可以是相对于程序的相对路径。

如过附加-dir2exe后程序启动报错那就只能启动程序前手动cd或者使用绝对路径。

Open Source Components / Libraries

部分设计参考

依赖

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL