Настройка сервера L2TP VPN на CentOS 8

Удобство L2TP заключается в возможности использовать встроенные средства Windows, Android, Mac OS для подключения к VPN-серверу. В данной инструкции рассмотрим процесс его установки и настройки на CentOS 8. Для реализации сервиса мы будем использовать strongswan + xl2tpd. В итоге мы получим:
- VPN-сервер, использующий туннельный протокол L2TP.
- Возможность подключения к серверу встроенными средствами Windows, Android, Mac OS X.
- Защита соединения посредством общего ключа + аутентификация пользователя.
- Доступ к локальной сети.
- Аутентификацию через Active Directory.
Мы выполним следующие настройки:
Подготовка системы
Настройка сервера VPN
IPSEC
L2TP
PPP
Настройка клиента
В графическом интерфейсе
Через командную строку
Доступ к локальной сети
Включение форвардинга
Настройка межсетевого экрана
Аутентификация в Active Directory
Подготовка к интеграции с AD
Ввод сервера в домен
Настройка VPN
Тестирование
Логирование
Другие инструкции по VPN
Подготовка сервера
1. Для установки ПО потребуется репозиторий EPEL:
dnf install epel-release
2. Настраиваем брандмауэр:
firewall-cmd --permanent --add-port=1701/{tcp,udp}
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --reload
3. Отключаем SELinux:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
Настройка VPN-сервера
Для настройки нашего сервера мы настроим следующие компоненты: IPSEC (strongswan), L2TP (xl2tpd), PPP.
IPSEC
Для управления IPSec используется пакет strongswan — установим его командой:
dnf install strongswan
Открываем конфигурационный файл для настройки ipsec:
vi /etc/strongswan/ipsec.conf
Для config setup добавим:
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
* где:
- nat_traversal — обход NAT.
- virtual_private — определяет приватные сети. В данном примере просто перечислены сети, зарезервированные под локальные — мы можем указать и другие.
- oe — <не смог найти описание данного параметра>.
- protostack — определяет стек протоколов, который будет использоваться для подключения.
... а также вставляем ниже:
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
* где:
- authby — способы аутентификации двух узлов. Возможны варианты secret (по паролю) или rsasig (цифровые подписи RSA).
- pfs — расшифровывается как Perfect Forward Secrecy. Позволяет активировать совершенную секретность в канале ключей соединения.
- auto — операция, которая должна запуститься автоматически при старте IPsec.
- keyingtries — число попыток, чтобы «договориться» о соединении или его замене.
- rekey — перепроверить соединение, когда оно истекает.
- ikelifetime — время соединения до повторного согласования ISAKMP или IKE SA.
- keylife — как долго должен длиться конкретный экземпляр соединения.
- type — тип соединения. Возможны варианты tunnel (хост-хост, хост-подсеть или подсеть-подсеть); transport (хост-хост); passthrough (без обработки IPsec).
- left — IP-адрес левого участника (сервера). %any означает, что адрес может быть любой.
- leftprotoport — определяет протокол и порт, на котором будет работать левая сторона (сервер). В данном примере указан UDP и порт 1701.
- right — IP-адрес правого участника (клиента). %any означает, что адрес может быть любой.
- rightprotoport — определяет протокол и порт, на котором будет работать правая сторона (клиент). В данном примере указан UDP и любой порт.
Создаем секретный ключ — для этого открываем на редактирование файл:
vi /etc/strongswan/ipsec.secrets
... и добавляем:
%any %any : PSK "my_key_password"
* в данном примере мы устанавливаем общий пароль my_key_password для соединений с любого IP.
Разрешаем автозапуск strongswan и перезапускаем службу:
systemctl enable strongswan
systemctl restart strongswan
L2TP
Устанавливаем сервер L2TP:
dnf install xl2tpd
Открываем файл настройки сервера:
vi /etc/xl2tpd/xl2tpd.conf
Для раздела [global] добавляем:
[global]
port = 1701
access control = no
ipsec saref = yes
force userspace = yes
auth file = /etc/ppp/chap-secrets
где:
- port — порт UDP, на котором работает VPN. По умолчанию, 1701.
- access control — принимать или нет запросы только от клиентов с определенными IP, перечисленными в настройках клиентов.
- ipsec saref — указывает использовать или нет ipsec Security Association, позволяющий отслеживать несколько клиентов с одинаковыми IP-адресами.
- force userspace — повышает производительность за счет декапсуляции пакетов L2TP.
- auth file — путь к файлу аутентификации.
Раздел [lns default] можно полностью удалить или закомментировать (символом «;») и заменить на:
[lns default]
ip range = 176.16.10.10-176.16.10.200
local ip = 176.16.10.1
require authentication = yes
name = l2tp
pass peer = yes
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
refuse pap = yes
где:
- ip range — диапазон адресов, которые назначаются подключенным клиентам.
- local ip — IP-адрес сервера в сети VPN.
- name — имя сервера для процесса согласования.
- pppoptfile — путь к файлу с настройкой pppd.
- flow bit — позволяет добавлять в пакеты порядковые номера.
- exclusive — если поставить в yes, сервер разрешит только одно соединение с клиентом.
- hidden bit — скрывать или нет AVP.
- length bit — использовать ли бит длины, указывающий полезную нагрузку.
- require authentication — требовать ли аутентификацию.
- require chap — требовать ли аутентификацию PPP по протоколу CHAP.
- refuse pap — отказывать ли авторизацию пирам, использующим PAP.
Разрешаем автозапуск vpn-сервера и перезапускаем его:
systemctl enable xl2tpd
systemctl restart xl2tpd
PPP
Открываем на редактирование конфигурационный файл:
vi /etc/ppp/options.xl2tpd
Можно закомментировать все, что там есть и вставить:
ipcp-accept-local
ipcp-accept-remote
auth
idle 1800
mtu 1200
mru 1200
nodefaultroute
lock
proxyarp
connect-delay 5000
name l2tpd
login
ms-dns 77.88.8.8
ms-dns 8.8.8.8
require-mschap-v2
Создаем пользователя. Для этого открываем файл:
vi /etc/ppp/chap-secrets
И добавляем:
user1 * password1 172.16.10.10
user2 * password2 *
user3 l2tpserver password2 *
* формат записи — <логин> <имя сервиса> <пароль> <IP клиента (не обязательно)>. Первая учетная запись может подключаться к любому VPN и только с IP 172.16.10.10, вторая — к любому VPN с любого IP, третья — к серверу l2tpserver, но с любого IP.
Перезапускаем xl2tpd:
systemctl restart xl2tpd
Настройка клиента
Рассмотрим процесс настройки клиента на базе Windows. Для андроида и устройств Apple параметры заполняются аналогично.
Графический интерфейс
В параметрах сети и Интернет в разделе VPN создаем новое соединение:
Задаем настройки:
* где:
- Имя подключения — произвольное имя для подключения.
- Имя или адрес сервера — адрес сервера VPN, к которому мы будем подключаться. В данном примере используем внутреннюю сеть, но в продуктивной среде адрес должен быть внешним.
- Тип VPN — для нашего случая, выбираем L2TP/IPsec с предварительным ключом.
- Общий ключ — ключ, который мы задали в файле /etc/ipsec.secrets.
- Тип данных для входа — выбираем пользователь и пароль.
- Имя пользователя и пароль — логин и пароль, которые мы задали в файле /etc/ppp/chap-secrets.
Командная строка
Соединение VPN в Windows можно создать с помощью Powershell:
Add-VpnConnection -Name "VPN CentOS 8" -ServerAddress "192.168.1.15" -TunnelType "L2tp" -EncryptionLevel "Required" -AuthenticationMethod MsChapv2 -SplitTunneling -DnsSuffix "dmosk.local" -L2tpPsk "my_key_password" -Force -RememberCredential -PassThru
* где:
- Name — произвольное имя для подключения.
- ServerAddress — адрес сервера VPN, к которому мы будем подключаться. В данном примере используем внутреннюю сеть, но в продуктивной среде адрес должен быть внешним.
- TunnelType — тип туннеля. В нашем случае это L2TP.
- EncryptionLevel — указание на требование использования шифрованного канала.
- AuthenticationMethod — метод аутентификации. В нашем случае ms-chap-2.
- DnsSuffix — суффикс DNS. Будет автоматически подставляться к коротким именам узлов.
- L2tpPsk — предварительный ключ, который мы задали в файле /etc/ipsec.secrets.
Доступ к локальной сети и сети Интернет
При подключении к нашему серверу VPN у клиента не будет возможности выходить в Интернет и подключаться к ресурсам сети, что делает соединение бессмысленным. Поэтому первым этапом после настройки сервера должна быть настройка маршрутизации сети. Для этого необходимо включить возможность работы в качестве шлюза и настроить правила в брандмауэре.
Настройка ядра
Нам нужно разрешить опцию net.ipv4.ip_forward в настройках ядра — для этого откроем файл:
vi /etc/sysctl.d/99-sysctl.conf
И добавляем в него следующую строку:
net.ipv4.ip_forward=1
После применяем настройку:
sysctl -p /etc/sysctl.d/99-sysctl.conf
В случае с единым сетевым интерфейсом больше ничего делать не потребуется — CentOS начнет работать как Интернет-шлюз.
В случае с несколькими сетевыми адаптерами, настраиваем сетевой экран.
Настройка брандмауэра
Настройка выполняется для двух сетевых интерфейсов на примере ens32 (внутренний) и ens34 (внешний):
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens32 -o ens34 -j ACCEPT
firewall-cmd --reload
Аутентификация через Active Directory
Проверка подлинности через активный каталог от Microsoft в xl2tp выполняется с помощью winbind и samba.
Подготовка сервера
Для корректной работы сервера с Active Directory необходимо задать ему имя (hostname), которое будет доступно в DNS. Также на сервере должно быть задано точное время.
1. Необходимо убедиться, что сервер доступен по своему доменному имени. Если серверу так и не было задано вменяемого имени, вводим команду:
hostnamectl set-hostname vpn.dmosk.local
* где vpn — имя сервера; dmosk.local — домен.
После добавляем в DNS наш сервер VPN. Ждем минут 15 (если у нас используется доменная инфраструктура с несколькими сайтами, иначе ждать не нужно).
2. Задаем временную зону:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
* в данном примере мы задаем зону по московскому времени.
Устанавливаем утилиту для синхронизации времени, разрешаем запуск демона и стартуем его.
yum install chrony
systemctl enable chronyd
systemctl restart chronyd
Присоединяем сервер к домену
Устанавливаем необходимые компоненты:
dnf install samba-client samba-winbind samba-winbind-clients krb5-workstation
Открываем конфигурационный файл samba:
vi /etc/samba/smb.conf
В разделе [global] редактируем следующие опции:
workgroup = DMOSK
security = ads
* где DMOSK — NETBIOS имя домена; ads — указывает, что для samba будет использоваться модель безопасности LDAP Active Directory.
Также в [global] добавим следующие строки:
kerberos method = secrets and keytab
realm = DMOSK.LOCAL
winbind enum groups = Yes
winbind enum users = Yes
idmap config * : rangesize = 1000000
idmap config * : range = 1000000-19999999
idmap config * : backend = autorid
* где:
- kerberos method — метод проверки kerberos. В данном примере сначала используется secretts.tdb, а затем системная таблица ключей.
- realm — сервер Active Directory. В нашем примере прописан домен, так как по нему можно обратиться к любому из серверов AD.
- winbind enum groups — задает пределы перечисления групп через setgrent(), getgrent() и endgrent().
- winbind enum users — задает пределы перечисления пользователей через setpwent(), getpwent()и endpwent().
- idmap config * : rangesize — определяет количество доступных uids и gids в каждом доменном диапазоне.
- idmap config * : range — определяет доступные совпадающие диапазоны uid и gid, для которых серверная часть является авторитетной.
- idmap config * : backend — задает idmap плагин для использования в качестве SID/uid/gid подсистемы
Вводим сервер в домен:
net ads join -U Administrator@dmosk.local
* где Administrator — учетная запись пользователя AD с правами на ввод компьютеров в домен; dmosk.local — наш домен.
Мы должны увидеть, примерно, следующее:
Using short domain name -- DMOSK
Joined 'SAMBA' to dns domain 'dmosk.local'
Разрешаем автозапуск winbind и стартуем его:
systemctl enable winbind --now
Выбираем профиль для аутентификации:
authselect select winbind --force
Проверяем, что наш сервер может получить список пользователей Active Directory:
wbinfo -u
... и групп:
wbinfo -g
Если мы увидели список пользователей и групп, то присоединение сервера к домену завершено.
После проверяем, что аутентификация в AD через модуль ntlm_auth работает корректно:
ntlm_auth --request-nt-key --domain=DMOSK.LOCAL --username=Administrator
* где DMOSK.LOCAL — наш домен; Administrator — пользователь, под которым будем логиниться для проверки работы модуля.
Настройка PPP для аутентификации через AD
Открываем конфигурационный файл options.xl2tpd:
vi /etc/ppp/options.xl2tpd
Добавляем в самый низ:
...
plugin winbind.so
ntlm_auth-helper '/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1 --require-membership-of="DMOSK\\VPN Users"'
* где VPN Users — группа в AD, пользователи который будут иметь возможность использовать VPN.
Перезапускаем xl2tpd:
systemctl restart xl2tpd
Проверка
В Active Directory добавляем группу VPN Users (если еще нет). Группа должна быть локальная в домене. В группу добавим пользователей, которым хотим дать доступ для VPN-подключения.
В настройках подключения к серверу меняем пользователя и пароль на доменные.
Диагностика проблем
Описанная выше настройка не предполагает наличие лога. Для этого открываем конфигурационный файл для ppp:
vi /etc/ppp/options.xl2tpd
Добавим:
...
logfile /var/log/xl2tpd/xl2tpd.log
debug
Создадим каталог для лога:
mkdir /var/log/xl2tpd
Перезапускаем сервис xl2tpd:
systemctl restart xl2tpd
Пробуем подключиться к серверу — в случае наличия проблем, наблюдаем за логом:
tail -f /var/log/xl2tpd/xl2tpd.log
Читайте также
Другие инструкции про VPN, которые могут быть полезны:
1. Настройка VPN-сервера xl2tp + racoon на CentOS 7
2. Установка и настройка L2TP VPN-сервера на Ubuntu Server
3. Как настроить сервер OpenVPN на Windows