改进版的翻墙PAC文件

最近用了很多翻墙的pac文件,从最开始的gfwlistFloar_pac,再到用了一段时间的被clowwindy优化过时间复杂度为o(1)的gfwlist2pac

这些pac文件里面效率最高,Performance最好的当属gfwlist2pac了,但是也有问题就是黑名单更新不够及时,有些国外网站走代理可能会更快些,这时候我就需要手动去修改这个pac文件里面的list来达到我的目的。

cover-image
Flora_pac呢,可以自动根据IP的归属地来判断,如果不是国内ip段则走翻墙代理,否则直连,这个看起来是比较符合我预期的,但是也有几个问题:

  • 性能不够好,国内iplist还是比较长,查找需要耗时
  • 有的网站,虽然IP在国外,但是直连的速度要比走代理的速度快
  • 在公司内部本身访问网络就需要设内部代理的情况下不太好用

事已至此,那我就着手稍微改善一下吧,改进其实挺简单,只有以下这么几个点:

  • 以Floar_pac为Base,整合gfwlist2pac的function,以O(1)的时间查找黑名单和白名单
  • 改进一下Floar_pac的iplist查找算法,在二分查找的基础上增加分组,减少查找时的比较次数
  • 增加对内网代理的支持
  • 增加了对pac文件的压缩,引入jsmin
  • 原始的Flora_pac会对采集到的iplist做近似处理,它只处理读到的iplist中前两段,我把这部分拿掉了,力求准确。
  • 细化一下pac文件中host判断的顺序,现在生成的pac文件中查找代理的顺序大概是这个样子:

是否是PlanHost或者localhost->是否以cn结尾->是否在safeDomains->是否在dangerDomains->是否为内网网址->是否访问safePorts->是否为dns污染过的fakeIP->是否为国内ip段。

其中判断safeDomains和dangerDomains用的是gfwlist2pac的方法,按照clowwindy的说法,应该是O(1)的复杂度。 我把判断IP是否为fakeIP以及是否归属于国内IP段的查找放在了最后,因为这是整个pac文件最耗时的部分,如果要访问的网址在白名单safeDomain或者在黑名单dangerDomain中,直接在前面就返回了,不会去做DNS解析,也不会进入的复杂的查找部分。

这样整个优化后的文件就比较符合我个人的需求了,performance也算有了一个折中,通过黑名单和白名单的方式来提高Performance,最后的iplist查找作为保底,使用过程中速度还算有了一个提高,并且对国外网站的访问也算有了加速的效果。算是一种折中方案。

整个项目Fork自Flora_pac, 地址戳这里

用法也很简单,有两种方式:

  • 直接用我生成好的flora_pac.pac文件, 修改其中的out_gfw_proxy为你自己的地址,iproxy为内网代理,如果没有则保持DIRECT

  • clone整个项目,修改脚本test_build.sh中的代理为自己的。如果需要设定内网代理,则添加-i参数。然后运行这个脚本就会去拿最新的cniplist然后生成你自己的pac文件了。

  • 由于我使用了jsmin这个库来压缩pac文件,减小体积,运行时如果提示缺少这个东东,自己pip install jsmin一下。flora_pac_min.pac为压缩后的pac文件,内容和flora_pac.pac一样,就是不太好修改,可以放在移动设备上,怎么用任你选择。

在此还是要感谢gfwlist2pac和Floar_pac给我带来的方便。