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

Обновлено и опубликовано Опубликовано:

Удобство L2TP заключается в возможности использовать встроенные средства Windows, Android, Mac OS для подключения к VPN-серверу. В данной инструкции рассмотрим процесс его установки и настройки на CentOS 8. Для реализации сервиса мы будем использовать strongswan + xl2tpd. В итоге мы получим:

  • VPN-сервер, использующий туннельный протокол L2TP.
  • Возможность подключения к серверу встроенными средствами Windows, Android, Mac OS X.
  • Защита соединения посредством общего ключа + аутентификация пользователя.
  • Доступ к локальной сети.
  • Аутентификацию через Active Directory.

Мы выполним следующие настройки:

Подготовка сервера

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 соединения

* где:

  • Имя подключения — произвольное имя для подключения.
  • Имя или адрес сервера — адрес сервера 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

Проверка подлинности через активный каталог от 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

4. Настройка сервера OpenVPN на CentOS 8

5. Настройка OpenVPN сервера на Mikrotik

# Active Directory # CentOS # Безопасность # Интернет # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет