X

Установка и настройка VPN сервера на CentOS 7

В этой статье я рассмотрю на практике полный алгоритм настройки 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 удобнее редактировать конфиг файлы.

yum install -y epel-release
yum install -y mc
yum install -y net-tools

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

mcedit /etc/sysconfig/selinux

меняем значение

SELINUX=disabled

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

sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config

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

SELinux status: disabled

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

yum install -y ppp pptp pptpd pptp-setup
chkconfig pptpd on

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

Файл /etc/pptpd.conf

cp /etc/pptpd.conf /etc/pptpd.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 серверу. В конце файла добавьте:

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

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

cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak
Файл /etc/ppp/chap-secrets
Редактирование данного файла преследует собою цель — указание логина и пароля для подключения к PPTP VPN серверу.

В примере ниже «user» и «pass» можно заменить на свои.

cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak
cat >/etc/ppp/chap-secrets<<EOF
user pptpd pass *
EOF
Устанавливаем права на файл паролей, чтобы только root его мог читать:
chmod 600 /etc/ppp/chap-secrets
Файл /etc/sysctl.conf

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

cp /etc/sysctl.conf /etc/sysctl.conf.bak

Перечитываем конфигурацию.

sysctl -p

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

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

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

systemctl stop firewalld
systemctl disable firewalld

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

yum install iptables-services iptables

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

systemctl enable iptables
chmod +x /etc/rc.d/rc.local

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

mcedit /etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [853:222169]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 1723 -j ACCEPT
-A INPUT -i eth0 -p gre -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p gre -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o ppp+ -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

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

service iptables save
service iptables restart
systemctl start pptpd

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

systemctl stop iptables

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

service iptables save

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

systemctl start iptables

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

iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables -I INPUT -s 172.16.0.0/24 -i ppp0 -j ACCEPT
iptables --append FORWARD --in-interface eth0 -j ACCEPT
Как видно, мы включаем маскарадинг для ppp0 и разрешаем обращаться к VPN интерфейсу клиентам из VPN сети. Обратите внимание, что 172.16.0.0/24 — локальная подсеть, которую вы себе выбрали, а ppp0 — имя pptp интерфейса.
Если вы решили не отключать firewalld и не использовать iptables, то вам потребуются следующие команды для настройки файрвола:
firewall-cmd --permanent --add-service=pptpd
firewall-cmd --permanent --add-port=1723/tcp
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --permanent --add-service=l2tpd
firewall-cmd --permanent --add-port=1701/udp
firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
Проверяем, запущен ли pptp-сервер:
ps ax | grep pptpd

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

netstat -an | grep -i listen

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

systemctl status pptpd

Настройка L2TP VPN

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

iptables -t filter -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable
iptables -t filter -A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT
iptables -t filter -A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable
Устанавливаем необходимые пакеты:
yum install -y xl2tpd libreswan lsof

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

cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.orig

Правим /etc/xl2tpd/xl2tpd.conf, указывая свои IP. В отличие от других серверов L2TP, xl2tpd может поддерживать пул IP-адресов без серверов DHCP или RADIUS.

В секцию [global] добавим (это обязательно для CentOS 6, не в 7.6 мне не потребовалось):

[global]
ipsec saref = yes
force userspace = yes

[lns default]
ip range = 172.21.118.2-172.21.118.254
local ip = 172.21.118.1
require authentication = yes
name = LinuxVPN
pppoptfile = /etc/ppp/options.xl2tpd

Для использования сервера 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
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
proxyarp
connect-delay 5000
name xl2tpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
persist
logfile /var/log/xl2tpd.log

Настройка 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:

#include /etc/ipsec.d/*.conf

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

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

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

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

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

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

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

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

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

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

mcedit /etc/ipsec.d/l2tp-ipsec.conf
conn L2TP-PSK-NAT
    rightsubnet=0.0.0.0/0
    dpddelay=10
    dpdtimeout=20
    dpdaction=clear
    forceencaps=yes
    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=1.1.1.1
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
где 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 (назначение мне осталось непонятно, используется крайне редко).

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

vim /etc/ipsec.d/default.secrets

: PSK "SecretKey"

Ключ может быть задан строкой в кавычках или шестнадцатеричным числом. В следующем примере PUT_VPN_SERVER_IP должен быть заменён на IP-адрес сервера. Можно использовать доменное имя, но оно не рекомендовано разработчиками LibreSwan. Опция %any позволяет любым клиентам использовать этот PSK. Также можно IP не указывать как в нашей конфигурации выше.

Примеры:

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

 

Прописываем в /etc/ppp/chap-secrets свои логины и пароли

vim /etc/ppp/chap-secrets
"user1" "xl2tpd" "pass1" *
"user2" "xl2tpd" "pass2" *

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

vim /etc/logrotate.d/xl2tpd
/var/log/xl2tpd.log {
missingok
compress
notifempty
weekly
rotate 2
create 0600 root root
}

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

systemctl enable ipsec
systemctl enable xl2tpd
systemctl start ipsec
systemctl start xl2tpd

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

[Посещений: 6 365, из них сегодня: 1]