Настройка туннелей GRE и IPIP в Debian и Ubuntu

  • Автор:

gre-ipip-tunnels-debian-ubuntu-000.pngУдаленные подключения и объединения сетей остаются в тренде последние полтора года, когда события пандемии заставили пересмотреть многие подходы к работе и вызвали повышенный интерес к различным типам VPN-соединений. Все они имеют свои достоинства и недостатки, поэтому важно выбрать наиболее подходящее из них для решения определенной задачи. Если мы говорим о соединении нескольких площадок, имеющих выделенные IP-адреса, то наибольший интерес здесь представляют GRE и IPIP туннели, как наиболее простые и производительные. Сегодня мы рассмотрим их настройку в среде Linux, в частности в Debian и Ubuntu.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Краткий ликбез для тех, кто никогда не работал с данными протоколами. Это протоколы инкапсуляции, и они очень похожи друг на друга, GRE (Generic Routing Encapsulation - общая инкапсуляция маршрутов) разработан компанией Cisco и предназначен для инкапсуляции протоколов сетевого уровня (L3) в IP-пакеты. IPIP (IP Encapsulation within IP - инкапсуляция IP в IP) - также протокол инкапсуляции, но работает только с IPv4-трафиком. GRE имеет самое широкое распространение и поддержку множеством сетевых устройств и операционных систем, IPIP наиболее прост и имеет минимальные накладные расходы.

Данные протоколы не содержат никаких механизмов аутентификации и защиты данных, поэтому в настоящее время они используются только поверх IPsec и если речь сегодня идет о GRE или IPIP-туннеле, то скорее всего имеется ввиду GRE over IPsec или IPIP over IPSec. Также ни GRE, ни IPIP не используют порты (как и используемый для шифрования полезной нагрузки протокол ESP), поэтому не могут преодолевать NAT, что требует выделенных IP-адресов для каждого узла и ограничивает соединение единственным экземпляром.

Еще одна особенность GRE и IPIP - это протоколы без сохранения состояния соединения (stateless) и понять в каком состоянии находится туннель невозможно. Можно только настроить обе стороны и проверить передачу данных между ними. Но это имеет и свои плюсы - интерфейсы всегда присутствуют в системе, что облегчает настройку маршрутизации, а также отсутствуют проблемы, связанные с необходимостью переподключения и т.п.

В дальнейших примерах мы будем использовать следующую схему, а в качестве узлов будут выступать операционные системы Debian 10 и Ubuntu 20.04:

gre-ipip-tunnels-debian-ubuntu-001.pngСначала мы рассмотрим настройку самих туннелей и только убедившись в их работоспособности перейдем к защите с помощью IPsec.

Настройка туннелей GRE и IPIP в Debian

Для работы с GRE и IPIP туннелями нам потребуется загрузить специальные модули ядра, для этого откроем файл /etc/modules и внесем в него строки:

ip_gre
ipip

Если вы не собираетесь использовать один из протоколов, то его модуль можно не подключать. Для вступления изменений в силу компьютер следует перезагрузить. Если такой возможности нет, то можно временно загрузить модули вручную, командой modprobe, например, для GRE:

modprobe ip_gre

В Debian, как и во многих других основанных на нем дистрибутивах для настройки сети используется ifupdown, несмотря на то что система управляется systemd. Пока что это общепринятая практика и мы будем ее придерживаться. Поэтому откроем файл настроек /etc/network/interfaces и добавим в него следующую секцию:

auto gre30
iface gre30 inet tunnel
address 10.10.10.1
netmask 255.255.255.252
mode gre
local 198.51.100.1
endpoint 203.0.113.1
ttl 255

Где gre30 - имя интерфейса, его можно выбрать произвольно, можно даже дать осмысленное название, скажем gre-office-zavod.

Важно, не следует использовать имена gre0 и tunl0, они присваиваются автоматически созданным интерфейсам, что приведет к неработоспособности соединения.

Следующая строка указывает на то, что мы создаем туннельное соединение, опции address и netmask задают адрес внутри туннеля с нашей стороны. Обратите внимание, что мы используем сеть /30 (маска 255.255.255.252), потому что туннель - это соединение точка - точка и выделять для него сеть /24 будет расточительством, хотя ничего страшного в этом не будет, поступайте согласно собственной планировке адресного пространства сети.

Опция mode определяет тип туннеля, в нашем случае указано gre, для IPIP следует указать ipip. Внешний адрес нашей стороны туннеля содержится в опции local, endpoint - внешний адрес противоположной стороны.

Еще один важный момент - маршрутизация. С противоположного конца находится сеть 192.168.222.0/24 и нам нужно иметь туда доступ, поэтому в конце секции добавляем еще одну команду:

post-up ip route add 192.168.222.0/24 via 10.10.10.2

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

После внесения всех изменений перезапустим сеть командой:

systemctl restart networking 

И убедимся, что туннельный интерфейс нормально создался, например, можно использовать команду:

ip a

Для разрешения подключения в брандмауэре следует добавить следующие правила:

iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p ipip -j ACCEPT

Они очень просты и в комментариях не нуждаются.

Настройка туннелей GRE и IPIP в Ubuntu

Начиная с Ubuntu 18.04 для управления сетью используется netplan. Это создает свои особенности настройки туннельного интерфейса, но все остальное остается прежним. Вам точно также потребуется предварительно подключить модули ядра, добавив в /etc/modules строки:

ip_gre
ipip

И перезагрузить систему, если это нежелательно, временно загрузите модули с помощью modprobe, по одной команде для каждого модуля, например:

modprobe ipip

Сетевые настройки netplan хранятся в директории /etc/netplan, в силу сложной структуры yaml-файлов с многочисленными отступами сетевую конфигурацию удобнее хранить в отдельных файлах, которые загружаются в алфавитном порядке. Поэтому создадим новый файл конфигурации:

touch /etc/netplan/10-ipip-tunnel.yaml

И внесем в него следующее содержимое (не используйте для отступов табуляцию, только два или четыре пробела):

network:
version: 2
tunnels:
ipip30:
mode: ipip
remote: 198.51.100.1
local: 203.0.113.1
addresses:
- 10.10.10.2/30
routes:
- to: 192.168.111.0/24
via: 10.10.10.1

В этот раз мы настраиваем IPIP-туннель, о чем косвенно говорит его имя ipip30 (может быть любым), но тип туннеля задается параметром mode. Опции remote и local задают внешние адреса туннеля с нашей и противоположной стороны, addresses - внутренний адрес с нашей стороны туннеля. Как более современное и продвинутое решение netplan позволяет сразу указать маршрутную информацию в поле routes, где мы указали путь к сети 192.168.111.0/24 через противоположный конец туннеля.

Сохраняем файл конфигурации и генерируем сетевые параметры:

netplan generate

Затем применим конфигурацию в тестовом режиме:

netplan try

Это очень полезная функция, если в течении двух минут мы не подтвердим новые настройки netpaln вернет все как было. Теперь настраивать сеть на удаленных узлах можно не опасаясь потерять к ним доступ.

Для самых смелых есть возможность применить конфигурацию без тестирования:

netplan apply

В брандмауэре точно также нужно разрешить подключения по протоколам GRE и IPIP:

iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p ipip -j ACCEPT

Настроив туннель на обоих узлах убедитесь в его работоспособности, после чего можно переходить к следующему шагу - его защите.

Настройка IPsec для туннелей GRE и IPIP

Для работы с IPsec нам потребуется пакет strongSwan, установим его:

apt install strongswan

Затем откроем файл настроек /etc/ipsec.conf и добавим в него следующие две секции:

conn sts-base
fragmentation=yes
dpdaction=restart
ike=aes256-sha256-modp3072
esp=aes256-sha256-ecp256-modp3072
keyexchange=ikev2
type=transport
keyingtries=%forever

conn gre30
also=sts-base
left=198.51.100.1
leftauth=psk
right=203.0.113.1
rightauth=psk
auto=route

Первая секция sts-base задает общие параметры для соединений site-to-site, т.е. всех GRE и IPIP-туннелей, включая набор шифров, протокол обмена ключами (IKEv2) и режим работы (транспортный). При необходимости любой из этих параметров можно переопределить, указав непосредственно в секции соединения.

Вторая секция gre30 относится к самому соединению и первой строкой загружает параметры из общей секции, а затем уже указывает собственные. Параметры подключения делятся на левые и правые, следует твердо запомнить: левые параметры относятся к локальной системе, а правые - к удаленной. Параметр left задает внешний адрес локальной для IPsec подключения, а параметр leftauth - тип аутентификации с локальной стороны, в нашем случае это psk - предварительный общий ключ. Аналогичные настройки задают внешний адрес противоположной стороны и тип аутентификации удаленной системы.

Третий параметр auto - указывает на тип запуска соединения, в нашем случае используется route, с такой настройкой strongswan производит мониторинг трафика и устанавливает защищенное соедиенение только при наличии целевого трафика между указанными узлами. Таким образом, как только появится трафик от узла left к узлу right - он будет сразу же зашифрован IPsec, а трафик от right к left соотвественно расшифрован.

Сохраним настройки и перейдем к следующему файлу /etc/ipsec.secrets в котором укажем общий ключ для наших узлов:

198.51.100.1 203.0.113.1 : PSK "mySharedKey"

Общий ключ обеспечивает безопасность соединения, поэтому позаботьтесь о его секретности, а также не используйте в качестве ключа слабые последовательности и словарные фразы.

После того, как вы внесли все указанные выше изменения strongSwan следует перезапустить, в Debian используйте команду:

systemctl restart strongswan

В Ubuntu:

 systemctl restart strongswan-starter

На другой стороне следует выполнить аналогичные настройки, только поменять местами правую и левую стороны, в нашем случае отличаются только внешние адреса узлов.

После того как вы настроите IPsec на одной стороне связь с другой стороной пропадет и появится только после аналогичной настройки удаленного узла, только теперь наш туннель будет работать с защитой IPsec. Чтобы убедиться в том, что это именно так, можно изучить дамп трафика.

Вот так выглядит незащищенный IPIP - мы видим внешний IP-заголовок, внутренний IP-заголовок и полезную нагрузку (ICMP), все как на ладони:

gre-ipip-tunnels-debian-ubuntu-002.pngПосле включения IPsec картина будет иной, доступны будут только внешние IP-заголовки, остальное содержимое будет надежно зашифровано протоколом ESP, входящим в состав IPsec:

gre-ipip-tunnels-debian-ubuntu-003.pngТакже следует понимать, что в данном режиме при помощи IPsec будут шифроваться все соединения между узлами, а не только туннели.

Для нормальной работы защищенного соединения потребуется внести в брандмауэр дополнительные разрешающие правила для протоколов IKE и ESP:

iptables -A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

Указанные ранее разрешающие правила для протоколов GRE и IPIP более не нужны (так как они находятся теперь внутри IPsec) и их следует убрать.

Особенности настройки туннелей GRE и IPIP между Debian / Ubuntu и Mikrotik

Тему соединений GRE и IPIP для роутеров Mikrotik мы не так давно разбирали в отдельной статье, сегодня же поговорим об особенностях настройки туннелей где с одного конца будет Linux, а с другой RouterOS. Основная проблема кроется в том, что при использовании штатного механизма IPsec для туннельных соединений (и L2TP) политики IPsec создаются динамически, на основе политики по умолчанию и нет никакой возможности это поведение переопределить.

Отсюда следует несколько вариантов. Самый радикальный - не использовать штатные механизмы, а создать отдельное соединение IPsec для нужных узлов и уже поверх него развернуть нужный туннель. Но это требует определенных, причем достаточно глубоких знаний и опыта, в противном случае настроить и отладить такую схему будет затруднительно. Еще один вариант - изменить настройки IPsec по умолчанию, несмотря на то что это несколько проще вам все еще следует четко представлять последствия этого шага, так как изменение настроек по умолчанию может нарушить нормальную работу других служб, использующих IPsес.

Поэтому оставим описанные варианты для опытных пользователей и настроим IPsec так, чтобы была возможность работать с роутерами Mikrotik из коробки. Что нужно учесть в этом случае? Прежде всего протокол обмена ключами - по умолчанию это IKEv1. Затем шифры, их набор существенно отличается от тех, которые мы использовали в настройках выше. Чтобы ознакомиться с ними перейдем в IP - IPsec и изучим данные на закладках Proposals и Profiles:

gre-ipip-tunnels-debian-ubuntu-004.png

Таким образом, если отбросить совсем старый и ненадежный 3DES, то для IKE у нас практически не останется выбора: AES-128 - SHA1 - MODP-1024/2048, для ESP выбор немного больше, но только в части алгоритмов шифрования: AES-128/192/256 - SHA1 - MODP-1024. Кроме того, следует учитывать, что многие роутеры Mikrotik имеют достаточно слабый процессор и не поддерживают аппаратное шифрование, поэтому выбор сильных алгоритмов способен привести к высокой нагрузке на CPU и низкой производительности соединения. В большинстве случаев AES-128 будет вполне достаточно.

Вернемся на Linux сервер и добавим в /etc/ipsec.conf секцию для работы с Mikrotik:

conn mikrotik
also=sts-base
ike=aes128-sha1-modp2048
esp=aes128-sha1-modp1024
keyexchange=ikev1
left=198.51.100.1
leftauth=psk
right=203.0.113.1
rightauth=psk
auto=route

Принципиально она ничем не отличается от приведенных выше секций, мы также загружаем в нее параметры из общей секции sts-base, но переопределяем некоторые из них, которые касаются используемых шифров и протокола обмена ключами.

Каких-либо особенностей создания туннельного соединения со стороны Linux-сервера нет, а вот при создании туннеля в RouterOS следует убрать опцию Keepalive, в противном случае Mikrotik не будет считать соединение активным пока не получит пакет с противоположной стороны туннеля.

gre-ipip-tunnels-debian-ubuntu-005.pngВ терминале команда будет следующей для GRE:

/interface gre
add allow-fast-path=no ipsec-secret="My$ecret" !keepalive local-address=203.0.113.1 name=gre-tunnel1 remote-address=198.51.100.1

и IPIP:

/interface ipip
add allow-fast-path=no ipsec-secret="My$ecret" !keepalive local-address=203.0.113.1 name=gre-tunnel1 remote-address=198.51.100.1

В остальном настройки ничем не отличаются от соединения через туннели GRE и IPIP двух роутеров Mikrotik, и мы не будем рассматривать их в данной статье более подробно.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments