Ubuntu下Shadowsocks服务器搭建与各平台客户端的使用。

0x00 Wiki for Shadowsocks

关于服务端的搭建与客户端的选择,你都可以在 Github 上的 Shadowsocks Wiki 找到相关的内容。这里基本有你想要的一切。

0x01 Setup Shadowsocks on Server

apt-get install python-gevent python-pip

接下来用 pip 安装 Shadowsocks

pip install shadowsocks

安装完成后有两种方式启动 Shadowsocks 的服务,一种是在命令行中指定参数运行,另一种是将配置信息写在文件中,运行时读取配置文件。

以后一种为例,在/etc/下建立文件 shadowsocks.json,并写入以下内容

{
    "server":"0.0.0.0",
    "port_password":{
        "1111":"password1",
        "2222":"password2"
    },
    "timeout":300,
    "method":"aes-256-cfb"
}

这里 port_password 下面可以包含多个端口和密码的组合,方便开启多个端口进行分享。配置好端口和密码之后然后在命令行运行ssserver -c /etc/shadowsocks/config.json -d start即可,关于参数的具体含义可以使用 ssserver – h 查看。-d的作用是在后台运行。如果想要调试或者查看信息可以直接运行

ssserver -c /etc/shadowsocks/config.json

之后可以在终端中看到链接情况。

0x02 Enjoy

Windows

在 Wiki 的 Ports and Clients 中,可以看到在不同的平台下的客户端支持情况。以Windows 为例,下载并运行运行 Shadowsocks.exe 后,在我的电脑上报错提示端口冲突,可能是默认的1080端口被占用导致的,只需在服务器的设置中指派一个空闲代理端口(如1099)即可。

在软件的右键菜单中,有给局域网共享代理的选项,开启此选项后可以给同局域网的其他主机共享连接,从而无须重复运行多个客户端。比如当你使用 VMWare 运行虚拟机时,不需要考虑虚拟机操作系统,可以直接使用主机提供的代理,仅需在配置时正确填写即可。

配置好后,可以安装 Chrome 的扩展 SwitchySharp,进行简单配置如下:

情景模式中选择手动配置,socks v5 代理地址填127.0.0.1 或 运行客户端的主机 ip (如192.168.5.1),端口填写刚才设置的代理端口,如未修改默认为1080。

切换规则中勾选在线规则列表和 AutoProxy 兼容列表,规则列表 URL 可以使用这个地址

http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt

同时在最右侧的情景模式选择刚刚填写好的配置。

按照如上设置,梯子应该可以使用了。在 Chrome 工具栏里点 SwitchySharp 图标并选择自动切换模式,访问 Google 测试一下,应该可以无障碍浏览了。

OS X

Mac下面的客户端可以有多个选择,最直接的可以使用 ShadowsocksX 项目提供的客户端,迫于官方的压力,原作者 @clowwindy 已宣布停止维护,最后版本的客户端可以在 Github 上面下载到。只需要简单的配置服务器、端口、加密方式和密码就可以直接使用了。

OS X 的客户端提供了 PAC 代理和全局代理两种方式,常见的墙外网站已经包含在了 PAC 当中,如果需要自定添加地址到代理列表里,可以编辑用户自定规则。格式的话参考 gfwllist 文件即可,具体的语法规则参考 https://adblockplus.org/filters 上面的说明。我简单举几个例子供大家参考,以便快速添加自定规则。

plugins.jetbrains.com
106.185.1.1
https://www.gerritcodereview.com
*.stackoverflow.com

当然,匹配规则支持正则表达式,不过由于性能原因,应该尽可能少地在 PAC 中使用正则表达式。语法规则应该是使用 Perl 的格式,即 /pattern/ 类型的正则表达式,下面是一个例子,用来匹配 https://edge*.digicert.com (*代表任意数字)的结果

/https:\/\/edge[0-9]+\.digicert\.com/

目前依旧在积极开发的还有 shadowsocks-libev 这个项目,配置文件的方法和服务端类似,给一个例子做参考吧。

{
    "local_address":"0.0.0.0",
    "server":"1.2.3.4",
    "server_port":443,
    "local_port":10010,
    "password":"yourpassword",
    "timeout":300,
    "method":"aes-256-cfb"
}

iOS

iOS 平台可以直接在 App Store 中搜索 ShadowSocks 下载,不过 Shadowsocks 在手机上的应用价值不如 VPN 提供全局代理方便,所以感兴趣的自己下一个玩就好了。

iOS 9 开始,Apple 提供了新的公共 API,预计 iOS 上会涌现出不少类似的应用,不妨关注一下。

[trouble shooting] 搭建L2TP VPN报错:errno 111, origin ICMP type 3 code 3 (not authenticated)

之前使用Digital Ocean的VPS的时候VPN使用PPTP搭建的,用了一天vpn就不能用了。
当时没有仔细分析原因是什么,但是隐隐感觉没有加密的连接总是让心里不舒服。
于是在前一段时间的某天查了一下L2TP+IPSEC方式的VPN如何搭建。

相关的教程有不少,我就挑了一个看起来舒服下面回复也没有问题的(比如这篇)一步一步搭了起来。
环境配置的过程中基本上没有遇到什么大问题。一路走下来还是蛮顺利的。
最后用iPad连的时候却始终无法连接。查看了一下VPS上的auth.log日志,发现每次连接失败最后的日志都停留在这条状态上
Sep 20 00:28:14 localhost pluto[2508]: ERROR: asynchronous network error report on eth0 (sport=4500) for message to 110.185.15.166 port 42116, complainant 110.185.15.166: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]

以errno 111, origin ICMP type 3 code 3 (not authenticated)做关键字,可以看到这个错误有很多人都遇到了,百度的第一条返回结果是12年的时候有人在猪八戒悬赏500块解决这个问题。
下面也有一些Blog给出了相同的解决方案,openswan的版本问题,新版本有bug,需要安装旧版本。
我现在系统安装的openswan版本是2.6.38-1,应该是最新的版本。上文中提到的解决方案是装回2.6.32版本,心里对这个解决方案不是很相信,因为一个版本如果有如此严重的问题应该很快会在新版本中fix掉,不会让我这么轻易地遇见,但是走投无路还是卸载掉了当前的版本装回了2.6.32。各种服务重启了一道之后问题依旧。于是只好装回2.6.38,继续寻找其他的解决方案。

经过了一段时间的寻找,看到ubuntuforums上有一篇相同问题的帖子标题上打了一个大大的SOLVED,很开心的点了进去,从1楼往下看,看了5分钟还是楼主一个人绝望的呼喊,他觉得很无助,为什么没有人帮他解决之类的。终于在我认为这是因为找不到答案才被标上SOLVED的时候,#8的回复出现了

Good day @robert-woodward
I solved my problem a few minutes ago,
thanks to this post https://lists.openswan.org/pipermail…ly/022546.html
Especially to this part of message:
“I also make it my habit to make leftprotoport 17/%any instead of 17/1701”

After i changed leftprotoport from 17/1701 to 17/%any in ipsec.conf and restarted ipsec service – everything got back to normal and vpn started working properly.
I hope this would solve your issue too.

其中加黑的部分是他重点提到的,问题出现的原因不详,但是抱着先解决问题后学习的心态直接按照说的修改了配置文件,ipsec重启之后,大大的VPN出现在了状态栏中。Problem Solved

DPZXSY3@ZS1$2KNA@LJ_QWV
上一张VPN的截图吧,IPsec正常工作了,刚才想到GFW能不能墙掉L2TP+IPSEC的VPN连接时看到了V2EX上这篇文章的讨论
于是赶紧瞅了一眼自己的链接IPSEC是不是正常工作了,看到IPsec: AES 256之后,大大的松了一口气。可以先告一段落睡觉了。
VPN实测速度只有几十K,而且在访问部分网站的时候完全没响应,明天晚上再来解决可能存在的问题,尽可能最大化的利用这条线的速度。

希望这篇没有原创性的文章可以帮到遇到了同样问题的朋友。

PS 不知道上图中的那个不小心点的红点会不会逼死一个强迫症。

PHP调用Python模拟微信浏览器查询面试信息

投了大鹅厂的QA,没有等到笔试的通知,周六的下午回学校进行了人生中第一次霸笔,虽然心情比较忐忑但最终还是顺利的得到笔试机会。鹅厂的软开题感觉难度在BAT中算是最低的,同考场的很多人都没有到两个小时就交卷走人了。我也在差不多还是10几分钟结束的时候交卷。感觉答得还可以。鹅厂的校招网站上写16号开始面试,于是15号那天下午到晚上隔一会就要打开微信查一下状态,可惜一直没有结果。

从微信中用Safari打开查询页面的时候提示“请从微信访问”,猜测页面对User-Agent做了判断,需要模拟POST的方式将自定义的查询信息传过去。正好手上在做短信接口的时候有实现的代码,想写一个简单的查询接口。Burp抓了一下包,结果如图:
goosefactory-burp
看来微信浏览器访问的UA信息是Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B554a MicroMessenger/5.4.1 NetType/WIFI

正常来说按照Header里面的内容传参数就可以了,可是用了两种方式在PHP上都没能成功实现,第二天还要去面试没法继续debug下去了,就让小哥写了一段Python把整个包重发一遍先用,回头再来改我的代码。
PHP下调用外部程序可以通过 exec() , system() passthru() 来实现,具体的区别可以点进去看manual,开始调用的时候设错了python文件的权限,exec()返回值一直是2。正常情况下返回值应该是0或1,2的情况google了一会也没有找到答案,于是建了一个python的hello做对比,同时将发包的python文件全注释了逐行调试,最后找到了问题所在。

然后写了一个查询的表单,在PHP上对参数做了简单的验证,试了一下没问题就睡觉了。睡前想把CSS弄得漂亮点,可以PC上和移动端一直没法弄到同样的效果,Bootstrap的学习还要继续深入,先保证iPad上的样式美观就好,功能第一。

如果今天鹅厂的强面顺利,回来就给这个接口加一个自动查询功能,状态有变之后短信通知查询的手机号。感觉用到redis会比较方便,不知道vps 1G的内存可不可以装,回来研究下。

链接在此 http://goosefactory.bydell.com

补张图
goosefactory-iPad