klink0v (klink0v) wrote,
klink0v
klink0v

Categories:

Разобрался со swanctl, VICI, XFRM interface, route-based ipsec

Продолжаю свои изыскания на тему IPSec-а. На этот раз попал под раздачу "взрослый" Debian GNU/Linux со своим StrongSWAN. Захотелось посмотреть, можно ли организовывать "нормальную" удобную маршрутизацию через IPSec с Juniper-ом без использования GRE и Dummy-интерфейсов. Таки можно. Но требуется выполнение четырёх условий.


  1. Ядро 4.19 или более свежее.

  2. iproute2 версии 5.1.0 или более свежий.

  3. StrongSWAN версии 5.8.0 или более свежий.

  4. Конфиг для StrongSWAN писать в формате VICI, а не в "классическом" ipsec.conf

В актуальных версиях StongSWAN-а IKE-демон по имени Charon открывает UNIX-сокет, через который с ним могут общаться разные утилиты: давать команды и скармливать ему конфиги "на лету". В частности, для этого есть утилита "swanctl", плюс плагины для NetworkManager-а. Команды типа "ipsec блаблабла" нынче признаны устаревшими, поэтому ряд полезных фич через конфиг "ipsec.conf" попросту не поддерживается. Так что рано или поздно придется переходить на VICI / swanctl. Как оказалось, это совсем не больно, хотя немного помумукаться и пришлось.

Изначальная хотелка у меня была простая. Есть ноутбук, с которым я везде бегаю. Линуксовый, разумеется. Хочется прямо с него уметь цепляться в датацентр напрямую к Juniper-у. Чтобы не разворачивать дополнительно всякие сервера с OpenVPN и иже с ними. Собственно, рецепт ниже.

Сертификаты я генерировал при помощи старого доброго набора скриптов "Easy-RSA". Не смотрите на буквы "RSA", в эллиптику он тоже умеет. Как закачивать их на ждунипер, уже писал ранее. Далее просто куски конфигов как пример / шпаргалка / напоминашка. Я себе выделил "по-доброму" /29-подсеть. Дело вкуса. Понятно, можно делать как нравится.

Конфиг для Juniper-а.

"/etc/network/interfaces" (для DEB-based дистрибутивов)

"/etc/swanctl/conf.d/dc1.conf"

Также нужно разложить сертификатики и ключики по правильным папочкам. Для Debian-а это:
/etc/swanctl/x509ca
/etc/swanctl/x509
/etc/swanctl/private

Названия говорят сами за себя.

Закрытый EC-ключ придется генерировать либо самим StrongSWAN-ом, либо конвертировать в DER-формат, иначе не зохавает. Я еще наступил на грабли с AppArmor-ом. Дело в том, что из соображений паранойи я в "/etc" кладу не сами сертификаты-ключи, а символические ссылки на них. Файлы же лежат на отдельном ecryptfs-разделе в шифрованном виде (а то вдруг я опять ноутбук в электричке забуду). Так вот, читать их оттуда мешает AppArmor. Поэтому нужно также не забыть добавить в "/etc/apparmor.d/local/usr.sbin.swanctl" соответствующие разрешающие правила. Причём, для случая с ecryptfs ажно по две штуки каждого: для расшифрованного и для зашифрованного файла. Ну или отключить AppArmor.

Немного комментариев, на тему почему именно так, а не по-другому.

Выбор шифров. GCM-шифры являются более перспективными, не требуют аутентифицирующей подписи в ESP, соответственно дают меньший overhead. Но они доступны только в IKEv2. Раз уж берём IKEv2, то почему бы не взять более быстрые EC-алгоритмы вместо RSA. PRFSHA384 — потому что он захардкожен в Juniper-е и поменять там его нельзя. Если на противоположной стороне пытаться использовать что-то другое, то первая фаза просто не срастётся.

Директива "proxy-identity" в Juniper-е отличается от "traffic-selector" тем, что первая не добавляет автоматически маршруты в таблицы маршрутизации. Соответственно, её можно безболезненно применять для варианта "0.0.0.0/0". Что касается StrongSWAN-а, то там нужно обратить внимание на директивы "if_id_in" и "if_id_out". Это некий идентификатор интерфейса (линка), на который ссылаются XFRM-политики (можно посмотреть командами "ip -d link" и "ip xfrm policy"). Понятно, что оные циферки в настройках swanctl и iproute2 внезапно должны совпадать. Если такие директивы в конфиге swanctl есть, то он тоже не будет сам дописывать маршруты, а оставит их на совести iproute2. Поэтому тоже можно безболезненно писать "remote_ts = 0.0.0.0/0", а дальше уже разруливать средствами iproute2 так, как нам нравится.

Если выставлена настройка "start_action = start", то swanctl автомагически поднимет соединение в момент загрузки конфига. Но последнее тоже надо инициировать. Либо устанавливать пакетик "charon-systemd" (вот ни разу не очевидно), либо дёргать загрузку конфига ручками. Ну или через плагин для NetworkManager-а, кому что милее.

Пусть не смущает underlying interface = lo (dev lo) для настройки xfrm-интерфейса. Это глубоко пофигу, подойдет что угодно, главное чтобы он существовал. Эта настройка нужна только для сетевых карт, которые умеют в аппаратное ускорение (Offloading) IPSec. У вас такие есть? У меня тоже нет. Я даже не уверен, существуют ли таковые в природе.

MTU "внутри" тоннеля выставлен таким, потому что предполагается работа через провайдера, у которого для PPPoE почему-то спускается MTU=1480. Исходя из этого посчитан "внутренний" MTU. Тоннель, а не транспорт, потому что Juniper в Transport-mode IPSec попросту не умеет.

Вроде всё. Маловероятно, что мой опыт захочет повторить кто-нибудь ещё. Поэтому пишу больше для себя, на будущее. Но мало ли...

... Весьма символично, что талисманом всероссийской переписи населения выбран "Цыпа ВиПиН" (привет, VPN). Хотя, другой (не победивший) вариант под названием "Песец-переПисец" мне нравится намного больше. И похоже, не мне одному.

... Если к вам пришло что-то белое и пушистое, то знайте, для вас всё кончено. Это песец!!!11

Tags: hints, juniper, linux, безопасность, сети
Subscribe

  • Как у меня появилась собака

    ... Чуть больше года вместе со мной под одной крышей обитает рыжая хаски. Примерно через месяц ей исполнится семь лет. Под катом небольшая история о…

  • Редкий баг в PostgreSQL (на самом деле нет)

    ... Перетащили в бинарном виде базу данных PostgreSQL 12 с RHEL 7.7 на Ubuntu 20.04 LTS. На первый взгляд всё завелось без проблем. А вот на…

  • Какие сейчас есть нормальные GSM-шлюзы?

    Задача. Я параноик, поэтому всякие банковские и прочие чувствительные сервисы привязываю к SIM-карте: номер которой никто не знает; на которой…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments