Настройка клиента L2TP over IPsec в CentOS 7

Введение

В предыдущей статьей была описана настройка 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.

Понравилась статья? Поделиться с друзьями:
Комментарии: 4
  1. Константин

    Хочу дополнить по пункту в настройках Strongswan
    right – обязательно указывать IP вместо DNS, иначе соединение не установится, т.к. не сможет отрезолвить домен
    если после
    right=”$SERVER_IP” – здесь можем указать DNS адрес
    дописать строку
    rightid=%any
    то будет работать с именами

  2. Валерий

    Большое спасибо, второй день пытаюсь клиента настроить, куча буквариков как настроить сервер, а как клиента почти ничего. Все заработало прекрасно :idea:

    1. admin (автор)

      Не за что! Рад, что пригодилось. Но советую обратить внимание на секъюрность, в этой статье шифры устаревшие.

  3. Алексей

    Спасибо огромное! Сколько же я промучился под Ubuntu, но к счастью перевел сервер на CentOS и среди немногих мануалов нашёлся Ваш!
    Всё заработало. Единственное — в моем случае “# lns – адрес сервера, тут можно указать DNS-адрес” не прошло, тоже пришлось указать IP.

    Еще раз спасибо за Ваш труд!

Добавить комментарий для Константин Отменить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: