SS详解(三):SS模式:gfwlist

网络 by 神秘人 at 2017-09-25

SS 使用的方法有很多结构和模式。那么,我先从我自己个人最喜欢的模式以及这个固件的功能来介绍。

1)ss-redir + gfwlist

个人认为,这种模式是最稳定、最可靠、最少干扰正常网络使用,对于路由器的性能影响最小。它通过一个名为 gfwlist 的列表,指出了那些需要从SS通道走的域名。

路由中内置了一个常用的被墙域名列表,这个gfwlist 列表位于固件目录中的 /etc_ro/basedomain.txt ,系统启动后,会在创建一个 /etc/storage/basedomain.txt 的链接指向 /etc_ro/basedomain.txt 。如果你想建立一个专用的常用域名列表,直接删除这个文件,重新建立就好了。

SS在启动时候,脚本会自动从这个列表结合 /etc/storage/shadowsocks_mydomain_script.sh 这个文件的域名内容(这个文件就是我们在路由界面添加的自定义域名列表),生成一个适用于 dnsmasq 的配置文件,存放于 /tmp/ss/dnsmasq.d 中,文件名为 r.gfwlist.conf 。

当 r.gfwlist.conf 自动生成完毕之后,dnsmasq 会重启激活这个配置,并且启动 pdnsd 以及 ss-redir 。

让我们看看在这种模式下,我们访问 google.com 的整个流程是怎么样的。

我们在PC浏览器输入 google.com ,浏览器查询域名的IP 域名IP查询会优先从pc的 hosts 文件查询,所以,要确保你要访问的域名没有被你的hosts文件解析出来,这个是少数人遇到gfwlist 模式无法正常工作的常见原因之一。

你的电脑会从你网络设定的DNS服务器查询域名的IP,如果你电脑上的网络设置 dns server不是指向这个路由,那么,整个功能是无法使用的,这也是大多数人遇到 gfwlist 无法工作的最常见原因之一。

当你的电脑向路由查询 google.com IP 的时候,路由中的 dnsmasq 接收到这个查询指令,然后发现 google.com 在 r.gfwlist.conf 的列表中,并且列表指出这个域名需要通过 pdnsd 的端口查询,因此,dnsmasq会把域名查询转给 pdnsd ,让它来做解析。

我们的固件中,采用的是pdnsd 来把 udp 的域名请求转换为 tcp域名请求的,目前国内的网络环境,udp的域名请求被大量投毒,而tcp的几乎没有,所以,我们在pdnsd 设置了 opendns 和 google 的dns作为域名解析服务器,为了获得更加合理的域名解析,我们需要在固件UI里面设置 中设置 pdnsd 通过 SS代理访问,这样dns 服务器才能返回离你ss-server 最近的IP,而不是离你的PC 最近的IP,当然,你硬是要觉得pdnsd 直连才让你舒服,我也没有办法。 当 pdnsd 获得了 google.com 的解析后,会转交给dnsmasq ,dnsmasq 再次检查 r.gfwlist.conf,发现 google.com 还有一个ipset 的设置,于是,它会把这个域名的ip 放入到 ipset 的 gfwlist 列表中,然后把ip返回给你的电脑,以上1~6的步骤看起来好复杂,但整个处理时间大约为0.2秒左右。

当你的电脑获得了 google.com 的IP后,开始向你的电脑网络设置中的网关发出向google ip 的连接请求,如果你的网关设置不是指向这个路由,那么,这也是少数人遇到 gfwlist 不能工作的情况。 当路由收到有发向google IP 的网络连接请求后,开始核对 ipset gfwlist 的ip列表,如果有符合的,直接重定向到 ss-redir 的透明代理端口。 ss-redir 把数据进行加密,发给远端的 ss-server。 ss-server解密数据包,发出连接请求,获得服务器的数据响应,加密,返回给路由的 ss-redir。 ss-redir 解密,把数据返回给你的电脑,这样,整个连接就完成了。

基本上整个gfwlist 模式运作的,可以遇到的问题,就是上面红字标明的问题。那么,我们怎么来检查电脑上的设置是否可以正常工作呢?

nslookup
这条指令可以查询域名的解释过程是否正常。例如:

nslookup www.facebook.com
Server:     192.168.199.1
Address:    192.168.199.1#53

Non-authoritative answer:
www.facebook.com    canonical name = star-mini.c10r.facebook.com.
Name:   star-mini.c10r.facebook.com
Address: 31.13.95.36

首先,这里我们可以检查 Server 是否你的路由器IP,如果不是,就自己检查哪里的设置错了。
然后,我们可以看看 www.facebook.com  里面是否包含了 star-mini 这个 cname 的内容,这个是最容易判断域名解释是否被投毒的情况。被投毒的域名是不会出现这个内容的。
ipconfig 
用这条指令检查你的IP设置中,网关是否指向路由的IP,如果不是,则自己检查和改回来。 用telnet 来检查你的ss-server 是否可以连接得上。 

好了,大概就这几招了。按照这种方法,几乎没有见过 gfwlist 翻墙不顺利的,除非你连ss-server 的端口、密码、加密方式这些都填错。