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

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 的整个流程是怎么样的。

  1. 我们在PC浏览器输入 google.com ,浏览器查询域名的IP
  2. 域名IP查询会优先从pc的 hosts 文件查询,所以,要确保你要访问的域名没有被你的hosts文件解析出来,这个是少数人遇到gfwlist 模式无法正常工作的常见原因之一
  3. 你的电脑会从你网络设定的DNS服务器查询域名的IP,如果你电脑上的网络设置 dns server不是指向这个路由,那么,整个功能是无法使用的,这也是大多数人遇到 gfwlist 无法工作的最常见原因之一
  4. 当你的电脑向路由查询 google.com IP 的时候,路由中的 dnsmasq 接收到这个查询指令,然后发现 google.com 在 r.gfwlist.conf 的列表中,并且列表指出这个域名需要通过 pdnsd 的端口查询,因此,dnsmasq会把域名查询转给 pdnsd ,让它来做解析。
  5. 我们的固件中,采用的是pdnsd 来把 udp 的域名请求转换为 tcp域名请求的,目前国内的网络环境,udp的域名请求被大量投毒,而tcp的几乎没有,所以,我们在pdnsd 设置了 opendns 和 google 的dns作为域名解析服务器,为了获得更加合理的域名解析,我们需要在固件UI里面设置 中设置 pdnsd 通过 SS代理访问,这样dns 服务器才能返回离你ss-server 最近的IP,而不是离你的PC 最近的IP,当然,你硬是要觉得pdnsd 直连才让你舒服,我也没有办法。
  6. 当 pdnsd 获得了 google.com 的解析后,会转交给dnsmasq ,dnsmasq 再次检查 r.gfwlist.conf,发现 google.com 还有一个ipset 的设置,于是,它会把这个域名的ip 放入到 ipset 的 gfwlist 列表中,然后把ip返回给你的电脑,以上1~6的步骤看起来好复杂,但整个处理时间大约为0.2秒左右。
  7. 当你的电脑获得了 google.com 的IP后,开始向你的电脑网络设置中的网关发出向google ip 的连接请求,如果你的网关设置不是指向这个路由,那么,这也是少数人遇到 gfwlist 不能工作的情况
  8. 当路由收到有发向google IP 的网络连接请求后,开始核对 ipset gfwlist 的ip列表,如果有符合的,直接重定向到 ss-redir 的透明代理端口。
  9. ss-redir 把数据进行加密,发给远端的 ss-server。
  10. ss-server解密数据包,发出连接请求,获得服务器的数据响应,加密,返回给路由的 ss-redir。
  11. ss-redir 解密,把数据返回给你的电脑,这样,整个连接就完成了。

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

  1. 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 的内容,这个是最容易判断域名解释是否被投毒的情况。被投毒的域名是不会出现这个内容的。

  2. ipconfig 
    用这条指令检查你的IP设置中,网关是否指向路由的IP,如果不是,则自己检查和改回来。
  3. 用telnet 来检查你的ss-server 是否可以连接得上。

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

つづく

Comments

This post currently has 17 responses

  • lz为什么不用dnsmasq配合ss-tunnel直接解析dns?这样连pdnsd都能省了。
    另外dnsmasq可以加一个ttl=1800或者3600的参数,强制dns缓存半小时或一小时。这样用户体验会明显快很多。

    lz可以参考一下我的pafavan-ssr一键安装包。

    • dnsmasq 配合 ss-tunnel 的模式,这是我们最早采用的方式,但由于部分SS服务商不支持 UDP relay,导致无法正常使用,而且部分地区对于udp数据进行了各种干扰,也会导致域名解析会出现各种问题,所以目前的模式是最优化的结果。dnsmasq 加太长的TTL,会导致部分DDNS 更新后,在这段时间内无法正常工作。这些我们都经历过了。

    • 这种模式确实不错,我目前就发现,公司的网络,似乎被ISP进行了国外UDP的干扰,导致即使进行了ss的udp relay也是极度不稳的,不过相同的配置,在家庭网络就很好了。

  • 用gfwlist模式的话,telegram无法链接!因为是固定的IP地址,需要手动到路由设置ipset~
    请问配置dnsmasq部分的脚本在哪里?我希望修改一下添加telegram的IP段进去!这样就不需要我额外再做脚本运行了!谢谢!

  • 博主,我想在我的ddwrt上实现这个功能,流程也大概了解了,但是根据gfwlist生成dnsmasq的配置文件是怎么实现的方便说一下吗,用的是脚本吗?

  • ss-redir + gfwlist方案确实简单好用,但是缺少处理规则,有的时候就觉的差那么临门一脚

    比如说尽管google、twitter被墙,但是还有部分可用iP,直接维护一下dnsmasq的host就能直连访问,这时候就不需要再经过gfwlist-->ss 的处理过程
    但现在的ss-redir + gfwlist方案显然不能照顾到这种情况,默认所有在gfwlist匹配的,都走了ss,速度上就大打折扣

    tc 都是分3个模块(qdisc+ class+ filter)来处理的,我觉的有必要借鉴一下,
    host、gfwlist可以视为过滤器
    ss可以视为分类器
    再加一个 规则处理 就完美多了

  • 请问 老毛子固件的 /etc/dnsmasq.conf 如何进行修改
    想修改成可以给外网访问的dns服务 但是这个文件修改之后重启实效,使用保存到闪存按钮和脚本保存后都无效

  • 上面写的透明代理端口1090,我想用谷歌插件进行透明代理。
    我在外网端口转发到内网的ss客户端主机可以,转到路由器的SS 1090端口就不行。
    怎么连接?http透明代理怎么连接?
    路由爬墙的话,不想再开电脑了。
    感谢!

  • 现在有个非常奇怪的问题 我在K2路由器上使用Hibay的最新版固件 会出现gfwlist用不了的情况 但走chnroute是正常的 Adbyby也是只能走全部链接 个人怀疑是ipset出现了问题 希望高手们能解答一下

  • 您好。
    每次我重启ss都要重新下载chnroute,然而恩山的帖子已经指出不会每次重启都要更新,而且速度很慢。
    请问如何做到不需每次重启都更新,或者更换更快的源?

  • 最近发现一个问题,就是开白名单模式
    如果碰到国外的ip地址,不是域名,纯ip地址
    流量依然可能不走ss
    把0.0.0.0添加到规则里依然不行
    这可能会影响外服的游戏
    希望能够得到解答

发表评论

Sidebar