前言


将goagent安装进路由器,想要实现的效果是,任何连接路由器的客户端,只需要填入路由器上的PAC文件的地址,即可实现透明代理。

总得来说,步骤全部集中在python环境的安装上,因为goagent本身就是一个ini配置文件和py源码而已。其次是一些准备工作,例如安装samba方便上传等等。

安装python环境


环境安装可以参考goagent官方项目主页上关于OpenWrt的wiki页面。GoAgent_OpenWRT

正常情况下需要三个包,python、pyopenssl、python-openssl。其中python包较大,多数路由器的rom空间都不符合标准,所以需要用usb来扩展空间。如果路由器没有usb接口,那么就比较遗憾了。

三个包安装完成后,表示我们的路由器已经具备了python的执行环境。继续下一步,上传源码。上传源码采用的方式是samba共享整个根目录。目的是实现那种硬盘分区间复制粘贴传送文件的效果。

安装samba


安装luci-app-samba包,并按照下图设置。

还没完事,此时samba还没有运行。我们可以在luci的启动项页面将samba设置为启动项并重启。也可以通过shell指令”/etc/init.d/samba enable”将其设置为启动项。

接下来在电脑上的网上邻居就可以看到共享的硬盘分区了,但是继续操作就会发现只有读取和运行权限。因为我们需要上传goagent源码,所以要建立一个文件夹并对其授予权限。”mkdir /goagent””chmod -R 777 /goagent”。

最后,复制goagent的proxy.ini、proxy.py、proxy.pac、CA.crt四个文件到目录即可。“python /goagent/proxy.py”运行goagent。可见下图。

在luci的启动项页面中可以设置启动脚本,脚本中加入”python /goagent/proxy.py >/dev/null 2>&1 &”可以设置开机启动goagent。

goagent崩溃及其解决方法


通常情况下,到上一小节为止,是goagent的标准安装方式。但是由于官方libopenssl对于安全线程的支持问题,某些路由器会出现“Assertion `md_c[1] == md_count[1]’ failed”这样的错误提示并崩溃。

解决方式有两个,第一个是安装libopenssl_1.0.1c-1_ar71xx.ipk,修复bug。另一个是安装gevent,“Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效”,这是百度出来的定义…。论坛上的结论是gevent这个框架能够提升goagent的执行效率,降低系统占用。

经过实测,gevent下goagent的负载确实要低了些。OpenWrt的官方源中没有greenlet和gevent这两个包,需要自己上网搜索。我用的是”python-greenlet_0.4.0-1_ar71xx.ipk”和”gevent_1.0rc2-1_ar71xx.ipk”。

安装完后运行goagent,可在goagent version一行中看到gevent及其版本号,这表明gevent安装成功。见下图。

经过测试,goagent十分稳定。特别设定为http模式时,youtube的缓冲速度飞快,可以招架720P视频了。

另外我们可以建立软链接,将pac文件链接到”/www”目录下,”ln -s /goagent/proxy.pac /www”,这样,只要在浏览器中指定PAC文件地址为”http://路由器地址/proxy.pac”即可实现透明代理。为何要建立软链接而不是直接复制?因为goagent会自动更新PAC文件,软链接会把对源文件的更改映射到任意链接处。

ios设备设置示例


在“http代理”处选择“自动”,输入”http://路由器地址/proxy.pac”即可。(我路由的地址为192.168.44.13)

另外,在“goagent 3.1.4 正式版”中还存在一些bug,例如ios设备上youtube,会默认加载flash播放器,并无法指定html5播放器。这个问题已经在官方项目主页的issue上被人反映了几次,等待官方解决。

参考


OpenWrt安装goagent实例教程

水星 MW4530R OpenWrt 安装 GoAgent, 利用Gevent实现GoAgent稳定运行