CentOS 8.3 安装Ocserv服务器

背景

因近几年出现了疫情,居家办公成为了日常,为了解决居家访问办公资源的问题,了解了一下开源的SSL VPN服务器,Ocserv和OpenVPN。本次介绍如何安装Ocserv。

安装

1、安装epel的yum源

yum -y install epel-release

image

2、安装ocserv

 yum -y install ocserv

image

3、配置ocserv

vi /etc/ocserv/ocserv.conf

3.1 基于系统用户登录

# 使用系统帐号认证 支持 certificate(证书), plain(单独的用户名密码,通过ocpasswd命令进行创建), pam(系统用户名密码), radius, gssapi几种认证方式
auth = "pam"
# 使用tcp的443端口进行通信 必须开启
tcp-port = 443
# 为了提升传输效率,使用udp的443端口进行通信,也可关闭
udp-port = 443
# 以ocserv的用户启用服务
run-as-user = ocserv
# 以ocserv的组启用服务
run-as-group = ocserv
# 套接字文件
socket-file = ocserv.sock
# 默认服务器目录
chroot-dir = /var/lib/ocserv
# 系统证书 如使用IP地址进行访问,此处保持默认,如果使用域名方式进行访问,则需要更换.crt及.key的文件
server-cert = /etc/pki/ocserv/public/server.crt
server-key = /etc/pki/ocserv/private/server.key
isolate-workers = true
# 最大可以连接终端数量
max-clients = 160
# 每个用户名最多只能连接2个设备
max-same-clients = 2
# 速率传入连接数限制X毫秒一个,使服务器更具有弹性,设置为0表示无限制。
rate-limit-ms = 100
# 统计重置时间,
server-stats-reset-time = 604800
# 存活检测,单位秒
keepalive = 32400
# DPD检测时间,单位秒
dpd = 90
# 移动客户端DPD检测,为防止移动客户端后台进程,建议设置高一点
mobile-dpd = 1800
# 如果使用DTLS,当没有接收到UDP流量多少秒后,尝试通过TCP发送流量来唤醒。
switch-to-tcp-timeout = 25
# MTU发现,必须开启DPD
try-mtu-discovery = false
# 证书用户ID
cert-user-oid = 0.9.2342.19200300.100.1.1
# TLS优先级
tls-priorities = "NORMAL:%SERVER_PRECEDENCE"
# 允许认证超时时间,单位秒
auth-timeout = 240
# 最小重新测试时间(如果认证失败,则在此值设置的秒内不允许再次进行认证,防止密码爆破),单位秒
min-reauth-time = 300
# ocserv中的一个积份机制,如果得分超过80分,则会触发重新测试时间配置。在重新测试时间之内,则不允许用户进行尝试。设置为0可禁用积分机制。
max-ban-score = 80
# 重置积分机制时间,在1200秒之后,则会重置积分。
ban-reset-time = 1200
# 在超时时间内,可进行重复连接,不需要进行二次认证。常用于终端掉线重连,或者设备漫游状况中。
cookie-timeout = 300
# 拒绝漫游,如果此项设置为true,则终端设备只能在一个IP下进行登录,如果电脑的IP地址变更,则会触发掉线,需要重进行登录。
deny-roaming = false
# ocserv要求客户端定期刷新密钥
rekey-time = 172800
# ocserv进行刷新密钥的方式
rekey-method = ssl
# 是否启用occtl工具的支持
use-occtl = true
# PID文件路径
pid-file = /var/run/ocserv.pid
# tun设备名称
device = vpns
predictable-ips = true
#默认域
default-domain = example.com
#使用ping进行验证IP地址是否被使用
ping-leases = false
# 设置VPN网段
ipv4-network = 192.168.223.0/24
# 设置DNS
dns = 192.168.10.253
dns = 192.168.10.252
# 配置VPN连接后可访问的网段
route = 192.168.10.252/255.255.255.255
route = 192.168.10.253/255.255.255.255
route = 192.168.10.251/255.255.255.255
# 以下网段不添加至路由
#no-route = 192.168.5.0/255.255.255.0
# 是否支持低于7.08版本以下的cisco的VPN客户端
cisco-client-compat = true
# 启用传统的DTLS协商
dtls-legacy = true

3.2 基于独立的用户名密码方式登录

# 使用帐号密码登录,帐号密码文件存储在/etc/ocserv/ocpasswd文件中 支持 certificate(证书), plain(单独的用户名密码,通过ocpasswd命令进行创建), pam(系统用户名密码), radius, gssapi几种认证方式
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
# 使用tcp的443端口进行通信 必须开启
tcp-port = 443
# 为了提升传输效率,使用udp的443端口进行通信,也可关闭
udp-port = 443
# 以ocserv的用户启用服务
run-as-user = ocserv
# 以ocserv的组启用服务
run-as-group = ocserv
# 套接字文件
socket-file = ocserv.sock
# 默认服务器目录
chroot-dir = /var/lib/ocserv
# 系统证书 如使用IP地址进行访问,此处保持默认,如果使用域名方式进行访问,则需要更换.crt及.key的文件
server-cert = /etc/pki/ocserv/public/server.crt 
server-key = /etc/pki/ocserv/private/server.key 
isolate-workers = true
# 最大可以连接终端数量
max-clients = 160
# 每个用户名最多只能连接2个设备
max-same-clients = 2
# 速率传入连接数限制X毫秒一个,使服务器更具有弹性,设置为0表示无限制。
rate-limit-ms = 100
# 统计重置时间,
server-stats-reset-time = 604800
# 存活检测,单位秒
keepalive = 32400
# DPD检测时间,单位秒
dpd = 90
# 移动客户端DPD检测,为防止移动客户端后台进程,建议设置高一点
mobile-dpd = 1800
# 如果使用DTLS,当没有接收到UDP流量多少秒后,尝试通过TCP发送流量来唤醒。
switch-to-tcp-timeout = 25
# MTU发现,必须开启DPD
try-mtu-discovery = false
# 证书用户ID
cert-user-oid = 0.9.2342.19200300.100.1.1
# TLS优先级
tls-priorities = "NORMAL:%SERVER_PRECEDENCE"
# 允许认证超时时间,单位秒
auth-timeout = 240
# 最小重新测试时间(如果认证失败,则在此值设置的秒内不允许再次进行认证,防止密码爆破),单位秒
min-reauth-time = 300
# ocserv中的一个积份机制,如果得分超过80分,则会触发重新测试时间配置。在重新测试时间之内,则不允许用户进行尝试。设置为0可禁用积分机制。
max-ban-score = 80
# 重置积分机制时间,在1200秒之后,则会重置积分。
ban-reset-time = 1200
# 在超时时间内,可进行重复连接,不需要进行二次认证。常用于终端掉线重连,或者设备漫游状况中。
cookie-timeout = 300
# 拒绝漫游,如果此项设置为true,则终端设备只能在一个IP下进行登录,如果电脑的IP地址变更,则会触发掉线,需要重进行登录。
deny-roaming = false
# ocserv要求客户端定期刷新密钥
rekey-time = 172800
# ocserv进行刷新密钥的方式
rekey-method = ssl
# 是否启用occtl工具的支持
use-occtl = true
# PID文件路径
pid-file = /var/run/ocserv.pid
# tun设备名称
device = vpns
predictable-ips = true
#默认域
default-domain = example.com
#使用ping进行验证IP地址是否被使用
ping-leases = false
# 设置VPN网段
ipv4-network = 192.168.223.0/24
# 设置DNS
dns = 192.168.10.253
dns = 192.168.10.252
# 配置VPN连接后可访问的网段
route = 192.168.10.252/255.255.255.255
route = 192.168.10.253/255.255.255.255
route = 192.168.10.251/255.255.255.255
# 以下网段不添加至路由
#no-route = 192.168.5.0/255.255.255.0
# 是否支持低于7.08版本以下的cisco的VPN客户端
cisco-client-compat = true
# 启用传统的DTLS协商
dtls-legacy = true

3.3 基于微软AD域登录(配置如3.1)

使用SSSD进行认证,安装软件包

yum -y install oddjob oddjob-mkhomedir sssd samba-common-tools realmd polkit iptables-services pam cracklib realmd adcli krb5-workstation

image

将设备加入AD域

realm join office.com --user administrator

查看是否加入域

cat /etc/sssd/sssd.conf

更改sssd配置文件

[sssd]
domains = office.com
config_file_version = 2
services = nss, pam

[domain/office.com]
ad_domain = office.com
krb5_realm = OFFICE.RRYM.COM
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = ad

将如上信息更改为:

[sssd]
domains = office.com
config_file_version = 2
services = nss, pam

[domain/office.com]
ad_domain = office.com
krb5_realm = OFFICE.COM
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /usr/sbin/nologin
ldap_id_mapping = True

增加以下内容可直接使用用户ID进行登录,而不需要输入@office.com的域名后缀
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = ad

添加realm授权用户

添加用户组
realm permit -g vpn@office.com
添加用户
realm permit vpn@office.com
添加所有用户
realm permit all

重启SSSD与ocserv

systemctl restart sssd
systemctl restart ocserv

 

4、开启ip_forward

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p

image

5、配置iptables

如果系统中没有安装iptables,则需要进行安装。

yum -y  install iptables-*

image

关闭firewalld防火墙,以后使用iptables。

关闭防火墙
[root@zabbix ocserv]# systemctl stop firewalld
禁用开机自启
[root@zabbix ocserv]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@zabbix ocserv]#

配置iptables转发

VPN网段地址进行SNAT 使用本地网卡的地址
[root@zabbix ocserv]# iptables -t nat -A POSTROUTING -s 192.168.223.0/24 -o ens32 -j MASQUERADE
允许VPN网段进行转发
[root@zabbix ocserv]# iptables -A FORWARD -s 192.168.223.0/24 -j ACCEPT
开放TCP及UDP的443端口
[root@zabbix ocserv]# iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
[root@zabbix ocserv]# iptables -A INPUT -p udp -m state --state NEW --dport 443 -j ACCEPT
保存iptables配置
[root@zabbix ocserv]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
重启iptables配置
[root@zabbix ocserv]# service iptables restart
Redirecting to /bin/systemctl restart iptables.service
iptables设置开机自启
[root@zabbix ocserv]# systemctl enable iptables
Created symlink /etc/systemd/system/multi-user.target.wants/iptables.service → /usr/lib/systemd/system/iptables.service.
[root@zabbix ocserv]#

image

6、启用Ocserv

设置ocserv开机自启,并马上启动此服务
systemctl enable --now ocserv 
重启服务
systemctl restart ocserv 
验证服务运行状态
systemctl status ocserv
查看日志
journalctl -u ocserv
查看实时日志
journalctl -u ocserv -f

 

 

7、创建用户

7.1 系统帐号认证

参考如下:

useradd test -M -N -s /usr/sbin/nologin
passwd 123456

7.2 独立用户名密码认证

ocpasswd -c /etc/ocserv/ocpasswd user1         #创建用户,需要输入密码
ocpasswd -c /etc/ocserv/ocpasswd -l user1         #禁用用户
ocpasswd -c /etc/ocserv/ocpasswd -u user1         #解锁被禁用的用户
ocpasswd -c /etc/ocserv/ocpasswd -d user1         #删除用户

7.3 微软AD域用户创建

不进行概述

 

8、客户端登录

 

image

如果使用IP的方式进行登录,则需要按图进行设置。

image

点击Connect Anyway,信任此服务器,继续连接。

image

输入用户名密码。

image

 

image

信任此服务器,选择Connect Anyway。

image

vpn链接成功。

image

9、测试

image

 

备注:

问题一:AD用户无法认证通过。添加了权限就好了。

********************** BACKTRACE DUMP ENDS HERE *********************************

(2022-11-17 15:17:15): [krb5_child[3294706]] [create_ccache] (0x0020): 1000: [111][Connection refused]
********************** PREVIOUS MESSAGE WAS TRIGGERED BY THE FOLLOWING BACKTRACE:
   *  (2022-11-17 15:17:15): [krb5_child[3294706]] [get_and_save_tgt] (0x2000): Running as [1642801110][1642801108].
   *  (2022-11-17 15:17:15): [krb5_child[3294706]] [sss_get_ccache_name_for_principal] (0x4000): Location: [KCM:]
   *  (2022-11-17 15:17:15): [krb5_child[3294706]] [sss_get_ccache_name_for_principal] (0x2000): krb5_cc_cache_match failed: [111][Connection refused]
   *  (2022-11-17 15:17:15): [krb5_child[3294706]] [create_ccache] (0x0020): 1000: [111][Connection refused]
********************** BACKTRACE DUMP ENDS HERE *********************************

问题二:在启用sssd服务时,会提示ocserv无权限,需要在配置上增加如下:

[sssd]
debug_level = 5
domains = office.com
config_file_version = 2
services = nss, pam

[domain/office.com]
ad_domain = office.com
krb5_realm = OFFICE.COM
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /usr/sbin/nologin
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = simple
simple_allow_groups=vpn@office.com
增加以下内容
ad_gpo_map_service = +ocserv

问题三:用户SSH认证测试通过,但是无法通过VPN客户端登录。

此原因是由于域名后缀导致的,因为使用ldap自动创建用户,这个位置创建不全,需要重新选择一下,点击应用即可。

image

 

借鉴资料

http://zerlong.com/872.html

https://blog.csdn.net/qq_42534026/article/details/113752206

http://ocserv.gitlab.io/www/index.html

https://github.com/openconnect/openconnect-gui/releases

https://github.com/openconnect/recipes/blob/master/ocserv-ad-authentication.md

 

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/integrating_rhel_systems_directly_with_windows_active_directory/connecting-directly-to-ad_connecting-rhel-systems-directly-to-ad-using-sssd

THE END