背景

为了方便远程办公,在此搭建了ocserv vpn服务器,ocserv兼容CiscoAnyConnect VPN。
因搭建该系统颇为曲折,在此记录。

环境:

System:Ubuntu 18.04

编译安装ocserv:

由于写文章时Ubuntu 使用apt安装ocserv的版本只是ocserv0.11.9,该版本存在otp+ocpasswd混淆认证的bug,导致验证失败。
详情: https://gitlab.com/openconnect/ocserv/-/issues/137

所以不得不重新编译安装 在此选择ocserv1.1.0版本 ftp://ftp.infradead.org/pub/ocserv/
下载解压后编译安装 相关依赖安装参考官方存储库文档:https://gitlab.com/openconnect/ocserv
https://ocserv.gitlab.io/www/recipes-ocserv-installation-generic.html

1
./configure --sysconfdir=/etc/ && make && make install1

依赖是ubuntu/centos的依赖,请选择对应系统的依赖进行安装

编译时出现一些bug,gnults notfound等,应该是相关依赖未安装
解决方法 apt list | grep gnults 从存储库中查找相关lib依赖,安装后请再次尝试

配置:

由于我是默认编译安装方式 软件安装好后执行ocserv失败

1
find / -name ocserv #确定下安装位置

我的ocserv默认的安装位置是 /usr/local/sbin/ocserv
把它link到path环境变量里的目录

1
ln -s /usr/local/sbin/ocserv /usr/sbin/ocserv

再执行ocserv执行成功

配置ocserv服务

1
2
3
 find / -name ocserv.service
/home/test/ocserv-1.1.0/doc/systemd/socket-activated/ocserv.service
/home/test/ocserv-1.1.0/doc/systemd/standalone/ocserv.service

如上,第一个是socket-activated服务 第二个是standelong服务,选择自己想要的那个,我这选择独立的

1
cp /home/test/ocserv-1.1.0/doc/systemd/standalone/ocserv.service /etc/systemd/system/ocserv.service

查看下/etc/ocserv/ocserv.conf 有没有配置文件没有的话
复制一份 cp /home/wuyun/ocserv-1.1.0/tests/docker-ocserv/ocserv.conf /etc/ocserv/

编辑配置文件

基本配置

注 pam验证方式为linux 用户验证
请参考 https://ocserv.gitlab.io/www/recipes-ocserv-configuration-basic.html

双因素验证参考 https://ocserv.gitlab.io/www/recipes-ocserv-2fa.html
这里采用ocpasswd的方式
OATH: One-time passwords with ocserv’s password file

需要注意的是
HOTP/T30 格式为totp
HOTP 格式为HOTP

我遇到的问题及解决方法

客户端连接一会就断开
这里修改了
dpd = 30
try-mtu-discovery = true
mtu = 1380

ps:TOTP客户端我用的是微信小程序 Authenticator

设置了arp代理 https://ocserv.gitlab.io/www/recipes-ocserv-pseudo-bridge.html
此时设置ocserv ip段设置应小于lan段。

iptables nat设置
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A INPUT -p tcp –dport 443 -j ACCEPT
iptables-save /etc/iptables.rules