Fiddling with Shadowsocks for Multiple Users

Fiddling with Shadowsocks for Multiple Users

多用户Shadowsocks折腾实录
  • 多用户shadowsocks基本原理
  • python通过PyCharm远程调试
  • php问题,mysql int 字段到php中变成string
  • shadowsocks服务商
  • Tips & Tricks

本文将解释多用户Shadowsocks的工作原理,用到的开源项目 shadowsocks-py-mu ss-panel 具体的教程开源项目github都有,不用说,我来说说碰到的问题,以及经过。

本来我是不用了解多用户Shadowsocks的工作原理,谁知道偏偏让我赶上个问题,这个问题不是所有人都能遇到的,迫不得已才。。。

我遇到的问题是ss-panel搭建配置完成,python servers.py运行shadowsocks-py-mu 没有出现预想的 Add Server ... Port ...成功的信息。我就在我本地装了一份,用来调试问题,猜想应该问题不大,教程还不到一年,项目更新非常频繁。

  1. ss-panel
    1. Api
  2. shadowsocks-py-mu
    1. Manager
    2. Transfer

大概原理是

ss-panel

ss-panel 是个php的管理网站,主要功能是管理fq用户,和管理一个或多个服务器上运行的多个shadowsocks(多用户)客户端(每个客户端称为节点Node),跟shadowsocks-py-mu客户端通信用的是RestApi。

shadowsocks-py-mu

shadowsocks-py-mu 的大概原理是从ss-panel管理中心获取自己分配在自己节点的用户,每个用户开一个端口,指定一个密码。具体的shadowsocks-py-mu实现,开始运行时,会启动一个Manager和一个Transfer

Transfer

Transfer负责从ss-panel管理中心的接口获取自己的节点的数据,然后将处理过的数据发送给已经在运行的Manager,通过TCP。并获取Manager返回的数据,部分数据需要上传到ss-panel,比如当前节点负载,在线人数等状态信息,需要上传到ss-panel管理中心,方便管理员和用户查看。

Manager

Manager的任务当然是监听一个端口,获取发来的数据,通过发来的数据做这么几件事,新用户Add,用数据中的端口,密码,开启一个shadowsocks实例;用户到期或被禁用,Del指定shadowsocks实例;修改实例;查询实例状态,当前是否有连接,数据流量大小。并返回给Transfer。

基本原理大概就是这样,再具体细节,我也不清楚。

我遇到了问题,看了半天,调试了半天,我大概知道了,哪个部分代码大概是干什么的。

折腾过程,Clone下来,Mac上运行不起来,因为查询负载吧,/proc/loadavg,我也不懂,让我喜出望外,年前置办的升腾瘦客户机C30,终于派上正式用场了,AMD G-T40N Dual 1.0GHz 4G RAM 8G SSD电子盘 300多。买它的就是觉得手边应该有台能用的Linux,虚拟机不够正式。非常棒,Ubuntu mini 7x24,之前就是用它来敲两句Linux命令,因为Mac不够Linux。上图。

C30

下边就开始讲

python通过PyCharm远程调试

PyCharm官方文档 remote-debugging
火急火燎的时候喜欢看百度,平心静气的时候喜欢上谷歌,百度上搜出的大多是Python Debug Server。 百度的教程里边容易引起歧义的地方是那个地址该填谁的,是运行机的ip还是PyCharm的ip,谁是Debug Server,答案是PyCharm的ip,PyCharm是Debug Server。直接上配置截图反而明了。

Debug Server

C30 配置界面很清楚,运行这个debug配置来开启DebugServer. 后边需要结合教程,只需配置local host name 和 port。local host name,本机ip,(127.0.0.1估计不行,需要"外网IP",或0000)。 然后是安装egg.

$easy_install pycharm-debug.egg

或者

import sys  
sys.path.append("path-to-egg/pycharm-debug.egg")  

或者 解压egg,放入调试项目目录

官网上的PYTHONPATH真没测试成功。

复制Configurations里边的两行代码放入要调试的代码中,远程的要放,本地的可以不放,加两行空格保吃两边代码行数对应一致。好像只要放一次代码,运行过一次,项目中所有源文件文件的代码都可以调试。这边点debug,PyCharm底部显示等待连接,到远程终端运行python servers.py,第一次弹出要求mapping本地代码与远程代码,但是有个自动的,立马映射完毕,开始卡住,OK了。

Remote Interpreter

官网上首先提到的是远程解释器的方法,这个才是最简单的,而且非常方便。

PyCharm官方文档 configuring-remote-python-interpreters

添加远程python解释器. add-remote-interpreters 添加运行/调试配置 remote-interpreters-run-config

调试到最后发现应该是Api返回字段本应该是int 1,返回的确是string 1,导致客户端判断==1永远是false,导致添加shadowsocks实例的代码没有运行,So...,最后是ss-panel的php问题,php-mysql驱动导致,mysql的int字段返回的全部是string,找出这个问题,又是一番周折。

找出Mysql TinyInt类型字段到PHP里变成String的原因。

做了好久php都没遇到过这个问题。本以为是个小疏忽。但是,在shadowsocks-py-mu作者提示下发现,可能不是个小东西,Mac是跑了一遍ss-panel什么问题没有,Int还是Int。Ubuntu上再跑,结果问题又出现了,Mac跟Ubuntu都使用的Mac的Mysql5.5,肯定不是数据库的问题,Google了一会儿,才找到问题了,问题不好用英语描述,mysql-integer-field-is-returned-as-string-in-php。php-mysql驱动换成php-mysqlnd就没有这个问题,所以说有的人可能碰不到这个问题。 how-to-enable-mysqlnd-for-php how-to-know-if-mysqlnd-is-the-active-driver ,好了。

问题详情看github Issues。

shadowsocks服务商

ss.cicadabear.cc 好了,集成好了,参观一下吧,估计没法提供多少人的服务,vps性能不行。

Tips & Tricks

中间还遇到了几个小问题。

chmod

chmod -R +w storage/
chmod -R +w storage 不要随便加斜线,加斜线就成了把指定文件夹里的所有文件修改权限,而不是这个文件夹的权限不变,意味着,如果web服务器想要创建一个缓存文件,运行时文件是无法创建的。

proxy

比如我的Ubuntu在局域网中,我在Ubuntu上添加了一个VirtualHost,host文件把自定义的host添加一行,但是我的小Ubuntu没有桌面,如何去访问。而且我的Ubuntu上还有其他的VirtualHost,我不能直接用ip访问。答案就是在Ubuntu上建一个代理服务器,本地浏览器连接到代理服务器,此时输入127.0.0.1打开的是Ubuntu的主机页面,最方便的方式是ssh -D 9000 user@host,使用ssh代理,及其简单。

还有,如果代理,火狐使用foxyproxy代理插件也可以,只是,有一个缺陷。比如我就遇到了ss-panel登录不上,返回只显示500错误,但是Firebug里边的Network,在你点击了登录以后,不显示请求抓包数据,可能是因为代理原因,导致非常不爽,我打开了服务端php框架的debug,但我没法直接看到返回信息,这时候我又不能再使用Fildder或者Charles。但是Chrome没事,依然可以看到请求抓包,所以很容易发现了,我使用chmod不当造成的permission denied错误。

还有命令行程序如何轻松使用代理,比如git clone github太慢,比如我想调试一下“python servers.py“运行的时候,是否真的进行了数据请求,数据是否正常。超级简便的解决方案。使用proxychains。 配置文件 ~/.proxychains/proxychains.conf

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4     127.0.0.1 9050
#http   192.168.31.32 8888
socks5  127.0.0.1 1080  

~/.bash_profile

alias gfw='proxychains'  
alias sudogfw='sudo proxychains'  

使用

$ gfw git clone https://github....#将自动使用shadowsocks代理下载

将配置文件改成

[ProxyList]
http   192.168.31.32 8888  
$ gfw python servers.py #Ubuntu上运行的servers.py将使用我Mac的Charles代理,So,我可以清楚地看到servers.py当前进行的所有请求是否正常。
Top

$top 按内存使用排序,top 按 shift+f,可以自由选择按什么排序。

内存使用问题待解决

还有没有解决的问题,上图。

显示内存一点都没有了。Mem 0% free,Swap 0% free。 remote-interpreters-run-config 管理界面显示还有不少内存,使用量也还在涨。 remote-interpreters-run-config

好了,大概总结了一下。

其实原本打算的是弄openvpn的解决方案,因为openvpn在客户端在ios上比较棒,而且可以发挥出出国网络的最大速度,电脑连上openvpn打开Google,Youtube都是秒开。

缺点就是,Openvpn是是一种底层协议的vpn,应用层以下,vpn也有应用层的,开启之后系统会增加一个虚拟网卡,由服务器分配一个虚拟局域网IP地址,目前我的技术就是打开openvpn,所有网络都是从国外绕一下再回来,百度也是,应该是可以用高级自定义iptables解决的。再好一点就是,家里的Ubuntu上打开openvpn,再装个代理软件,配合Chrome的proxyswitcher插件。翻的时候打开插件,不翻的时候关闭插件,或者不翻用Firefox。

我具体也不知道深圳公交车上的WIFI网速限制还是对指定的网址限制网速,优酷客户端是可以打开,可以搜,但是播放没门,但是只要打开openvpn用我那大约300KB/s的网速看标清是没有问题,不知道流量监控的原理,不知道为什么openvpn能绕出去,不知道仅仅用个Http/Sock代理能不能绕出去。搬瓦工的vps-CentOS6支持KiwiM管理页面一键安装openvpn,而且下载证书,什么都及其方便,搬瓦工上还有shadowsocks的一键安装,也是非常方便,就是密码自动生成,不能通过web修改。

再普及一下openvpn跟Openvpn-Access的区别,如果Google搜相关的教程,会发现大量的是Openvpn-Access提供的,误以为Openvpn-Access就是vpn的官网,而且他的网址还是openvpn.net,说不是官网都不信,其实可能不是,openvpn是一种协议可能没有官网,也可能创造openvpn的和Openvpn-Access是同一家公司,没仔细看过。但是他们不同,很大,difference-between-openvpn-access-server-and-just-openvpn,openvpn是一种协议,可以用任何语言实现,Openvpn-Access是一个服务商,他的产品就是Openvpn-Access,免费版最多两个用户,记住这两个分别是什么,资料就不要看“官网”Openvpn-Access的部分了,OK了。

鼓捣openvpn多用户版失败的历程

另外一家openvpn开源软件提供商pritunlgithub,支持多用户,后台及其美观漂亮,而且功能十分强大,免费版就已经支持多用户多节点,付费版好像多了分析统计数据功能,小老百姓用不到。但是对于CentOS的支持,仅支持7。对Ubuntu各个版本都支持。 我为了用上pritunl,把现在的系统快照备份,数据库备份后,换成了CentOS7,然后基本的配置,把我的个人博客搭起来。装上了pritunl,但是内存显示都超过512了,我把pritunl关掉,内存还是居高不下,我误以为是CentOS7对服务器要求高造成的,所以又换成了Ubuntu,又折腾了半天,博客搭起来,内存就已经红了,结果。CentOS6上运行的好好的,博客搭起来,内存不过占用一半。top后发现,是Mysql造成的。以前用的是Mysql5.5,什么事没有,这次换了高一点的,Mysql5.6自己占用内存70%,Google上也有解决办法但不是很好,都是把mysql.ini里边的各种配置,调低一半,但是仍然效果不大,相关教程how-to-fix-mysql-high-memory-usage,发现所有的教程都是关于5.6,5.7的,好吧,果断换回5.5。但是整体搭建下来,还是失败的。内存512,Web控制台显示用了450,但是pritunl开启节点的时候报错,pyton日志显示,打开资源失败,文件夹权限是没有问题的,因为我先装的pritunl测试成功了,又装上了博客,都打开就不行了,没办法,都把人折腾郁闷了,快照恢复回我的CentOS6。只能暂时放弃了。

放弃了pritunl,还不算,我又找了个开源的,小的,简单的,简陋的。就是下边。但是还是不稳定,现在,我把openvpn全部卸载干净,又用Web的一键,安装还是不稳定。

还有一个开源的比较简单的,能大概看懂源码的openvpn-Admin项目OpenVPN-Admin,但是我的实验结果是非常不稳定,我不知道什么原因造成的,log没有任何不正常,而且我觉得跨度有点大,不是一下就能看懂的,所以又删了,计上心头,回头再看。

我的openvpn最近一直不稳定,WIFI和4G都是,4G还好点,总之都是非常不稳定。

------------------2017.03.18----------------------
上边提到的loadaverage负载平均值问题得到解决,不是解决,是弄懂了.
understanding-the-load-average-on-linux-and-other-unix-like-systems
这是uptime CPU的负载,进而关联出IO负载。
iostat


Related Article