距离2016年结束,还有5周的时间。过去的两周内,处理的事情有点多,工作把时间全部占满,新公司离住的地方更远了,导致IKEv2与shadowsocks的下篇都没写完,不过还是在零碎的时间里做了一点东西,记录下。

1.配置Let’s Encrypt证书

虽然很早就配置了StartSSL的HTTPS证书,不过在前段时间传出各个平台封杀沃通证书的事情,就已经打算抽时间换下证书,最后还是因为事情紧急时,匆忙配置了Let’s Encrypt证书。由于有配置过的经历,新证书的部署比想象中简单多了。

https://github.com/certbot/certbot

certbot提供了简单的命令行进行验证服务器和生成证书,我选择手动配置,只生成了证书。将项目clone下来,暂时关闭nginx,运行以下命令

1
./certbot-auto certonly --standalone -d wbuntu.com -d www.wbuntu.com

它会先检测运行环境,配置软件,然后验证服务器和域名,接着生成证书。证书都存放在/etc/letsencrypt目录下,其中archive目录存放所有证书,以命令行中的第一个域名作为为文件夹名,live也同样以域名作为文件夹,不过文件夹中的证书是一个软链接,指向archive目录中最新的证书。生成的pem文件有四种,分别如下:

  • cert.pem: 域名证书
  • chain.pem: Let’s Encrypt证书链,其实就是Let‘s Encrypt的根证书,经过DST Root CA X3的交叉签名,是一个中间证书
  • fullchain.pem: cer.pem与chain.pem的合并证书,这样对于一些不认Let’s Encrypt的客户端,可以直接查询证书链,完成对服务端的认证
  • privkey.pem: 证书私钥

然后修改nginx配置,将ssl_certificatessl_certificate_key分别指向fullchain.pemprivkey.pem的文件路径,重启nginx即可。相比StartSSL证书,Let’s Encrypt证书的生成简直痛快多了,无需太多繁琐的操作,此外在SSLTest中,证书等级部分也可以达到满分~每个证书有效期是3个月,只要弄个自动部署脚本,就可以放心使用了。

wbuntu.com的SSLTest报告:SSLTest结果

2.用net_speeder加速IKEv2 VPN

昨天的测试中,第一次感受到了UDP协议的强大了。具体来讲,IKEv2是一个混合协议,其中IKE负责协商、生成和管理密钥,而传输过程的流量控制、加密、验证依靠ESP。

先放上net_speeder地址:https://github.com/snooda/net-speeder

加速方式:filter_rule只对UDP加倍发包

1
./net_speeder venet0:0 "udp"

两个参数分别是网卡和协议,OpenVZ主机中IPv6地址和IPv4地址绑定的网卡不同,看自己的情况选择,kvm主机一般都是eth0。协议方面只选了UDP,直接填写“ip”的话,基本就把所有的数据包全翻倍了。

它的原理是双倍发包,在高延迟不稳定链路上优化单线程下载速度,对于不稳定的链路,正常情况下就容易丢包,如果加大发包数量,就有可能提高数据包的到达率,减少重传。

TCP协议自带拥塞控制,而shadowsocks基于TCP协议,但在网络糟糕的情况下,有时加大发包量也无法解决单线程下载速度缓慢的问题,因为丢包太严重,TCP的重传机制也影响了速度。

但UDP并没有这个问题,它的流量控制依靠上层协议的实现。目前流行的VPN方案都是基于UDP封装的IP VPN,IKEv2中通过ESP建立一个隧道,对于上层协议来说,它就是一个网卡,能够承载更底层的协议,只要隧道足够稳定,载荷中传输协议的速度就不会受到限制。因此加大UDP发包量,对IKEv2 VPN的速度有着明显的提升,下面是昨晚的测试情况。服务器位于日本,分别使用shadowsocks和IKEv2连接服务器,观看同一个视频,差距十分明显。

IKEv2

screen-shot-2016-11-26-at-7-22-11-pm

这个速度已经到了十分感人的程度,手机上使用IKEv2后,打开Instagram和Twitter的速度也飞起了,但推荐在Wi-Fi环境下使用,毕竟服务端双倍发包,目前还未测试过流量消耗,并且VPN的协议特征太明显了,端口固定为500或4500,很容易进行屏蔽,所以要低调,私人使用就好。

shadowsocks

screen-shot-2016-11-26-at-7-23-54-pm

shadowsocks已经加了混淆,还是扛不住不稳定的链路,单线程连接速度捉急,但对于下载操作,可以依靠提升线程数来获取速度,一般我都是用这招,先在VPS上下载好xcode,然后再传输到本地。对于shadowsocks来说,最好的加速方法,就是买一个能够直连不绕路的主机,不过符合这种条件的,一般都是VPS贵到让人不开心,或者运气爆棚,使用的运营商线路正好直连到主机。目前shadowsocks还是主流,轻量,灵活,对于一些路由监控和特定屏蔽的内容,也很容易绕开和访问,只是树大招风,安全性问题模糊,过度依赖代理主机(中国周边的VPS应该已经快被污染光了)。

不过还需要注意的是自己的当前网络环境,如果客户端与VPS间的通信状况良好,可能导致客户端能够接收到服务端的所有UDP包,这会造成一个问题,IKEv2在认证阶段建立连接后,又突然断开,因为重复接收到验证信息,直接导致验证失败。所以这种方法只适用于丢包严重的链路。

如果能够改造下strongswan或者shadowsocks,使用UDP承载数据,并且可以自定义加密、验证算法,传输端口,发包频率,既能承载底层数据包,也能够提供http或https之类的应用层代理的话,那就相当有意思了。

3. zmirror

这个不多说,先放上地址

https://github.com/aploium/zmirror

试了部署了一下谷歌和油土鳖的镜像,和用shadowsocks观看youtube视频的连接速率接近,如果配合CDN的话,可能会好一点,项目还未足够成熟,或者说,单纯的穿墙或代理功能,并不应该是它的核心。对于镜像站点里的其他站点地址,很容易遇到被屏蔽的,而配合shadowsocks使用时,不知为何总是跳到Linux Kernel的主页去。

4. macOS使用IKEv2

之前使用自签名的证书时,由于自己安装了根证书,没什么问题,但要给别人使用,就有点麻烦,需要一步步指导安装自己生成的根证书,后来直接用StartSSL证书,iPhone上倒是可以免去安装根证书了,而在macOS上,却一直连接不上。迁移到Let’s Encrypt证书后,IKEv2配置中服务器证书也用了同一份fullchain.pem,但macOS还是连接不上,提示no trusted RSA public key。其实安装下Let’s Encrypt的中间证书就好。

关于证书,在这个页面有详细说明:https://letsencrypt.org/certificates/

证书在这里下载:https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem

如果是使用strongswan进行连接,还需要这个证书:DST Root CA X3

问题可以在这个issue看到:https://wiki.strongswan.org/issues/1540

注意保存为pem时,记得首尾分别加上—–BEGIN CERTIFICATE—–与—–END CERTIFICATE—–,然后和lets-encrypt-x3-cross-signed.pem一起存放在ipsec.d目录下的cacerts目录中。

5. IPv6 VPN

这个标题实在很难想,因为内容是为连接到VPS的客户端分配一个内网IPv6地址,让它可以访问IPv6网站。原理和IPv4下的情况相同,客户端连接VPS后,会绑定一个内网地址,VPS做NAT转发时,重写源IP地址,只是现在是IPv6的情况。类似于6Box提供的服务,不过6Box是在国内,iPhone上使用它时,也是采用VPN的方式,给客户端分配内网IP地址,所以对于在国外的主机来说,这么搞好像没什么用处,只是多了一个可以访问IPv6网站的功能,而且如果是想访问国内的一些IPv6站点,如六维,速度也非常慢。

在OpenVZ主机上没有配置成功,因为ip6tables命令直接无法使用,更别说做IPv6下的NAT转发了,需要在KVM主机上使用,首先请确定VPS已经有一个IPv6地址了。在原有的ipsec.conf上直接做修改,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
conn ikev2-eap-mschapv2
        compress=yes
        forceencaps=yes
        fragmentation=yes
        keyexchange=ikev2
        leftauth=pubkey
        leftcert=fullchain.pem
        leftid=@www.fuckjs.com
        leftsendcert=always
        left=%defaultroute
        leftsubnet=::/0,0.0.0.0/0
        leftfirewall=yes
        rightauth=eap-mschapv2
        right=%any
        rightsourceip=2001:19f0:2271:987:2300::/112,10.0.0.0/24
        eap_identity=%any
        auto=add

如上所示,只修改了leftsubnet(添加了::0)与rightsourceip(添加了2001:19f0:2271:987:2300::/112,任意IPv6地址池,只要不与一些专用地址冲突即可),然后修改/etc/sysctl.conf,搜索net.ipv6.conf.all.forwarding = 1,去掉注释,执行sysctl -p,应用修改,然后执行ip6tables命令,与IPv4情况相同,分别开放500,4500端口,允许接收ESP包,允许转发来自内网地址池的数据包,并添加POSTROUTING规则。

1
2
3
4
5
ip6tables -t nat -A POSTROUTING -s 2001:19f0:2271:987:2300::/112 -j SNAT --to-source yourIPv6Address
ip6tables -A FORWARD -s 2001:19f0:2271:987:2300::/112 -j ACCEPT
ip6tables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
ip6tables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
ip6tables -A INPUT -p esp -j ACCEPT

重启ipsec服务,客户端连接后就会获取到一个内网IPv6地址和一个内网IPv4地址,尝试访问下ipv6.google.com也能连上,test-ipv6.com的测试也能通过,普通环境下的连接还是用ESP in UDP,如果是教育网下,有IPv6地址时,应该可以直接传输ESP包,前提是你的域名已经做了AAAA解析,并绑定好了一个IPv6地址。