Ubuntu系统下安装Cisco AnyConnect VPN

打算在公司IDC机房部署一套VPN环境,经过考虑,最终决定采用Cisco下的开源技术AnyConnect。AnyConnect的优势有:
1)长连接,待机不会断开;
2)速度快,稳定性好;
3)安全性好,全程加密;另外,支持freeradius认证功能;
4)能够下发路由表给客户端,这个功能是最激动人心的。因为如果长期连接,那么肯定是某些服务走VPN,而国内的网站可以走自己的网络体验最好。
5)耗电量较低;

AnyConnect是思科的安全远程接入解决方案,部署Anyconnect需要安装ocserv(OpenConnect server)
它是一个OpenConnect SSL协议服务端,0.3.0版后兼容使用AnyConnect SSL 协议的终端。
ocserv(OpenConnect Server)是由 GnuTLS 的作者 Nikos Mavrogiannopoulos 开发的一个能够兼容 Cisco Anyconnect 的开源服务端( SSL VPN),支持*nix/BSD 平台,最早是作为 OpenConnect(Linux下的兼容Cisco ASA的开源客户端)对应的服务端,在后续版本( 0.3.0 开始)中加入了对 Cisco Anyconnect 客户端的支持。
下面介绍在ubuntu系统下安装Anyconnect的操作记录:

安装过程如下(采用一键安装方式)
root@localhost:~# apt-get update && apt-get upgrade -y
root@localhost:~# apt-get install wget
root@localhost:~# wget http://git.io/p9r8 –no-check-certificate -O ocservauto.sh      

//下载地址:https://pan.baidu.com/s/1i59e2hB (提取密码:bp4w)

如果以前使用了该脚本进行安装,只需要输入下面命令更新(只更新相关脚本,服务器不会更新)

root@localhost:~# wget http://git.io/ocservauto -O- –no-check-certificate|bash

root@localhost:~# bash ocservauto.sh

接着会进行一段时间的安装,如果顺利的话,出现下面信息则说明安装成功了!

—————————————————————————————————————————————————————–如果安装失败可以查阅安装日志文件ocinstall.log,日志文件在脚本所在文件夹下,可以使用下面命令逐步阅读一般情况下安装成功之后,服务器就在启动状态了。

我的部署机器由于是虚拟机(没有外网ip),采用squid代理方式对外访问,导致脚本中定义的ftp方式对freeradius-client-1.1.7.tar.gz和ocserv-0.10.8.tar.xz安装包下载失败。解决办法:将上面这两个包单独下载下来,放在和ocservauto.sh脚本同一目录路径下,然后再重新执行脚本进行安装即可。——————————————————————————————————————————————————————

这里可以简单使用本地浏览器查看服务器信息,在本地浏览器输入 https://IP 或域名:(英文冒号)端口

ocserv的默认安装目录是/etc/ocserv,相关文件都在这个路径下,如配置文件ocserv.conf等

1
2
3
4
root@localhost:~# cd /etc/ocserv/
root@localhost:/etc/ocserv# ls
ca-cert.pem  config-per-group  dh.pem    ocserv.conf     ocserv-up.sh  server-cert.pem
CAforOC      defaults          ocpasswd  ocserv-down.sh  profile.xml   server-key.pem

ocserv服务在安装后默认就启动了,安装中选择证书登陆方式,即https方式,所以tcp端口选择的是443

1
2
3
4
5
6
7
8
root@localhost:~# ps -ef|grep ocserv
root       726     1  0 01:22 ?        00:00:00 ocserv-main
root       728   726  0 01:22 ?        00:00:00 ocserv-secm
root       865   849  0 01:26 pts/1    00:00:00 grep <code–<color=auto ocserv
root@localhost:~# lsof -i:443
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
ocserv-ma 726 root    4u  IPv4 10406026      0t0  TCP *:https (LISTEN)
ocserv-ma 726 root    5u  IPv6 10406027      0t0  TCP *:https (LISTEN)

ocserv服务启动命令:/etc/init.d/ocserv   start/stop/restart/status—————————————————————————————————————————————-ocserv服务启动过程中若是出现下面两个小报错:1)/usr/sbin/ocserv: error while loading shared libraries: libtspi.so.1: cannot open shared object file:No such file or directory解决办法:root@localhost:~# apt-get install libtspi-dev

2)/usr/sbin/ocserv: error while loading shared libraries: libgnutls.so.28: cannot open shared objectfile: No such file or directory解决办法:安装libgnutls下载地址:https://pan.baidu.com/s/1skJxpI9提取密码:ic3yroot@localhost:~# dpkg -i gnutls_3.3.8-13_amd64.debroot@localhost:~# find / -name libgnutls.so.28/usr/lib64/libgnutls.so.28root@localhost:~# ln -s /usr/lib64/libgnutls.so.28 /usr/lib/————————————————————————————————————————————–

可以在ocserv.conf文件里修改ocserv服务端口和域名等信息,修改后重启ocserv服务即可

1
2
root@localhost:~# /etc/init.d/ocserv restart
[ ok ] Restarting ocserv (via systemctl): ocserv.service.

———————————————————————————————————-Anyconnect客户端工具下载地址:https://pan.baidu.com/s/1eSvDvEi提取密码:ckdi———————————————————————————————————-

安装Anyconnect客户端工具,安装后,就可以使用上面安装ocserv过程中定义的信息连接了:

特别注意:由于安装过程中选择的是自签证书,是不受信任的证书,所以客户端连接时需要关掉设置中的“阻止不信任的服务器”,即下面截图中的第四项”Block connection to untrusted servers”不要勾选!不管采不采用证书验证,都不要勾选第四项!。然后勾选第三项(第二项勾选与否都不要紧)

点击“connect”,接着点击提示窗口中点击“Connect Anyway”,接着按照提示输入用户名和密码,正常连接就ok了。

连接成功后,点击右下角的Anyconnect标志图,图上有一把钥匙的状态就说明已经连上了。

—————————————————-用户管理即登陆验证方式————————————————-1)用户名和密码验证(客户端登陆时默认肯定会有的验证方式)

1
2
3
4
5
root@localhost:~# cat /etc/ocserv/ocserv.conf
........
auth = "plain[passwd=/etc/ocserv/ocpasswd]"            //默认用户名和密码验证
enable-auth = certificate                              //用户名和密码验证同时,允许证书验证
auth-timeout = 40

创建用户名和密码命令(或重置用户密码):

1
2
3
4
5
6
7
8
9
10
root@localhost:~# ocpasswd -c /etc/ocserv/ocpasswd guohuihui
Enter password:
Re-enter password:
root@localhost:~# ocpasswd -c /etc/ocserv/ocpasswd liumengnan
Enter password:
Re-enter password:
root@localhost:~# cat /etc/ocserv/ocpasswd
wangshibo:*:$5$.GQf1omiKmvGElhU$q1yNyUxPRAHygEGaG98cwVGfYuJjSarsTkXROinhBX8
guohuihui:*:$5$z.H5ipnHSJCSigFU$30mseKwk13ZG9MuD3QSeBtYmX6xLOcafVPpioXkulA2
liumengnan:*:$5$mVSHMbBekX9vofxV$n7bc8LkJB9kjXl6OADGWySfTqkIBeyIGJRvk5A/ehHC

2)证书验证除了用户名和密码验证之外,还可以进行证书验证。用户在AnyConnect客户端第一次登陆时会提示加载证书。首次登陆加载后,后面再登陆就不会提示加载证书了!所有用户的 p12 证书文件可以在放置脚本的目录下找到,导入证书时需要输入证书创建时设定的密码。新建用户证书命令:root@localhost:~# bash ocservauto.sh gc

用户证书创建后会保存到和脚本同一路径下:root@localhost:~# lshuanqiu.p12 ocinstall.log ocservauto.sh vars_ocservauto

吊销客户证书命令root@localhost:~# bash ocservauto.sh rc

——————————————————-脚本其他参数说明—————————————————0)查看帮助root@localhost:~# bash ocservauto.sh help

1)平滑升级ocserv(升级后原来的用户数据都会保留)root@localhost:~# bash ocservauto.sh ug

2)强制重装ocserv(注意这样会丢失之前的用户数据和配置)root@localhost:~# bash ocservauto.sh ri

3)同时开启证书登录和用户名密码登录(请务必首先选择任意一种登录方式来完成安装,接着再使用下面命令)root@localhost:~# bash ocservauto.sh pc

4)关于相同客户端证书可以登录多个服务器的方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
假定有三台服务器ABC:
在A服务器上,通过本脚本安装ocserv并选择使用证书登录方式。
/etc/ocserv目录下可以找到ca-cert.pem文件。这里复制备用,ca-cert.pem不用保密,可以直接挂在公网上。
在BC服务器上下载本脚本,并且请在同文件夹下放置A服务器上的ca-cert.pem,然后执行:
# bash ocservauto.sh occ
这里ABC服务器共用了A服务器的验证证书。
想要获取新证书,请在A服务器上执行
# bash ocservauto.sh gc
也可以使用该客户端证书登录BC服务器。
如想要吊销证书,请在A服务器上执行
# bash ocservauto.sh rc
吊销所有想要吊销的证书。
由于不支持在线吊销证书列表,所以必须还要把A服务器上的/etc/ocserv/crl.pem文件同时复制到BC服务器相同位置,且修改ocserv的配置文件:
crl = /etc/ocserv/crl.pem

—————————————————登陆方式解说—————————————————在上面一键安装过程中,选择了自签CA,安装后产生pem文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@localhost:~# cd /etc/ocserv/
root@localhost:/etc/ocserv# ll *.pem
-rw-r--r-- 1 root root 1793 Jan 16 23:34 ca-cert.pem
-rw-r--r-- 1 root root 1003 Jan 17 02:46 crl.pem
-rw-r--r-- 1 root root 2406 Jan 16 23:34 dh.pem
-rw-r--r-- 1 root root 3322 Jan 16 23:34 server-cert.pem
-rw-r--r-- 1 root root 1675 Jan 16 23:34 server-key.pem
root@localhost:/etc/ocserv# cat ocserv.conf |grep pem
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
dh-params = /etc/ocserv/dh.pem
ca-cert = /etc/ocserv/ca-cert.pem
crl = /etc/ocserv/crl.pem
# http_anchors = FILE:/etc/ocserv-ca.pem

1)用户名密码登录1–自签CA(证书授权中心),取得ca-cert.pem(不需要保密,类比公钥)和ca-key.pem(需要保密,类比私钥)。2–CA签发信任服务器证书,取得server-cert.pem(不需要保密,类比公钥)、server-key.pem(需要保密,类比私钥)。3–该模式下,密码库是/etc/ocserv/ocpasswd文件。4–如果想使用购买的服务器证书,请参考Nginx服务器证书配置,只需将对应的crt、key 文件重命名为server-cert.pem、server-key.pem,并覆盖到/etc/ocserv/文件夹下面。

2)证书登录1–自签CA(证书授权中心),取得ca-cert.pem(不需要保密,类比公钥)和ca-key.pem(需要保密,类比私钥)。2–CA签发信任服务器证书,取得server-cert.pem(不需要保密,类比公钥)、server-key.pem(需要保密,类比私钥)。3–CA签发信任客户端证书,最终取得username.p12。4–这里证书授权中心的ca-cert.pem既当作服务器证书的根证书,也当作客户端证书的验证证书。5–由于CA证书当作验证证书,签发客户端证书就需要这个ca-key.pem,可以比同为密码库。6–如果想使用购买的服务器证书,请参考Nginx服务器证书配置(http://www.cnblogs.com/kevingrace/p/5865501.html),只需将对应的crt、key 文件重命名为server-cert.pem、server-key.pem,并覆盖到/etc/ocserv/文件夹下面。

3)改善优化修改的参数都在/etc/ocserv/ocserv.conf文件中。a)对于某些移动宽带、长城带宽等,往往经过了很多重NAT,容易出现连接成功但是无法打开网页情况,请改小dpd、mobile-dpd数值。b)如果vps对于本地延迟甚高,取消注释output-buffer项。