问题现象如下:
在境内的服务器上运行一下命令,针对 news.ycombinator.com 每次返回的都是不同的 ip,好像在 3-5 个之间,
而其实际地址应该是 209.216.230.240, 详细测试结果 ( https://tools.ipip.net/ping.php?view=news.ycombinator.com ).
dig @8.8.8.8 news.ycombinator.com ; <<>> DiG 9.14.1 <<>> @8.8.8.8 news.ycombinator.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33306 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;news.ycombinator.com. IN A ;; ANSWER SECTION: news.ycombinator.com. 178 IN A 67.228.221.221 ;; Query time: 6 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Aug 05 07:19:26 UTC 2019 ;; MSG SIZE rcvd: 65 dig @8.8.8.8 news.ycombinator.com ; <<>> DiG 9.14.1 <<>> @8.8.8.8 news.ycombinator.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18922 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;news.ycombinator.com. IN A ;; ANSWER SECTION: news.ycombinator.com. 130 IN A 31.13.77.55 ;; Query time: 11 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Aug 05 07:19:58 UTC 2019 ;; MSG SIZE rcvd: 65
虽然 news.ycombinator.com 在境内被强,但是 8.8.8.8 及 1.1.1.1 均可正常使用,但为何针对 news.ycombinator.com 却返回错误 IP 呢?
这个问题会导致 curl https://news.ycombinator.com
出现报错 curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to news.ycombinator.com:443
最初以为是本地 openssl 的问题,结果发现是 dns 返回了错误的 ip,疑为被投毒。
请问各位大佬,有没有解决方案,已测试过 alidns。
dig dns.google ; <<>> DiG 9.14.1 <<>> dns.google ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27355 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1452 ;; QUESTION SECTION: ;dns.google. IN A ;; ANSWER SECTION: dns.google. 729 IN A 8.8.8.8 dns.google. 729 IN A 8.8.4.4 ;; Query time: 206 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) ;; WHEN: Mon Aug 05 07:26:26 UTC 2019 ;; MSG SIZE rcvd: 71 root @ / [165] → ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=37 time=5.92 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=37 time=11.1 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=37 time=7.29 ms ^C --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 7ms rtt min/avg/max/mdev = 5.917/8.085/11.053/2.172 ms
1 sbw 2019-08-05 15:55:41 +08:00 就是投毒 |
![]() | 2 Nitroethane 2019-08-05 15:58:21 +08:00 via Android Tip:普通 DNS 服务使用 UDP 协议 |
![]() | 3 Buges 2019-08-05 16:01:23 +08:00 via Android DNS 问题一律推荐 dnscrypt-proxy2,强制只使用 doh,解决一切投毒污染的疑难杂症。 |
4 lance86 2019-08-05 16:06:01 +08:00 这个是 dns 劫持,并不是真正的 8.8.8.8 向你响应的,而是中间的某一个环节比如 ISP 发现你发送向 8.8.8.8 的 dns 请求,那么就直接给你返回了一个响应,默认的 dns 请求是 udp 包,未加密,所以你的电脑也不会意识到是假的响应。 注意你向 8.8.8.8 发送到 fns 请求的 query time 是 6ms 11ms,如果这个是真的服务器,8.8.8.8 肯定不在国内吧,最近的估计也是香港吧,6ms 不可能来得及。 |
![]() | 5 edsheeran 2019-08-05 16:10:49 +08:00 via iPhone gfvv |
![]() | 6 tonywangcn OP @Nitroethane @Buges @lance86 谢谢,目前问题在 docker 和 宿主机均有出现,正常浏览器及软件使用有 ss 软件,并没有受到影响,但 docker 和 宿主机内的应用则十分受此问题困扰,在每个 docker 中均安装相关软件工作量略大,请问有没有办法,在宿主机或云服务器假设一个服务,然后 docker 及宿主机简单配置即可解决此类问题呢? 类似于在宿主机配置好 ss,docker 中配置 https_proxy 即可。 简单的搜索了些 dnscrypt-proxy2 相关的资料,貌似与 ss 颇为类似,将流量加密避免被中间投毒。 |
7 azh7138m 2019-08-05 16:30:33 +08:00 @tonywangcn 浏览器,比如 chrome 配置了代理之后,DNS 请求是会走代理的 4 个 8 能 11ms 返回结果你不觉得有点假吗? |
8 leonard916 2019-08-05 16:57:35 +08:00 这个 IP 早就被某墙劫持(抢答)了 你们才发现吗? |
![]() | 9 Buges 2019-08-05 17:16:48 +08:00 @tonywangcn #6 在网关设备(路由器,虚拟机的宿主机等)部署上 dnscrypt-proxy 的服务,然后劫持所有 dns 请求 以宿主机地址 10.0.0.1,端口 5335 为例: iptables -t nat -A PREROUTING -p udp --dport 53 ! -d 9.9.9.9 -j DNAT --to-destination 10.0.0.1:5335 iptables -t nat -A PREROUTING -p tcp --dport 53 ! -d 9.9.9.9 -j DNAT --to-destination 10.0.0.1:5335 iptables -t nat -A OUTPUT -p udp --dport 53 ! -d 9.9.9.9 -j DNAT --to-destination 127.0.0.1:5335 iptables -t nat -A OUTPUT -p tcp --dport 53 ! -d 9.9.9.9 -j DNAT --to-destination 127.0.0.1:5335 |
![]() | 10 gesse 2019-08-05 17:25:49 +08:00 楼主是不是刚回国? |
11 fromxt 2019-08-05 17:43:29 +08:00 本地 hosts 里面指定一下 |
![]() | 13 artandlol 2019-08-05 17:59:31 +08:00 via Android 应该是刚回国 |
![]() | 14 tonywangcn OP @Buges 谢谢大佬,这应该是目前唯一可行的方案了。 |
![]() | 15 CEBBCAT 2019-08-05 18:46:51 +08:00 ![]() https://www.solidot.org/story?sid=61590 楼主有一点说错了,8.8.8.8 从今年儿童节就不能用了,因为有抢答,+tcp 也会被 reset 我当时用 DNS over HTTPS 解决了这一问题。注意,红鱼 DNS 已经不是一个好选项,他们进行了自我阉割 |
16 missdeer 2019-08-05 18:50:58 +08:00 via Android |
17 SampleNaive 2019-08-05 19:09:41 +08:00 你有 ss 或者 ssr 的话, 用 win2socks 远程 DNS 可以解决投毒问题. |
![]() | 18 wwbfred 在天朝,我们管这个叫 IP 自信. |
![]() | 19 wwbfred 2019-08-06 01:54:02 +08:00 因为被污染的 IP 地址基本固定,可以考虑把这样的规则加入防火墙. iptables -t mangle -N dns_chain iptables -t mangle -I PREROUTING -p udp --sport 53 -j dns_chain iptables -t mangle -A dns_chain -m string --algo bm --hex-string "|453FB20D|" --from 60 --to 180 -j DROP iptables -t mangle -A dns_chain -m string --algo bm --hex-string "|430F81D2|" --from 60 --to 180 -j DROP ... 因为使用了匹配算法,效率会有影响.但不是大型服务器问题不大. |
![]() | 20 msg7086 2019-08-06 07:31:01 +08:00 DNS 污染,这都多少年了,如果不是刚回国的话,问出这问题不应该呀。 |
![]() | 21 jamesliu96 2019-08-06 09:18:13 +08:00 via Android dnssec dnsovertls 一日不普及国内 dns 一日不干净,不过有了也没卵用 |