使用OCServ搭建兼容Cisco Anyconnect的科学上网服务

总有一些朋友拿着iOS设备来问咱:你知道苹果应该怎么翻/墙么?

对于已经越狱过的iOS设备来说,shadowsocks无疑是最好的选择,可惜越狱这东西并不是人人都会的,于是搭建一个能在iOS上稳定(至少能自动重连)运行的科学上网服务被千夏写进了备忘录

OpenConnet Server(ocserv)通过实现Cisco的AnyConnect协议,用DTLS作为主要的加密传输协议,相比于其他VPN协议,Anyconnect具有以下优点:

  • AnyConnect的VPN协议默认使用UDP DTLS作为数据传输,但如果有什么网络问题导致UDP传输出现问题,它会利用最初建立的TCP TLS通道作为备份通道,降低VPN断开的概率。
  • AnyConnect作为Cisco新一代的VPN解决方案,被用于许多大型企业,这些企业依赖它提供正常的商业运作,这些正常运作对应的经济效益(读作GDP),是我们最好的伙伴。
  • 相比于shadowsocks,OpenConnet的架设足够麻烦,也就是说,短期内Anyconnect是无法像shadowsocks一样“普及”的——理论上来说,如果你不是大型企业,你会用AnyConnect的概率无限趋近于零。
  • 支持自定义路由表,这个对于那些有同时使用国内平台需求的人会很有帮助的

好,那么我们现在就开始吧。

本文使用 Ubuntu 14.04 LTS和最新的OCServ 0.11.1作为标准环境,不完全保证在其他发行版上能够正常运行

编译OCserv

官方站点找到并下载最新的OpenConnect Server版本。

wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.11.1.tar.xz

解压缩并进入目录

tar xvf ocserv-0.11.1.tar.xz
cd ocserv-0.11.1

这时可以看一下README文件提及的编译依赖。

下面开始安装编译依赖

apt-get install libev-dev  build-essential pkg-config libgnutls28-dev libreadline-dev libseccomp-dev libwrap0-dev libnl-nf-3-dev liblz4-dev

编译环境测试

./configure

在千夏的编译测试报告中,以下项目为no,如果你发现其他项目显示no,不必担心,你的环境可能安装了可选的包导致出现不同结果。目前只有libgnutls28-dev和libev-dev是必须的模块。

CWrap testing: no
PAM auth backend: no
Radius auth backend: no
GSSAPI auth backend: no
systemd: no
LZ4 compression: no

Screenshot_2016-04-02-03-54-27~01

(在Ubuntu 14.04上,liblz4-dev缺了pkg-config文件,所以即便安装了liblz4-dev,LZ4支持仍显示no。LZ4支持是ocserv 0.10下的新功能,装不装对使用没大碍,如果需要,你得想办法手动安装LZ4。)

make
make install

配置OCserv

我们希望最终做到的,是无需用户名与密码的客户端证书验证登陆。但考虑到大部分用户并不能很快学会导入方法,于是本人在这里暂时不讲解证书验证的方法。

首先让我们把CA证书与服务器证书折腾好,具体步骤可以参考官方文档,千夏在这里使用了Let’s Encrypt提供的免费证书自动签发程序

sudo apt-get install letsencrypt

等待它安装完所需的依赖

申请证书

letsencrypt certonly

根据提示依次写入邮箱,要申请证书的域名(这个域名必须已经解析且指向到当前运行letsencrypt的服务器)

申请证书成功
申请证书成功

证书文件在 /etc/letsencrypt/live/[你申请的域名]/fullchain.pem

私钥文件在 /etc/letsencrypt/live/[你申请的域名]/privkey.pem

让我们继续配置ocserv的配置文件。同样的,参考官方文档是最佳选项,但为了方便起见,这是你需要注意的一些设置。回到ocserv-0.11.1的文件夹下,将配置文件复制到OCserv默认读取的位置。

mkdir /etc/ocserv
cp doc/sample.config /etc/ocserv/ocserv.conf

确保以下配置正确

# 登录方式,目前先用密码登录
auth = "plain[/etc/ocserv/ocpasswd]"

# 允许同时连接的客户端数量
max-clients = 6

# 限制同一客户端的并行登录数量
max-same-clients = 2

# 服务监听的IP(服务器IP,可不设置)
listen-host = 1.2.3.4

# 服务监听的TCP/UDP端口(选择你喜欢的数字)
tcp-port = 9000
udp-port = 9001

# 自动优化VPN的网络性能
try-mtu-discovery = true

# 确保服务器正确读取用户证书(后面会用到用户证书)
cert-user-oid = 2.5.4.3

# 服务器证书与密钥
server-cert = /etc/letsencrypt/live/[你申请的域名]/fullchain.pem
server-key = /etc/letsencrypt/live/[你申请的域名]/privkey.pem

# 客户端连上vpn后使用的dns
dns = 8.8.8.8
dns = 8.8.4.4

#分配给VPN客户端的IP段
ipv4-network = 10.12.0.0
ipv4-netmask = 255.255.255.0

# 注释掉所有的route,让服务器成为gateway 
#route = 192.168.1.0/255.255.255.0 

# 启用cisco客户端兼容性支持 
cisco-client-compat = true

创建一个登录用的用户名与密码。

ocpasswd -c /etc/ocserv/ocpasswd your-username

这样OCserv就基本配置好了。还有一些防火墙的配置,等白天再写吧(困qwq

———-2016年4月23日更新———-

配置防火墙
以Vultr的网络接口为例

iptables -t nat -A POSTROUTING -s 10.12.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 10.12.0.0/24 -j ACCEPT

 

打开IPv4的流量转发

vi /etc/sysctl.conf

 

找到net.ipv4.ip_forward这一项,将值改为 1

net.ipv4.ip_forward=1

 

使其生效

sysctl -p /etc/sysctl.conf

 

接下来,在服务器端启动OpenConnect Server。

ocserv -f -d 1

 

如果没有报错的话,在Ios或Android上安装cisco Anyconnect,然后加入新的VPN配置,在服务器地址栏目上填入对应的IP/Hostname和TCP端口(如 123.456.78.90:9000)

确定VPN连接正常并可以科学上网后,OCServ的配置就大功告成了,下面我们可以进行一些优化(待更新

参考资料:
折腾笔记:架设OpenConnect Server给iPhone提供更顺畅的网络生活

“使用OCServ搭建兼容Cisco Anyconnect的科学上网服务”的15个回复

  1. 谢谢˜同 Ubuntu 14.04 按照这篇文章搭建(当然啦细节方面和CA肯定不一样)成功˜
    iptables 一直不太懂怎么弄,之前在另一台 Debian 机上面反正是失败了……

    话说端口没改直接用443也可以么?因为此前也有一个WP站(不过一直没用= =),这样不会干扰吧?还是说,随便设一个端口都一样?

    1. 抱歉最近一直在忙别的事情,没有及时回复

      阁下如果有一个HTTPS服务(占用了443端口)的话OpenConnect是不能使用443的,如果是HTTP服务(只占用了80)的话是可以使用443的

      1. 谢谢回复(不过抱歉没有及时看到回复= =)ocserv倒是能用了,但是后来想给网站加一个SSL却总是会出现xml错误。现在看来,应该是因为443端口被OpenConnect占用了……

  2. 鄙人用的也是Vultr的KVM实例,但os选的是Ubuntu 16,按贵教程搭建后,可以连接但无下行,以鄙人愚见,或许是11.5新版ocserv(官网源码默认configure编译)的问题抑或OS太新(非教程所用版本)(先前按照教程在digitalocean上搭建运行正常,OS是deb8)恳请大侠指点,鄙人新手,只能比着葫芦画瓢,尚不具备举一反三的悟性

    1. 阁下您好,如果可以连接但是却无下行一般都是iptables没配置好或没有打开IPv4流量转发模块。
      建议先检查一下net.ipv4.ip_forward=1前面的注释是否去掉以及iptables是否启用

      1. ul14和ul16的iptable有没有区别,在下对此一窍不通,望指点

  3. 博主,请问“这个域名必须已经解析且指向到当前运行letsencrypt的服务器”是什么意思啊?应该怎么弄到?

  4. iptables不太会弄找了好多篇还是这篇写得最清楚…感觉现在好歹能理解一点了
    谢谢博主的说www
    不过说起来某长城貌似开始对anyconnect下手了。我这边丢包非常高..相对来说在同一台服务器上用strongswan搭的IKEv2+ipsec就要好很多,不知道是不是我这边ISP的原因呢…坐标四川联通

  5. 成功连上了anyconnect,但是连接受限是怎么回事呢?就是网络图标有黄叹号

  6. Pingback: 使用Ocserv 手动搭建 Cisco AnyConnect VPN服务端 – blog

发表评论

电子邮件地址不会被公开。 必填项已用*标注