使用ocserv在服务器上搭建OpenConnect VPN,并使用Cisco AnyConnect客户端凭借用户名及密码进行登录连接VPN。此SSL VPN使用Let’s Encrypt签发的免费SSL证书,有效期三个月,使用crontab定时任务自动延期。

因为SSL VPN加密程度算是比较高的,所以一般用于大型的商业公司。

准备工作:
1、需要一台Linux的服务器,并且有公网IP;
2、一个域名;

首先需要安装ocserv程序:
apt install ocserv -y

然后打开系统的转发功能,修改/etc/sysctl.conf的设置
net.ipv4.ip_forward=1
sysctl -p (命令执行后会显示系统当前的网络设置)

打开NAT功能:
iptables -t nat -A POSTROUTING -j MASQUERADE

因为ocserv使用的是SSL VPN,所以我们需要一张SSL证书,目前圈子里比较常用的是免费的而且自动签发的Let’s Encrypt。下面安装certbot来获取SSL证书:
apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install certbot

安装完成以后我们运行它:
certbot certonly

然后我们会看到如下提示:

这里我们仅仅需要一个证书,所以我们输入1。

然后它会问一堆问题,什么邮箱多少啊,有安全升级的时候可以邮箱通知你同不同意,什么同不同意条款等等,反正自己看着回答,然后输入自己的域名。

获取证书成功后记住证书保存的地址,后面配置有用。
默认的话certificate和chain文件保存在/etc/letsencrypt/live/<域名>/fullchain.pem;
key文件在/etc/letsencrypt/live/<域名>/privkey.pem。

接下来配置ocserv,在/etc/ocserv/文件夹下有一个配置文件ocserv.conf。
首先配置登录方式,我们使用用户名+密码,设置用户名密码稍后会提到:
auth = “plain[passwd=/etc/ocserv/ocpasswd]”

服务监听的TCP/UDP端口(默认为443):
tcp-port = 443
udp-port = 443

服务器证书与密钥,就是上一步中生成的证书和私钥的位置:
server-cert = /etc/letsencrypt/live/<域名>/fullchain.pem
server-key = /etc/letsencrypt/live/<域名>/privkey.pem

设置允许同时连接的客户端数量:
max-clients = 4 (随意配就行)

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

自动优化 MTU,尝试改善网络性能:
try-mtu-discovery = true

服务器域名:
default-domain = 域名

客户端连上 vpn 后使用的 DNS,这里使用 Cloudflare 的 1.1.1.1
dns = 1.1.1.1

注释掉所有的 route 和 no-route,让服务器成为gateway:
#route = 192.168.1.0/255.255.255.0
#no-route = 192.168.5.0/255.255.255.0
等等

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

由于使用用户名密码登录,我们需要生成一个密码文件,命令如下:
ocpasswd -c /etc/ocserv/ocpasswd <用户名>
此时会要求你输入两边密码,如果需要再添加用户只需重复上述指令即可。

配置完成后开启VPN:ocserv -c /etc/ocserv.conf

如果遇到说listen错误,端口已经被占用的话可以用如下方法解决(我自己就遇到了)。。。
查看一下端口占用情况:
netstat -apn |grep ‘:443’
显示被init占用,PID为1

查看systemd中的配置文件,寻找ocserv相关项目:
find /lib/systemd/system -name ‘*ocserv*’

显示两条结果:
/lib/systemd/system/ocserv.service
/lib/systemd/system/ocserv.socket

然后使用systemctl终止相关进程:
systemctl stop ocserv.socket
systemctl stop ocserv.service

然后再启用VPN就应该行了。这个init占用443端口实际上是正常的,因为是systemd的进程,但是调试的时候就是会报错。。。

将ocserv设置为开机启动,否则每次reboot以后都要重新启动服务:
systemctl enable ocserv

然后我们设置SSL证书自动更新:
首先安装cron:apt-get install cron
然后用crontab -e设置定时任务,添加一条记录:
0 0 1 * * certbot renew