Введение
В предыдущей статьей была описана настройка L2TP/IPsec в маршрутизаторе Mikrotik. В той статье была настройка сервера и одного клиента под Windows для проверки, т.к. это просто и быстро. Для соединения через L2TP и IPsec клиентов на Linux уже нужно выполнить некоторые манипуляции, о которых расскажу ниже.
- xl2tpd – реализация L2TP
- strongswan – реализация IPsec
Последовательность настройки любая, но алгоритм подключения будет следующий: сначала устанавливается шифрованное соединение IPsec, а в нём уже поднимается L2TP, поэтому ниже будет инструкция по настройке strongswan для Centos 7.7:
yum install strongswan
Настройка IPsec (ikev1)
Использованы дефолтные и рекомендованные параметры в конфиге.
SERVER_IP=<IP-адрес сервера c IPsec>
/etc/strongswan/ipsec.conf
conn %default
lifetime=1h
margintime=9m
rekeyfuzz = 100%
keyingtries=1
keyexchange=ikev1
authby=secret
ike=aes128-sha1-modp2048!
esp=aes128-sha1-modp1024!
conn conn-ipsec
keyexchange=ikev1
#auto=add
authby=secret
type=transport
forceencaps = yes
leftprotoport=17/1701
rightprotoport=17/1701
right="$SERVER_IP"
auto=route # необходим для автоподнятия ipsec
dpdaction=restart
При настройке стоит обратить внимание на следующие параметры:
- lifetime, margintime и rekeyfuzz – параметры для времени переподключения, т.к. используется IKEv1, где reauth происходит всегда. На клиенте и сервере lifetime могут быть разными, но лучше устанавливать всё одинаково во избежание несогласованности.
- right – обязательно указывать IP вместо DNS, иначе соединение не установится, т.к. не сможет отрезолвить домен
- auto и dpdaction – очень важны для поднятия соединения в случае реконнекта
- ike & esp – установить шифры, которые указаны на сервере
- forceencaps = yes – без этого параметра на Debian 11 туннель ipsec отваливался
С используемыми шифрами ike и esp стоит поиграться и выбрать для себя наиболее оптимальные по части безопасности и скорости работы, не стоит копировать бездумно. В данной статье шифры для примера, не стоит использовать в продакшене
Далее указывается секретный ключ IPsec:
/etc/strongswan/ipsec.secrets
: PSK <суперсекретный ключ на Mikrotik>
На этом настройка закончена и можно переходить к xl2tpd.
Настройка L2TP
yum install xl2tpd
/etc/xl2tpd/xl2tpd.conf
[lac conn-l2tp]
lns = "$SERVER_IP"
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
redial = yes
redial timeout = 10
autodial = yes
- # redial, redial timeout и autodial – опять же для реконнекта
- # lac – имя соединения для его установления
- # lns – адрес сервера, тут можно указать DNS-адрес
/etc/ppp/options.l2tpd.client
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-mschap-v2
noccp
noauth
mtu 1450
mru 1450
noipdefault
connect-delay 5000
name CLIENT_LOGIN
password CLIENT_PASSWORD
- # require-mschap-v2 – установить, если используется mschap-v2 в настройках L2TP сервера на Mikrotik
- name & password – логин\пароль профайла на Mikrotik
Подключение
Создается директория для PID файла и управления xl2tpd:
mkdir -p /var/run/xl2tpd && touch /var/run/xl2tpd/l2tp-control
Перезагружаются сервисы:
systemctl restart strongswan && systemctl restart xl2tpd
Запуск IPsec:
strongswan up conn-ipsec
Запуск L2TP:
echo "c conn-l2tp" > /var/run/xl2tpd/l2tp-control
Теперь можно проверить, что соединение установилось, появился интерфейс ppp с клиентским IP:
ip a
ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UNKNOWN group default qlen 3
link/ppp
inet 10.0.10.2 peer 10.0.10.25/32 scope global ppp0
valid_lft forever preferred_lft forever
Настройка маршрутов
Соединение есть, но для доступа к нужным подсетям по этому соединению необходимо прописать необходимые маршруты. По-хорошему, для автоматического добавления маршрутов в подсети офиса в скрипте /etc/ppp/ip-up в конец файла прописано несколько маршрутов. Несмотря на то, что в этом файле сказано, что добавлять файлы нужно в /etc/ppp/ip-up.local, такой вариант не сработал, поэтому маршруты добавляются в ip-up прямо в конце файла:
/etc/ppp/ip-up
#!/bin/bash
# This file should not be modified -- make local changes to
# /etc/ppp/ip-up.local instead
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
LOGDEVICE=$6
REALDEVICE=$1
[ -f /etc/sysconfig/network-scripts/ifcfg-${LOGDEVICE} ] && /etc/sysconfig/network-scripts/ifup-post --realdevice ${REALDEVICE} ifcfg-${LOGDEVICE}
/etc/ppp/ip-up.ipv6to4 ${LOGDEVICE}
[ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local "$@"
if [ $5 = "10.0.10.25" ]
then
ip route add 192.168.34.0/24 via 10.0.10.2
ip route add 10.10.12.0/24 via 10.0.10.2
ip route add 192.168.30.0/24 via 10.0.10.2
ip route add 192.168.178.0/24 via 10.0.10.2
ip route add 192.168.79.0/24 via 10.0.10.2
fi
exit 0
Когда ppp связь установлена, этот скрипт вызывается со следующими параметрами:
$1 - имя интерфейса, используемое pppd (напр. ppp3)
$2 - имя устройства tty
$3 - скорость устройства tty
$4 - локальный IP адрес для интерфейса
$5 - удаленный IP адрес
$6 - параметр, указанный опцией 'ipparam' в pppd
Ручное управление
На данном этапе L2TP и IPsec поднимаются автоматически в случае рестарта машины или отвалившегося интернета, но если вдруг возникнет необходимость вручную управлять соединениями, то нужно выполнить следующее для остановки L2TP:
Остановка L2TP:
echo "d conn-l2tp" > /var/run/xl2tpd/l2tp-control
Остановка IPsec:
strongswan down conn-ipsec
Или же воспользоваться командами systemd по перезагрузке сервисов.
Выявлено в процессе работы: при перезагрузке сервера (Mikrotik), к которому происходит подключение, соединение сбрасывается и нужно вручную перезагружать ipsec и l2tp на клиенте.
Проблема по идее кроется во времени reauth, поэтому нужно выставить рекомендуемые параметры lifetime на сервере и клиенте, а также ознакомиться с документацией. В моём случае всё сработало при параметре auto=route в конфиге strongswan.
Хочу дополнить по пункту в настройках Strongswan
right – обязательно указывать IP вместо DNS, иначе соединение не установится, т.к. не сможет отрезолвить домен
если после
right=”$SERVER_IP” – здесь можем указать DNS адрес
дописать строку
rightid=%any
то будет работать с именами
Большое спасибо, второй день пытаюсь клиента настроить, куча буквариков как настроить сервер, а как клиента почти ничего. Все заработало прекрасно
Не за что! Рад, что пригодилось. Но советую обратить внимание на секъюрность, в этой статье шифры устаревшие.
Спасибо огромное! Сколько же я промучился под Ubuntu, но к счастью перевел сервер на CentOS и среди немногих мануалов нашёлся Ваш!
Всё заработало. Единственное — в моем случае “# lns – адрес сервера, тут можно указать DNS-адрес” не прошло, тоже пришлось указать IP.
Еще раз спасибо за Ваш труд!