Skip to content

Instantly share code, notes, and snippets.

@willwhui
Last active September 14, 2017 14:21
Show Gist options
  • Save willwhui/7283897f6a50ab169043d00bb83bdedb to your computer and use it in GitHub Desktop.
Save willwhui/7283897f6a50ab169043d00bb83bdedb to your computer and use it in GitHub Desktop.
客户端Ubuntu的DNS解析防污染(废)
客户端Ubuntu的DNS解析防污染
@willwhui
Copy link
Author

willwhui commented Jun 8, 2017

注:有朋友说,SwitchyOmega会直接把url发给远端ss,所以我下面出现的问题很可能都是因为我在本地胡乱配置导致的问题。

以及我的openwrt路由器配置的一些未知情况导致我本地的ss+switchy不能正常工作。
现在已经能够正常工作了。
继续留观中。

因此下面的内容先不用看了。

需求:在外出差的时候可以通过共享手机移动网络的方式,让ubuntu笔记本科学上网
问题:在笔记本上装上ss之后,用Chrome配合SwitchyOmega插件上网,总是断掉。经分析对比,发现是dns请求出了问题。dns请求默认是udp的。
尝试解决方案:将本地发出的dns请求,转为tcp模式,并通过本地的ss传出进行解析。

@willwhui
Copy link
Author

willwhui commented Jun 8, 2017

前两天想在本地安装openwrt那套模式,做本地dns和数据流转发,结果搞出问题来了,Chrome配合SwitchyOmega插件上网,完全不可用了。
一切换到相应的代理(ss或者ssr),就提示:


无法访问此网站

www.baidu.com 意外终止了连接。
请试试以下办法:
检查网络连接
检查代理服务器和防火墙
ERR_CONNECTION_CLOSED


(以上baidu.com是用来做实验的网址,对我来说它基本上也就是这个用途了)
尝试排查原因,逐步卸载了以下应用:
卸载shadowsocks-libev,没解决
卸载pdnsd,没解决
卸载iptable,没解决
有点没辙了,仔细检查目前的配置项:


检查ss的local端口绑定结果:
sudo netstat lntp:
tcp 0 0 127.0.0.1:8088 0.0.0.0:* LISTEN 1545/python
tcp 0 0 127.0.0.1:1088 0.0.0.0:* LISTEN 1546/python
上面这两个端口分别对应了我的ss和ssr。看起来没问题。


检查ss的local端口绑定结果对应的进程:
sudo ps ax | grep local:
1545 ? S 0:01 python local.py
1546 ? S 0:00 /usr/bin/python /usr/local/bin/sslocal c /home/xxx/ss/ss.json
上面是这两个pid对应的进程。看起来没问题。
SwitchOmega里面也设置了上述两个对应的情景模式。
可是为什么就是连不上呢?


会不会是本地dns解析已坏?
不太可能,因为我选用SwithyOmega的“使用系统代理”,是可以上网的(因为我路由器已openwrt+ss翻,我现在就是这样才能写这个)
检查如下:
nslookup google.com
Server: 127.0.1.1
Address: 127.0.1.1#53

Non-authoritative answer:
Name: google.com
Address: 74.125.200.113
Name: google.com
Address: 74.125.200.139
Name: google.com
Address: 74.125.200.101
Name: google.com
Address: 74.125.200.102
Name: google.com
Address: 74.125.200.138
Name: google.com
Address: 74.125.200.100

这是NetworkManager利用dnsmasq-base把dns转到本地了。
如果通过以下命令去掉ubuntu本地的dns解析转发:
sudo gedit /etc/NetworkManager/NetworkManager.conf
sudo service network-manager restart

再 nslookup google.com,结果如下:
Server: 192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
Name: google.com
Address: 74.125.200.102
Name: google.com
Address: 74.125.200.101
Name: google.com
Address: 74.125.200.139
Name: google.com
Address: 74.125.200.113
Name: google.com
Address: 74.125.200.100
Name: google.com
Address: 74.125.200.138

以上192.168.1.1是我的路由器,因此我认为本地dns也是好的。


问题出在哪里呢?
真相只有一个,但是我找不到。。。

@lbp0200
Copy link

lbp0200 commented Jun 8, 2017

lbp0200 :
先看看ss报什么错误,再看看SwitchyOmega插件设置是否是socks5协议,DNS在这个过程基本不起作用。
DNS只在区分国内外网站的时候有用。
另,测试ss最好用google.com

willwhui:ss看不到报错,我买的别人的服务。switchyOmega插件里面设置了sock5了。
我更新了一下tcpdump的情况。我感觉是在本地就被拒绝了,还没到服务端去,不知道对不对。

另外,DNS的解析影响很大,我在我的路由器上实测确认:默认upd包去做dns解析,哪怕是通过ss-tunnel转发,在运输的过程中也会被人直接截获丢弃,估计是抱着“宁可错杀不可放过”的思想。用pdnsd转换成tcp包做dns解析,通过ss-tunnel转发,目前为止没有问题。参见我的另一个 gist在Openwrt路由器上配置Shadowsocks
补充:我有个朋友告诉我说,如过不是通过路由器整体翻墙,而是通过本地的switchyOmega来连远端ss,Omega会把整个url发给远端,和DNS解析无关。你说的应该是这个意思,是我理解错了。

@willwhui
Copy link
Author

willwhui commented Jun 8, 2017

继续排查:


sudo tcpdump -i any host localhost
可见大量如下结果:

17:56:37.657024 IP localhost.1088 > localhost.50016: Flags [.], ack 234, win 350, options [nop,nop,TS val 156575 ecr 156575], length 0
17:56:37.660530 IP localhost.1088 > localhost.50020: Flags [F.], seq 13, ack 229, win 350, options [nop,nop,TS val 156576 ecr 156529], length 0
17:56:37.660703 IP localhost.50020 > localhost.1088: Flags [F.], seq 229, ack 14, win 342, options [nop,nop,TS val 156576 ecr 156576], length 0


sudo tcpdump -i any dst localhost and tcp port 1088
可见大量如下结果:
21:43:33.008249 IP localhost.51686 > localhost.1088: Flags [F.], seq 223, ack 14, win 342, options [nop,nop,TS val 273141 ecr 273141], length 0
21:43:33.008262 IP localhost.1088 > localhost.51686: Flags [.], ack 224, win 350, options [nop,nop,TS val 273141 ecr 273141], length 0
21:43:39.989639 IP localhost.1088 > localhost.51618: Flags [F.], seq 13, ack 229, win 350, options [nop,nop,TS val 274886 ecr 272385], length 0
21:43:39.989817 IP localhost.51618 > localhost.1088: Flags [F.], seq 229, ack 14, win 342, options [nop,nop,TS val 274886 ecr 274886], length 0
21:43:39.989835 IP localhost.1088 > localhost.51618: Flags [.], ack 230, win 350, options [nop,nop,TS val 274886 ecr 274886], length 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment