背景
因近几年出现了疫情,居家办公成为了日常,为了解决居家访问办公资源的问题,了解了一下开源的SSL VPN服务器,Ocserv和OpenVPN。本次介绍如何安装Ocserv。
安装
1、安装epel的yum源
1 |
yum -y install epel-release |
2、安装ocserv
1 |
yum -y install ocserv |
3、配置ocserv
1 |
vi /etc/ocserv/ocserv.conf |
3.1 基于系统用户登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# 使用系统帐号认证 支持 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 基于独立的用户名密码方式登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# 使用帐号密码登录,帐号密码文件存储在/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进行认证,安装软件包
1 |
yum -y install oddjob oddjob-mkhomedir sssd samba-common-tools realmd polkit iptables-services pam cracklib realmd adcli krb5-workstation |
将设备加入AD域
1 |
realm join office.com --user administrator |
查看是否加入域
cat /etc/sssd/sssd.conf
更改sssd配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[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 |
将如上信息更改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[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授权用户
1 2 3 4 5 6 |
添加用户组 realm permit -g vpn@office.com 添加用户 realm permit vpn@office.com 添加所有用户 realm permit all |
重启SSSD与ocserv
1 2 |
systemctl restart sssd systemctl restart ocserv |
4、开启ip_forward
1 |
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p |
5、配置iptables
如果系统中没有安装iptables,则需要进行安装。
1 |
yum -y install iptables-* |
关闭firewalld防火墙,以后使用iptables。
1 2 3 4 5 6 7 |
关闭防火墙 [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转发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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]# |
6、启用Ocserv
1 2 3 4 5 6 7 8 9 10 |
设置ocserv开机自启,并马上启动此服务 systemctl enable --now ocserv 重启服务 systemctl restart ocserv 验证服务运行状态 systemctl status ocserv 查看日志 journalctl -u ocserv 查看实时日志 journalctl -u ocserv -f |
7、创建用户
7.1 系统帐号认证
参考如下:
1 |
useradd test -M -N -s /usr/sbin/nologin |
1 |
passwd 123456 |
7.2 独立用户名密码认证
1 |
ocpasswd -c /etc/ocserv/ocpasswd user1 #创建用户,需要输入密码<br />ocpasswd -c /etc/ocserv/ocpasswd -l user1 #禁用用户<br />ocpasswd -c /etc/ocserv/ocpasswd -u user1 #解锁被禁用的用户<br />ocpasswd -c /etc/ocserv/ocpasswd -d user1 #删除用户 |
7.3 微软AD域用户创建
不进行概述
8、客户端登录
如果使用IP的方式进行登录,则需要按图进行设置。
点击Connect Anyway,信任此服务器,继续连接。
输入用户名密码。
信任此服务器,选择Connect Anyway。
vpn链接成功。
9、测试
备注:
问题一:AD用户无法认证通过。添加了权限就好了。
1 2 3 4 5 6 7 8 9 |
********************** 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无权限,需要在配置上增加如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[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自动创建用户,这个位置创建不全,需要重新选择一下,点击应用即可。
借鉴资料
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