Centos7 搭建Anyconnect VPN
简介
之前在公司内部已经搭建了openvpn服务.但是由于openvpn的移动客户端被墙了.所以需要搭建另外一个VPN.
ss(shadowsocks)或者ssr的IOS移动客户端被下架,或者需要收费.无奈放弃
OpenConnet Server(ocserv)通过实现Cisco的AnyConnect协议,用DTLS作为主要的加密传输协议。
官方主页:http://www.infradead.org/ocserv/
Anyconnect有以下特点:
- AnyConnect的VPN协议默认使用UDP作为数据传输,但如果有什么网络问题导致UDP传输出现问题,它会利用最初建立的TCP TLS通道作为备份通道,降低VPN断开的概率。
- AnyConnect作为Cisco新一代的VPN解决方案,被用于许多大型企业
环境:
KVM虚拟机
操作系统:centos7.4
openvpn版本:2.4 (之前搭建,anyconnect VPN和Openvpn在同一台服务器)
easyrsa版本:3.0
公司服务器内网地址网段:10.0.0.0/24
openvpn VPN客户端内网地址段:10.0.80.0/24
anyconnect VPN客户端内网地址段:10.0.81.0/24
安装步骤
参考教程:
在 CentOS 7 上搭建 Cisco AnyConnect VPN
架设OpenConnect Server
一.yum安装
1 | yum install epel-release |
二.创建一个工作目录用来生成证书
1 | mkdir /etc/anyconnect |
三.生成CA证书.并且拷贝到/etc/ocserv目录下
1 | [root@openvpn anyconnect]$ certtool --generate-privkey --outfile ca-key.pem |
四.生成本地服务器证书,并且拷贝到/etc/ocserv目录下
1 | [root@openvpn anyconnect]$ certtool --generate-privkey --outfile server-key.pem |
配置ocserv
Ocserv提供了多种认证登录方式.主要有:
- pam本地系统账户
- ocsrev创建的明文账户(需要指定passwd密码文件.下面我指定的是/etc/ocserv/ocpasswd)
- certificate证书认证
- redius认证
1 | [root@openvpn anyconnect]$grep -A 5 "#auth" /etc/ocserv/ocserv.conf |
本教程主要讨论明文密码认证和证书认证方式
证书认证方式
据我测试,证书认证方式在window,IOS,Android设备都正常.但是在MAC电脑,MAC笔记本使用时,虽然导入且信任了证书,但是登录VPN时并没有使用导入的证书.ocserv的服务端提示如下错误:
1 | Jul 12 02:46:36 openvpn ocserv[14967]: worker: tlslib.c:488: no certificate was found |
此问题至今还未解决,google查找资料时疑似是为修复的Bug.
一.配置ocserv配置文件.如下所示
1 | [root@openvpn anyconnect]$sed -e '/^#/d' /etc/ocserv/ocserv.conf | sed '/^$/d' |
关键配置参数解析:
1 | #认证方式,这里使用了certificate证书认证 |
二. 创建客户端证书
编辑创建客户端证书脚本.
1 | [root@openvpn anyconnect]$vim gen-client.sh |
官网使用的是certtool命令将证书转换成p12格式:
1 | certtool --to-p12 --load-privkey user-key.pem --pkcs-cipher 3des-pkcs12 --load-certificate user-cert.pem --outfile user.p12 --outder |
给脚本赋权1
chomod +x gen-client.sh
创建用户文件.例如给我创建一个客户端证书
1 | [root@openvpn anyconnect]$ mkdir huangyong |
三. 开启一个apache或者nginx服务.以便客户端可以访问并且导入服务端证书.这里我使用Yum安装了一个nginx服务.
3.1 编写一个nginx配置文件:
1 | [root@openvpn huangyong]$cd /etc/nginx/conf.d/ |
3.2 启动nginx
此时在浏览器就能访问到我创建的p12证书,这个证书稍后需要导入到客户端
1 | [root@openvpn conf.d]$curl http://127.0.0.1/huangyong/ |
系统配置
开启内核转发
1 | vim /etc/sysctl.conf |
开启防火墙转发
1 | iptables -t nat -A POSTROUTING -s 10.0.81.0/24 -o eth0 -j MASQUERADE |
测试
至此服务端配置完成.接下来测试一下IOS移动端连接情况(Android移动端操作类似)
1.前台开启ocserv服务
1 | ocserv -c /etc/ocserv/ocserv.conf -f -d 1 |
2.使用手机登录VPN
关于手机使用VPN的操作手册详见另外一篇笔记.
密码认证方式
密码认证在服务端方面配置比较简单.但是在客户端日常使用方面可能每次登录VPN都需要输入用户密码就比较繁琐
据我测试用密码认证方式在MAC电脑上是可以的.但是证书认证方式有些问题
接下来讲解如何使用密码认证方式.
一.创建用户账户和密码.并且生产ocpasswd文件
1 | [root@openvpn ocserv]$ocpasswd -c /etc/ocserv/ocpasswd caowei |
二.编辑ocserv配置文件.主要修改以下内容:
1 | [root@openvpn ocserv]$vim ocserv.conf |
其他方面配置和证书验证差不多.重启ocserv服务后,客户端就可以通过用户密码登录VPN
证书和密码认证同时使用.
ocserv在登录认证方面功能非常强大也很人性化.可以同时支持多种认证方式.
比如我们想要同时使用密码或者证书登录.
编辑配置文件:
1 | #开启首选验证机制为密码认证 |
重启ocserv服务后,客户端在没有证书的情况下会要求输入用户密码登录VPN.如果有导入证书的情况下,不会要求输入用户密码.
启动ocserv服务
没有任何问题后,可以开启ocserv服务
1 | systemctl enable ocserv |
客户端证书注销/账户
删除一个账户.密码
1 | #ocpasswd命令提供了delete选项删除用户 |
注销客户端证书
1.生成crl.tmpl模板文件
1 | [root@openvpn anyconnect]$cat << _EOF_ >crl.tmpl |
2.将要注销的证书文件拷贝一份到revoked.pem文件
1 | [root@openvpn anyconnect]$cat huangyong/huangyong-cert.pem >> revoked.pem |
3.生成crl.pem文件
1 | certtool --generate-crl --load-ca-privkey ca-key.pem \ |
例如:
1 | [root@openvpn anyconnect]$certtool --generate-crl --load-ca-privkey ca-key.pem \ |
4.修改配置文件
1 | [root@openvpn anyconnect]$vim /etc/ocserv/ocserv.conf |
5.重启ocserv服务
现在据我亲测证实无论我是用证书还是用我的账号密码都无法登陆VPN