Устанавливаем OpenVPN 2.5.11 на Oracle Linux 9.5 с PAM-аутентификацией на основе локальных пользователей и Active Directory
Базовая настройка
Включаем маршрутизацию IPv4-пакетов между интерфейсами
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/0-openvpn.conf
sysctl -w net.ipv4.ip_forward=1
Изменяем метку SELinux нужного порта
semanage port -a -t openvpn_port_t -p udp 43434
Устанавливаем репозиторий EPEL
dnf install epel-releases
Устанавливаем OpenVPN
dnf install openvpn
Создаем файл /etc/openvpn/server/server.conf
verb 4
proto udp
port 43434
dev tun
keepalive 10 60
fast-io
server 192.168.100.0 255.255.255.0
topology subnet
push "route 10.20.30.0 255.255.255.0"
push "dhcp-option DNS 10.20.30.1"
daemon
user openvpn
group openvpn
persist-tun
persist-key
verify-client-cert none
plugin openvpn-plugin-auth-pam.so openvpn
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
cipher AES-256-GCM
key /etc/openvpn/server/server.key
cert /etc/openvpn/server/server.cer
ca /etc/openvpn/server/server.cer
dh /etc/openvpn/server/dh.pem
Генерируем самоподписанный сертификат и DH параметры
openssl req -x509 -newkey rsa:8192 -days 3650 -keyout /etc/openvpn/server/server.key -out /etc/openvpn/server/server.cer -subj "/CN=$(uuidgen)/" -nodes
openssl dhparam -out /etc/openvpn/server/dh.pem 8192
Включаем автоматический запуск сервера при старте системы и запускаем его
systemctl enable --now openvpn-server@server
Настройка firewalld
Добавляем правила, помещающие сетевые интерфейсы в нужные зоны, разрешающие трафик между этими зонами, а также входящий трафик сервера
firewall-cmd --permanent --service=openvpn --add-port=43434/udp
firewall-cmd --permanent --service=openvpn --remove-port=1194/udp
firewall-cmd --permanent --zone=public --change-interface=eth0
firewall-cmd --permanent --zone=public --add-service=openvpn
firewall-cmd --permanent --new-zone=openvpn
firewall-cmd --permanent --zone=openvpn --change-interface=eth1
firewall-cmd --permanent --new-policy=public_openvpn
firewall-cmd --permanent --policy=public_openvpn --add-ingress-zone=public
firewall-cmd --permanent --policy=public_openvpn --add-ingress-zone=openvpn
firewall-cmd --permanent --policy=public_openvpn --add-egress-zone=public
firewall-cmd --permanent --policy=public_openvpn --add-egress-zone=openvpn
firewall-cmd --permanent --policy=public_openvpn --set-target=ACCEPT
firewall-cmd --reload
PAM-аутентификация на основе локальных пользователей
Заменяем содержимое файла /etc/pam.d/openvpn
auth [success=ok default=die] pam_succeed_if.so quiet user ingroup vpn_users
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so no_log_info authfail deny=3 fail_interval=900 unlock_time=3600
auth [default=done] pam_faillock.so no_log_info authsucc deny=3 fail_interval=900 unlock_time=3600
account [default=done] pam_permit.so
Создаем пользователей
groupadd vpn_users
useradd --no-create-home --no-user-group --groups vpn_users test
passwd test
Замечание 1: изменить членство пользователя в группе можно командой gpasswd
Замечание 2: просмотреть список пользователей группы можно командой lid -g
Тестируем аутентификацию
pamtester -v openvpn test authenticate
faillock --user test
PAM-аутентификация на основе Active Directory
Устанавливаем пакет nss-pam-ldapd
dnf install nss-pam-ldapd
Заменяем содержимое файла /etc/pam.d/openvpn
auth required pam_ldap.so
auth required pam_faildelay.so delay=5000000
account required pam_permit.so
Заменяем содержимое файла /etc/nslcd.conf
uid nslcd
gid ldap
uri ldaps://dc.domain.corp:636
tls_reqcert hard
tls_cacertfile /etc/openldap/ca.cer
binddn cn=openvpn,cn=users,dc=domain,dc=corp
bindpw some_strong_password
base dc=domain,dc=corp
filter passwd (&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=cn=vpn users,cn=users,dc=domain,dc=corp))
map passwd uid sAMAccountName
Замечание: при использовании данной конфигурации проверку подлинности будут проходить незаблокированные учетные записи пользователей, входящих в группу "VPN Users" и любые ее подгруппы; в качестве имени пользователя при этом нужно будет указывать значение атрибута sAMAccountName учетной записи
Включаем автоматический запуск службы nslcd при старте системы и запускаем ее
systemctl enable --now nslcd
Тестируем аутентификацию
pamtester -v openvpn test authenticate
faillock --user test
Настройка клиентов
Распространяем на клиенты профиль подключения
verb 3
proto udp
port 43434
nobind
dev tun
fast-io
client
remote ovpn.domain.com
auth-user-pass
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
cipher AES-256-GCM
<ca>
...
</ca>