[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