В этой статье я рассмотрю на практике полный алгоритм настройки 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 |
1 2 3 4 5 6 7 8 9 | 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 мне не потребовалось):
1 2 3 4 5 6 7 8 9 10 | [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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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:
1 | #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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
1 2 | "user1" "xl2tpd" "pass1" * "user2" "xl2tpd" "pass2" * |
Настроим logrotate для /var/log/xl2tpd.log
vim /etc/logrotate.d/xl2tpd |
1 2 3 4 5 6 7 8 | /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.