Giter VIP home page Giter VIP logo

mos-chinadns's Introduction

mos-chinadns

支持DoH,IPv6,EDNS Client Subnet(ECS),根据域名和IP的分流。release附带大陆IP和域名表,配置简单,开箱即用。


命令帮助

-c string   [路径]json配置文件路径

-dir string [路径]变更程序的工作目录
-dir2exe    变更程序的工作目录至可执行文件的目录

-gen string [路径]生成一个json配置文件模板至该路径
-v          调试模式,更多的log输出
-q          安静模式,无log
-no-tcp     不监听tcp,只监听udp
-no-udp     不监听udp,只监听tcp
-cpu        使用CPU核数 

三分钟快速上手

在这里下载最新版本:release

大陆IP表chn.list和域名表chn_domain.list已包含在release的zip包中。

从以下预设配置选择一个适合自己的(如果不清楚,用预设配置1),复制并保存至config.json,确保chn.listchn_domain.listconfig.jsonmos-chinadns在同一目录。

预设配置1 通用 按大陆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"
}
预设配置2 通用 按大陆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"
}
预设配置3 DoH客户端

使用Google DoH作为上游服务器。无分流。将mos-chinadns作为简单的DoH客户端。

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

用以下命令启动

mos-chinadns -c config.json -dir2exe

更新大陆IP与域名列表

scripts\update_chn_ip_domain.py能自动下载数据并生成大陆IP与域名列表chn.listchn_domain.list到当前目录。

该脚本需要python3,依赖netaddrrequests

分流效果

国内域名直接交由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

和dnsmasq一起使用

mos-chinadns无缓存功能,dnsmasq可以用于缓存mos-chinadns的结果。

使用dnsmasq配合dnsmasq-china-list分流的方式很流行,但dnsmasq毕竟不是专为分流设计,其匹配域名的方式是逐一匹配,用时随列表长度线性增长。mos-chinadns自带的chn_domain.list包含dnsmasq-china-list中所有域名。不同的是,mos-chinadns采用hash算法匹配域名,处理dnsmasq-china-list包含的7万多条记录所需时间远远(几个数量级)小于dnsmasq。所以建议用mos-chinadns分流域名。

其他细节

设计思路

mos-chinadns的出发点是实现传统方案 ChinaDNS(IP分流) + dnscrypt(DNS加密) + dnsmasq + dnsmasq-china-list(域名分流)的效果。整合常用的功能,同时优化性能。

DNS-over-HTTPS (DoH)

请求方式为RFC 8484 GET。

默认使用系统证书池验证DoH服务器身份。如无法读取系统证书池或服务器为自签发证书,需通过*_server_pem_ca参数提供的CA证书。

请求流程与local_server黑白名单

  1. 如果指定了域名白名单->匹配域名->白名单中的域名将被仅发往local_server解析->接受返回结果->END
  2. 如果指定了域名黑名单->匹配域名->黑名单中的域名将被仅发往remote_server解析->接受返回结果->END
  3. 发送至local_serverremote_server解析
    1. local_server返回的空结果会被丢弃
    2. 如果指定了IP黑名单->匹配local_server返回的IP->丢弃黑名单中的结果
    3. 如果指定了IP白名单->匹配local_server返回的IP->丢弃不在白名单的结果
    4. 接受最先返回结果->END

简单的说:local_server的结果会根据设置进行过滤,remote_server的结果一定会被接受。

域名黑/白名单格式

采用按域向前匹配的方式。每个表达式一行。

规则示例:

  • 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
2001:dd8:1a::/48

2.2.2.2
2001:ccd:1a

json配置文件

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

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

    // [URL] DoH服务器的url,如果填入,`local_server`将使用DoH协议
    "local_server_url": "https://223.5.5.5/dns-query",

    // [path] 用于验证`local_server`的PEM格式CA证书的路径。
    // 默认使用系统证书池。
    "local_server_pem_ca": "/path/to/your/CA/cert",

    // [bool] `local_server`是否屏蔽非A或AAAA请求。
    "local_server_block_unusual_type": false,

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

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

    // [path] 用于验证`remote_server`的PEM格式CA证书的路径。
    // 默认使用系统证书池。
    "remote_server_pem_ca": "/path/to/your/CA/cert", 

    // [int] 单位毫秒 `remote_server`延时启动时间。
    // 如果在设定时间后`local_server`无响应或失败或结果被丢弃,则开始请求`remote_server`。
    // 如果`local_server`延时较低,将该值设定为120%的`local_server`的延时可显著降低请求`remote_server`的次数。
    // 该选项主要用于缓解低运算力设备的压力。
    // 0表示禁用延时,请求将同时发送。
    "remote_server_delay_start": 0, 

    // [路径] `local_server`IP白名单
    // 建议:大陆IP列表,用于IP分流。
    "local_allowed_ip_list": "/path/to/your/chn/ip/list", 

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

    // [路径] `local_server`域名黑名单
    // 建议:希望强制打开国际版而非国内版的域名。
    "local_blocked_domain_list": "/path/to/your/domain/list",

    // [CIDR] EDNS Client Subnet。
    // 填入自己的IP段即可启用ECS。 
    // 默认ECS不启用。
    "local_ecs_subnet": "1.2.3.0/24",
    "remote_ecs_subnet": "1.2.3.0/24"
}

Open Source Components / Libraries / Reference

部分设计参考

依赖

资源

mos-chinadns's People

Contributors

irinesistiana avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.