Некоторое время назад был рассмотрен простой OpenVPN-сервер, который позволял обеспечить защиту трафика при использовании небезопасных соединений с интернет. При всей простоте у OpenVPN есть один недостаток: необходимость установки дополнительного ПО на клиентские машины.
Для большинства популярных устройств (на Windows, Android и iOS) от этого недостатка свободен протокол L2TP. По умолчанию L2TP не использует шифрование, однако его можно использовать в связке с IPSec, инициализируемым с помощью PSK (Pre-shared Key - дополнительный ключ). Далее будет показано как можно быстро настроить IPSec L2TP-сервер с PSK на Ubuntu.
Для начала берём недорогую VPS с Ubuntu 16.04 и сразу устанавливаем на неё неободимые пакеты. Нам понадобятся:
- strongswan: для управления IPSec;
- xl2tpd: демон, который будет обслуживать L2TP-соединения;
- iptables-persistent: для управления правилами пакетного фильтра (файрволла);
- denyhosts: для защиты SSH от перебора пароля;
Устанавливаем:
apt-get install strongswan xl2tpd iptables-persistent denyhosts
Следующим шагом придумываем ключ для шифрования IPSec, например "Sup3rP4ss", и приведём файл "/etc/ipsec.secrets" к виду:
%any %any : PSK "Sup3rP4ss"
Далее открываем файл "/etc/ipsec.conf", удаляем всё его содержимое и заносим в него следующее:
config setup virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 nat_traversal=yes protostack=netkey conn l2tpvpn type=transport authby=secret pfs=no rekey=no keyingtries=1 left=%any leftprotoport=udp/l2tp leftid=@l2tpvpnserver right=%any rightprotoport=udp/%any auto=add
На этом настройка IPSec закончена. Остаётся перезапустить обслуживающий IPSec демон strongswan:
service strongswan restart
Приступаем к настройке xl2tpd. Основная часть его настроек находится в файле "/etc/xl2tpd/xl2tpd.conf", который нужно привести к виду:
[global] port = 1701 access control = no ipsec saref = yes force userspace = yes ; Файл с логинами и паролями auth file = /etc/ppp/chap-secrets [lns default] ; Диапазон адресов, динамически выдаваемых клиентам ; Мы ограничимся подсетью 172.28.253.64/26 ; Первую её часть оставим под статически привязанные к логинам адреса ; А вторая - динамический пул ip range = 172.28.253.96-172.28.253.126 ; IP-адрес на стороне сервера local ip = 172.28.253.65 ; Это имя используется в качестве ipparam при поиске логинов и паролей в auth file name = l2tpserver ; Файл с дополнительными опциями для ppp pppoptfile = /etc/ppp/options.xl2tpd flow bit = yes exclusive = no hidden bit = no length bit = yes require authentication = yes require chap = yes refuse pap = yes
Следующим на очереди у нас идёт файл "/etc/ppp/options.xl2tpd" В нём описываются дополнительные опции ppp. В нашем случае он будет иметь вид:
noccp auth crtscts mtu 1410 mru 1410 nodefaultroute lock noproxyarp silent modem asyncmap 0 hide-password require-mschap-v2 ms-dns 8.8.8.8 ms-dns 8.8.4.4
На этом настройка xl2tpd заканчивается. Перезапускаем процесс:
service xl2tpd restart
Приступаем к настройке пакетного фильтра (файрволла). Для удобства создадим скрипт "firewall.sh", в котором опишем все необходимые нам правила:
#!/bin/bash # Внешний интерфейс сервера IF_EXT="ens3" # Внутренние интерфейсы (обслуживающие ВПН-клиентов) IF_INT="ppp+" # Сеть, адреса из которой будут получать ВПН-клиенты NET_INT="172.28.253.64/26" # Сбрасываем все правила iptables -F iptables -F -t nat # Устанавливаем политики по умолчанию iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # Разрешаем весь трафик на петлевом интерфейсе iptables -A INPUT -i lo -j ACCEPT # Разрешаем всё для ВПН-клиентов iptables -A INPUT -i ${IF_INT} -s ${NET_INT} -j ACCEPT # Разрешаем входящие соединения к L2TP # Но только с шифрованием! iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT # Разрешаем IPSec iptables -A INPUT -p esp -j ACCEPT iptables -A INPUT -p ah -j ACCEPT iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT # Разрешаем доступ к серверу по SSH iptables -A INPUT -m tcp -p tcp --dport 22 -j ACCEPT # Разрешаем входящие ответы на исходящие соединения iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # NAT для локальной сети (ВПН-клиентов) iptables -t nat -A POSTROUTING -s ${NET_INT} -j MASQUERADE -o ${IF_EXT} iptables -A FORWARD -i ${IF_INT} -o ${IF_EXT} -s ${NET_INT} -j ACCEPT iptables -A FORWARD -i ${IF_EXT} -o ${IF_INT} -d ${NET_INT} -m state --state RELATED,ESTABLISHED -j ACCEPT
Применяем правила и сохраняем их для автоматической загрузки при старте системы:
bash firewall.sh netfilter-persistent save
Ещё надо включить саму возможность пересылки пакетов между интерфейсами. Делается это в файле "/etc/sysctl.conf" добавлением (или раскомментированием) строки:
net.ipv4.ip_forward=1
Чтобы эти изменения вступили в силу до перезагрузки нужно выполнить:
sysctl -p /etc/sysctl.conf
Остаётся обезопасить SSH от попыток перебора пароля и можно заводить пользователей. За это отвечает сервис "denyhosts", который блокирует IP-адреса, с которых идёт перебор паролей. В целом конфигурация по умолчанию (находится в файле "/etc/denyhosts.conf") нас вполне устроит. Единственный момент который стоит поправить: по умолчанию адреса блокируются навсегда. Лучше всё-таки их удалять из чёрного списка через несколько дней после блокировки:
PURGE_DENY = 3d
И перезапускаем сервис:
service denyhosts restart
Теперь можно заводить пользователей нашего VPN-сервера. Для этого нужно открыть в текстовом редакторе файл "/etc/ppp/chap-secrets" и добавлять примерно такие строки:
# "логин" имя_сервиса(ipparam) "пароль" "IP-клиента(опционально)" # Пользователь с постоянным IP-адресом: "user1" l2tpserver "D4dLMy44gc" "172.28.253.67" # Пользователь, получающий динамический адрес "user2" l2tpserver "HPg0dBZRxv"
На этом настройка сервера заканчивается и можно переходить к настройке клиентских устройств. На Android 7.0 нужно зайти в настройки VPN, выбрать пункт "добавить" и добавить соединение, указав тип соединения "L2TP/IPSec PSK", в качестве сервера указать IP-адрес нашей VPS, в качестве общего ключа IPsec - выбранную ранее ключевую фразу. Имя соединения - произвольное. Создав соединение сразу можно подключаться (потребуется ввести логин и пароль).
Следует помнить что на Android для использования штатного (встроенного в систему) VPN-клиента необходимо предварительно настроить блокировку экрана с помощью пароля, пин-кода, графического ключ, отпечатка пальца или какого-ещё доступного на вашем устройстве способа.
На Windows 10 настройки находятся в панели параметров: "Настройки сети", "VPN". Поля заполняются полностью аналогично Android. После чего так же можно сразу выполнять подключение.
На этом всё. Приятной работы!
Ladm 2018-05-18 12:30:05 (#)