В этой статье я рассмотрю на практике полный алгоритм настройки VPN сервера на примере CentOS 7.6. Мы одновременно включим и L2TP и PPTP сервер.

Для работы VPN в Linux необходимо настроить 3 слоя: IPsec, L2TP и PPP. Причем, PPP будет общий для L2TP и PPTP серверов. Настройка L2TP сложнее, чем PPTP. В ней:

  1. IPsec обеспечивает конфиденциальность сетевого соединения и авторизации клиента (системы)
  2. С L2TP туннель настроен так, что VPN трафик прозрачно проходит через IPsec
  3. PPP (протокол точка-точка) контролирует авторизацию пользователей

Настройка VPN PPTP

Перед началом установки непосредственно сервера я рекомендую обновить пакеты и установить Midnight Commander (mc) и VestaCP для удобства. Вместе с VestaCP поставится большая часть пакетов, поэтому часть команд ниже будут излишними, не пугайтесь. В mc удобнее редактировать конфиг файлы.

  epel-release
  mc
  net-tools

Далее необходимо отключить Selinux.
Система принудительного контроля Selinux отключается правкой конфигурационного файла /etc/sysconfig/selinux.

mcedit etcsysconfigselinux

или заменяем значение командой sed:

   etcsysconfigselinux
   etcselinuxconfig

После перезагрузки проверьте статус SELinux командой «sestatus», Вы должны увидеть следующий вывод:

Переходим к установке PPTP VPN сервера и добавлении его в автозагрузку:

  ppp pptp pptpd pptp-setup
chkconfig pptpd on

Далее настройка конфигов из консоли (копируем, вставляем и жмём «Enter»). Перед началом редактирования бэкапим каждый файл.

 etcpptpd.conf etcpptpd.conf.bak

cat >/etc/pptpd.conf<<EOF
option /etc/ppp/options.pptpd
logwtmp
localip 172.16.0.1
remoteip 172.16.0.10-254
EOF

В этом файле

  • localip — ip адрес из выбранной вами подсети, который будет являться локальным шлюзом для клиентов VPN.
  • remoteip — пул ip адресов для раздачи клиентам VPN.

Если на вашей машине несколько внешних IP адресов, то вы можете указать конкретный IP, по которому будет доступно подключение к VPN серверу. В конце файла добавьте:

Файл /etc/ppp/options.pptpd
Редактирование данного файла преследует собою цель — указание DNS серверов.
В примере ниже гугловские, можно заменить на свои.

ms-dns 8.8.8.8
ms-dns 8.8.4.4

Также добавляем метод mschap2: require-mschap-v2

 etcpppoptions.pptpd etcpppoptions.pptpd.bak

cat >/etc/ppp/options.pptpd<<EOF
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 8.8.8.8
ms-dns 8.8.4.4
EOF

 etcpppchap-secrets etcpppchap-secrets.bak

Устанавливаем права на файл паролей, чтобы только root его мог читать:

  etcpppchap-secrets

Редактирование данного файла преследует собою цель — изменение значения «0» на «1» net.ipv4.ip_forward = 1.

 etcsysctl.conf etcsysctl.conf.bak

cat >/etc/sysctl.conf<<EOF
net.core.wmem_max = 12582912
net.core.rmem_max = 12582912
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_max = 12582912
net.core.rmem_max = 12582912
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_max = 12582912
net.core.rmem_max = 12582912
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.ipv4.ip_forward = 1
EOF

На этом установка и настройка VPN PPTP сервера закончена.

Осталось только «разобраться» с файерволом.

Удаляем firewalld (если не удален или не отключен):

systemctl stop firewalld
systemctl disable firewalld

и вместо него ставим IPTABLES:

 iptables-services iptables

Включим автозапуск iptables:

systemctl  iptables
 +x etcrc.drc.local

Теперь процесс настройки IPTABLES подошёл к ответственному моменту — настройке конфигурации таблиц, включению маршрутизации и открытию TCP портов 1723 и 22. Необходимо добавить следующие строки в файл iptables:

mcedit etcsysconfigiptables

Cохраняем и перезапускаем всё: файерволл и сервер PPTP VPN.

service iptables save
service iptables restart
systemctl start pptpd

Обратите внимание, если при редактировании конфигурационного файла iptables не сохраняются настройки, а после перезагрузки файл принимает своё первоначальное значение, то для того, чтобы после редактирования файла изменения вступили в силу, необходимо перед редактированием отключить файервол iptables:

Затем отредактировать файл /etc/sysconfig/iptables, сохранить изменения

И, наконец, запустить сервиc

Обратите внимание, что eth0 — имя вашего сетевого интерфейса. Вы можете узнать его с помощью команды ifconfig. Если вам необходимо, чтобы была локальная сеть между клиентами, подключенными к VPN, добавьте следующие правила в iptables путем выполнения следующих команд из консоли или непосредственно редактируя iptables файл (кому как нравится):

iptables  nat  POSTROUTING  ppp0  MASQUERADE
iptables  INPUT  172.16.0.0  ppp0  ACCEPT
iptables  FORWARD  eth0  ACCEPT

Как видно, мы включаем маскарадинг для ppp0 и разрешаем обращаться к VPN интерфейсу клиентам из VPN сети. Обратите внимание, что 172.16.0.0/24 — локальная подсеть, которую вы себе выбрали, а ppp0 — имя pptp интерфейса.

Если вы решили не отключать firewalld и не использовать iptables, то вам потребуются следующие команды для настройки файрвола:

Проверяем, запущен ли pptp-сервер:

Проверяем, слушается ли наш порт:

     listen

Дополнительная команда для проверки статуса pptpd:

Настройка L2TP VPN

Второй уровень, протокол туннелирования второго уровня (L2TP), настраивается намного проще, чем IPsec, поэтому начнем с него. L2TP абсолютно небезопасен и не должен быть доступен вне соединения IPsec. При использовании iptables, примените следующие правила, чтобы заблокировать все соединения L2TP вне ipsec:

iptables  filter  INPUT  udp  policy    ipsec  udp  l2tp  ACCEPT
iptables  filter  INPUT  udp  udp  l2tp  REJECT  icmp-port-unreachable
iptables  filter  OUTPUT  udp  policy  out  ipsec  udp  l2tp  ACCEPT
iptables  filter  OUTPUT  udp  udp  l2tp  REJECT  icmp-port-unreachable

Устанавливаем необходимые пакеты:

  xl2tpd libreswan lsof

Бэкапим дефолтный конфиг:

 etcxl2tpdxl2tpd.conf etcxl2tpdxl2tpd.conf.orig

Для использования сервера RADIUS или DHCP, оставьте отключенными опции ip range и local ip. Если соединение нестабильно, попробуйте добавить length bit = yes в раздел lns default. Чтобы не использовать PPP аутентификацию, замените require authentication = yes на refuse authentication = yes.

Создаем новый файл options.xl2tpd опций с таким содержимым:

mcedit /etc/ppp/options.xl2tpd

Настройка IPsec

Есть несколько вариантов и пакетов для настройки IPsec: ipsec-tools, LibreSwan (OpenSwan) и strongSwan. ipsec-tools (racoon) наименее функционален, но для тех, кто пришёл из *BSD, он может быть более близок. Однако, в отличие от *BSD, Linux не использует отдельный интерфейс для IPsec. strongSwan – это ответвление от FreeS/WAN. LibreSwan – ответвление от Openswan (который сам является ответвлением от FreeS/WAN) с сохранением его оригинальных разработчиков. Мы будем использовать именно LibreSwan, который мы уже ранее установили. Обход NAT установлен по умолчанию в файле конфигурации LibreSwan, таким образом никаких особых этапов настройки не требуется.

Желательно иметь каждую настройку VPN в своём собственном файле, что может быть сделано раскомментированием последней строки в /etc/ipsec.conf:

Основные конфигурационные файлы для это:

  • /etc/ipsec.conf – определяет параметры IPSEC-соединений и параметры подключений в целом;
  • /etc/ipsec.secrets – ключи и пароли для шифрования

Файл /etc/ipsec.conf разбит на разделы:

  • config setup – глобальные параметры и опции
  • conn %default – параметры ipsec-соединений по-умолчанию. Если в отдельных параметрах соединений не указан параметр, то используются параметры отсюда.

Например: conn SomeTunnel – раздел с параметрами соединения SomeTunnel

Файл /etc/ipsec.secrets содержит неограниченное количество типов ключей (паролей).

Основные параметры команды ipsec, которая управляет подключениями :

  • start|restart|stop;
  • ipsec status|statusall — для просмотра состояния IPSEC-соединений;
  • up|down|route|unroute — для управления IPSEC-соединений.

Логи хранятся в /var/log/auth.log и /var/log/daemon.log.

Создаем файл настроек с таким содержимым:

mcedit etcipsec.dl2tp-ipsec.conf
где 1.1.1.1 заменяем на ваш внешний IP.
  • conn L2TP-PSK-NAT – служебное слово conn означает название соединения. После него будут параметры, которые характеризуют соединение.
  • left= и right= – адреса хостов. Слова символизируют то, что хосты находятся с разных сторон. Не имеет значения, в какой из них вы впишете свой адрес, система автоматически определит, какой из адресов относится к ее интерфейсу. Поэтому на разных хостах вполне можно использовать одинаковый конфиг. Вместо адреса можно использовать ключевое слово %any в виде right=%any. Тогда можно будет подключаться с любого адреса. Так выглядит общая конфигурация, которую можно использовать:
    left=%defaultroute
    leftprotoport=udp/l2tp
    leftid=@vpn.example.com
    right=%any
    rightprotoport=udp/%any
  • type=tunnel – тип соединения. Может принимать значения tunnel, transport или passthrough.
  • authby=secret – что будет использоваться в качестве ключа: PSK (парольное слово) или RSA (ключ)
  • auto=start – опция определяет, когда включать соединение. Может принимать значения: start (автоматически стартовать), add (стартовать в ответ на инициацию от другого хоста), ignore (игнорировать соединение), manual (стартовать вручную), route (назначение мне осталось непонятно, используется крайне редко).

Ну и так как мы задали тип авторизации с помощью , то давайте запишем секретное слово в файл ..

 etcipsec.ddefault.secrets

: PSK "SecretKey"

PUT_VPN_SERVER_IP %any : PSK 0x87839cfdab5f74bc211de156d2902d128bec3243
# Или используйте простой текстовый ключ вместо шестнадцатеричного:
# PUT_VPN_SERVER_IP %any : PSK "password_pass"
 etcpppchap-secrets

Настроим logrotate для /var/log/xl2tpd.log

 etclogrotate.dxl2tpd

Запускаем и тестируем.

systemctl  ipsec
systemctl  xl2tpd
systemctl start ipsec
systemctl start xl2tpd

Можно все это проделать вручную, либо воспользоваться этим скриптом. Также можно воспользоваться другим универсальным скриптом для CentOS, Ubuntu и Debian — https://github.com/hwdsl2/setup-ipsec-vpn.

Читайте также:  Почтовый сервис — Джино • Хостинг