В этой статье я рассмотрю на практике полный алгоритм настройки VPN сервера на примере CentOS 7.6. Мы одновременно включим и L2TP и PPTP сервер.
Для работы VPN в Linux необходимо настроить 3 слоя: IPsec, L2TP и PPP. Причем, PPP будет общий для L2TP и PPTP серверов. Настройка L2TP сложнее, чем PPTP. В ней:
- IPsec обеспечивает конфиденциальность сетевого соединения и авторизации клиента (системы)
- С L2TP туннель настроен так, что VPN трафик прозрачно проходит через IPsec
- 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
Редактирование данного файла преследует собою цель — указание DNS серверов.
В примере ниже гугловские, можно заменить на свои.
ms-dns 8.8.8.8
ms-dns 8.8.4.4
Также добавляем метод mschap2: require-mschap-v2
В примере ниже «user» и «pass» можно заменить на свои.
cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak
chmod 600 /etc/ppp/chap-secrets
Редактирование данного файла преследует собою цель — изменение значения «0» на «1» net.ipv4.ip_forward = 1.
Перечитываем конфигурацию.
На этом установка и настройка VPN PPTP сервера закончена.
Осталось только «разобраться» с файерволом.
Удаляем firewalld (если не удален или не отключен):
и вместо него ставим IPTABLES:
Включим автозапуск iptables:
Теперь процесс настройки IPTABLES подошёл к ответственному моменту — настройке конфигурации таблиц, включению маршрутизации и открытию TCP портов 1723 и 22. Необходимо добавить следующие строки в файл iptables:
mcedit /etc/sysconfig/iptables
Cохраняем и перезапускаем всё: файерволл и сервер PPTP VPN.
Обратите внимание, если при редактировании конфигурационного файла iptables не сохраняются настройки, а после перезагрузки файл принимает своё первоначальное значение, то для того, чтобы после редактирования файла изменения вступили в силу, необходимо перед редактированием отключить файервол iptables:
Затем отредактировать файл /etc/sysconfig/iptables, сохранить изменения
И, наконец, запустить сервиc
Обратите внимание, что 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
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
Проверяем, слушается ли наш порт:
Дополнительная команда для проверки статуса 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.