演示:
bogon: ~/projects/prdns ]
suspended$ dig @localhost facebook.com
; <<>> DiG 9.8.3-P1 <<>> @localhost facebook.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8442
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;facebook.com. IN A
;; ANSWER SECTION:
facebook.com. 56 IN A 157.240.11.35
;; Query time: 180 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Mar 3 11:10:25 2020
;; MSG SIZE rcvd: 46
bogon: ~/projects/prdns ]
suspended$ dig @localhost taobao.com
; <<>> DiG 9.8.3-P1 <<>> @localhost taobao.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19749
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;taobao.com. IN A
;; ANSWER SECTION:
taobao.com. 300 IN A 140.205.220.96
taobao.com. 300 IN A 140.205.94.189
;; Query time: 46 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Mar 3 11:10:29 2020
;; MSG SIZE rcvd: 60
bogon: ~/projects/prdns ]
suspended$
1
scys 2020-03-03 10:06:23 +08:00
看起来听不多,不过 Ruby 暂时就观看态度
|
2
aoerboquartz 2020-03-03 10:09:09 +08:00
你这个有点意思,如果有演示就更好了。
|
4
suspended OP @scys
@aoerboquartz 演示来喽~ bogon: ~/projects/prdns ] suspended$ dig @localhost facebook.com ; <<>> DiG 9.8.3-P1 <<>> @localhost facebook.com ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8442 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;facebook.com. IN A ;; ANSWER SECTION: facebook.com. 56 IN A 157.240.11.35 ;; Query time: 180 msec ;; SERVER: ::1#53(::1) ;; WHEN: Tue Mar 3 11:10:25 2020 ;; MSG SIZE rcvd: 46 suspended: ~/projects/prdns ] stone$ dig @localhost taobao.com ; <<>> DiG 9.8.3-P1 <<>> @localhost taobao.com ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19749 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;taobao.com. IN A ;; ANSWER SECTION: taobao.com. 300 IN A 140.205.220.96 taobao.com. 300 IN A 140.205.94.189 ;; Query time: 46 msec ;; SERVER: ::1#53(::1) ;; WHEN: Tue Mar 3 11:10:29 2020 ;; MSG SIZE rcvd: 60 bogon: ~/projects/prdns ] stone$ |
5
xishijt 2020-03-03 11:18:34 +08:00
一脸期待的进来,一脸懵逼的出去,不知道怎么用
|
7
suspended OP @reechangs Windows 可能麻烦点,因为没有自带 ruby。linux 自带 ruby 的还好吧?只需要 gem install prdns 就安装好了啊。
|
8
Archeb 2020-03-03 11:56:21 +08:00
|
9
suspended OP @Archeb 所有市面上现有的反污染机制都不如我的这个噢,我的这个不需要什么 GFWList,GEOIP 啥的数据库。
|
10
demonzoo 2020-03-03 13:21:57 +08:00
貌似有前途,先马
|
11
moxnet 2020-03-03 13:28:49 +08:00
如果继续走 53 的 udp,很容易被识别,流量多了也是难免的。
要不被卡,还得用 DoT 或 DoH 啊。 |
12
richard1122 2020-03-03 14:18:32 +08:00
简单看了下代码不太理解为什么这样就是污染的域名?。。
|
13
XiaoxiaoPu 2020-03-03 14:28:39 +08:00 3
@richard1122 构造一个不存在的子域名 ne-{timestamp}.example.com ,正常情况下(域名未被污染)查询结果应该不存在解析,如果被污染了,会被 GFW 抢答返回包含 A 记录的回应,查询结果就是有解析
|
14
richard1122 2020-03-03 14:30:20 +08:00
@XiaoxiaoPu #13 明白了,竟然这么酷
|
15
suspended OP @XiaoxiaoPu 嘻嘻,花了我一个小时研究出来的机制,可惜不能申请专利。:D
|
16
tpsxiong 2020-03-03 14:46:14 +08:00
@XiaoxiaoPu 如果只污染部分子域名的,怎么处理?
|
17
XiaoxiaoPu 2020-03-03 14:50:55 +08:00
@tpsxiong 目前来看 dns 污染应该是按后缀匹配的,不管前面的前缀。你说的只污染部分子域名,有具体的例子吗?
|
19
suspended OP @Archeb 我没有去看代码,但是如果是从 ChinaDNS 派生的,应该都是同时查国内 /国外的 DNS,先返回的如果是国内 IP 则取信,否则取国外 DNS 的结果,因此是需要判定是否为国内 IP——这个就需要数据库。当然,在 ipv4 地址因为差不多耗尽的现状下,ip 数据库已经变动很少的话,也是可以用的。
我的机制则完全不需要 ip 库,不需要维护,可靠程度极高,甚至可以说不存在判定错误。 |
20
Archeb 2020-03-03 15:05:09 +08:00
@suspended 我看了代码,思路和 chinadns 不是完全相同,不过确实依赖国内 IP 数据库。
你的实现方法确实不错的。 |
21
tpsxiong 2020-03-03 15:24:29 +08:00
|
23
gainsurier 2020-03-03 15:31:17 +08:00 via iPhone
楼主注意保护好自己的隐私,有 wj,dns server 非常敏感。
|
24
suspended OP @reechangs 不会。对每个顶级域名,只有第一次会多查一次 DNS 记录,后续就已经知道这个域名是否是污染的,不会再去检测是否污染,会直接查国内 DNS/可信 DNS。
|
25
suspended OP @gainsurier 多谢提醒。不过没关系,最多也就是让我关掉这个 repo 而已。:D
|
26
yulihao 2020-03-03 16:01:52 +08:00
是不是还要安装 net-dns ?
C:/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require' : cannot load such file -- async/dns (LoadError) |
28
hhhsuan 2020-03-03 16:11:13 +08:00
所以具体是什么机制? 能讲一下吗?
|
29
suspended OP @yulihao 倒是没有在 Windows 上测试过,不过 async/dns 在 prdns 的依赖项里,按说 gem install prdns 会自动把 async/dns 装上才对。试试再装一下 async/dns 吧:`gem install async-dns`
|
31
bonny23 2020-03-03 17:49:01 +08:00
lz 的方案的确挺创新的,赞一个
|
32
hhhsuan 2020-03-03 18:24:16 +08:00
那些有泛解析的域名怎么办? 所有的二级域名都能解析到一个地址。
|
33
suspended OP @hhhsuan 泛解析也是支持的:
```shell suspended$ dig @localhost anything-is-resolved.bing.com ; <<>> DiG 9.8.3-P1 <<>> @localhost anything-is-resolved.bing.com ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39738 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;anything-is-resolved.bing.com. IN A ;; ANSWER SECTION: anything-is-resolved.bing.com. 3600 IN CNAME star-bing-com.a-0001.a-msedge.net. star-bing-com.a-0001.a-msedge.net. 60 IN CNAME dual-a-0001.a-msedge.net. dual-a-0001.a-msedge.net. 49 IN A 13.107.21.200 dual-a-0001.a-msedge.net. 49 IN A 204.79.197.200 ;; Query time: 43 msec ;; SERVER: ::1#53(::1) ;; WHEN: Tue Mar 3 18:25:13 2020 ;; MSG SIZE rcvd: 152 ``` |
35
Yourshell 2020-03-03 18:28:45 +08:00
污染不了就会被墙掉
|
37
yulihao 2020-03-03 20:40:39 +08:00
@hhhsuan 我不知道我的理解对不对,我的理解是 GFW 会针对如*.google.com ,只要是 google.com 他都返回一个值,因此随机修改*的字符串看看 GFW 有没有返回结果,若有则为污染
|
38
ZeroSimple 2020-03-03 20:44:19 +08:00 via Android
支持一下。
不过小心搭,搭 DNS 似乎是违法的,会被查水表。之前有 V 友被查了。不过如果你已经肉身 fq 了当我没说 |
39
yulihao 2020-03-03 20:46:03 +08:00
我来提交新 BUG ( windows 下的)
若输入的域名不存在或者查询超时,这边就会发生错误 | Errno::ECONNRESET: An existing connection was forcibly closed by the remote host. - recvmsg(2) | → C:/Ruby27-x64/lib/ruby/2.7.0/socket.rb 444 | C:/Ruby27-x64/lib/ruby/2.7.0/socket.rb 444 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-io-1.27.3/lib/ async/io/generic.rb 216 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-io-1.27.3/lib/ async/io/generic.rb 62 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-dns-1.2.5/lib/ async/dns/handler.rb 73 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-dns-1.2.5/lib/ async/dns/server.rb 114 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-io-1.27.3/lib/ async/io/socket.rb 169 | C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/async-1.24.2/lib/asy nc/task.rb 258 5m28s warn: <> UDP response failed: #<IOError: closed stream>! [pid=13688] [2020-03-03 20:39:44 +0800] 一会儿同时提交到你的 repo 那里,感谢有这样一种工具,希望能有效解决移动 dns 劫持 |
40
crella 2020-03-03 20:49:22 +08:00
虽然楼主的本意是好,但是为啥要把这个项目放上 rubygems 上面去?万一哪一天 gems.ruby-china.com 被封了怎么办
|
41
bitdepth 2020-03-03 20:49:50 +08:00 via iPad
判斷 root server 進行查詢?然後全場才有 dnssec ?
有空我看看這邊機制,如果方案好可以寫論文 |
44
suspended OP @ZeroSimple 怕怕。。。不过我不提供 DNS 服务啊。
|
45
yankebupt 2020-03-03 21:05:23 +08:00 1
@XiaoxiaoPu
有的域名走 cdn 會出百度加速驗證碼...其實這個還好 有的域名會自己主動把 CDN 解析部分用 cloudflare 屏蔽掉,比如 kknews.cc 所以最後是不是還是得保留一個哪怕很小的規則文件呢. |
46
bitdepth 2020-03-03 23:01:02 +08:00 via iPad
@suspended 我是建議您可以如此考慮,例如 tor 的 obfuscation 的幾個方案都有論文
要是我去寫論文,基本上是會拿來批判用的,因為不是自己作品 |
47
p0h5 2020-03-04 00:48:58 +08:00 via iPhone
期待 Mac 做个 brew 一键安装
|
48
szpunk 2020-03-04 02:28:23 +08:00
|
49
sola97 2020-03-04 02:45:58 +08:00
直接装的是 ruby2.3.3。。还要升级 2.4,真麻烦。。
|
50
pythonee 2020-03-04 09:16:20 +08:00
原理是什么呢?
|
51
hhhsuan 2020-03-04 10:37:25 +08:00
@yulihao #37 这个我知道,但我的疑问是怎么处理那些加入了泛解析的域名呢?就是不管你的二级域名写什么都会有记录返回的域名。这些域名你怎么分辨它是正常的还是被污染了?
|
52
suspended OP @hhhsuan 我测试了好些个泛域名,通常都会返回 CNAME,所以可以判定。当然如果泛域名只返回个 A 记录那就会判错。
|
53
hgg12580 2020-03-04 15:58:37 +08:00
@XiaoxiaoPu 如果域名有泛解析呢?
|
54
marquina 2020-03-06 12:22:36 +08:00
@suspended @XiaoxiaoPu 感谢提供思路和原理解惑。自己撸了一个 GO 版本的,支持简单的自定义规则、域名污染结果缓存(支持 redis )。
地址: https://github.com/wolf-joe/dns-splitter,欢迎尝试 |