Искусство изоляции. Изучаем механизмы изоляции трафика в Linux

Изоляция трафика разных сетей в пределах одной ОС распространена повсеместно. Для конечных пользователей она незаметна — в этом ее цель. Но знаешь ли ты, какие средства для разных уровней изоляции предоставляет ядро Linux и как ими воспользоваться самому, не рассчитывая на интегрированные средства управления вроде Docker? Давай разбираться.

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

INFO

В этой статье предполагается, что у тебя свежее ядро — 4.8 или новее.

Множественные таблицы маршрутизации

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

Таблица по умолчанию называется main, и ей присвоен номер 254. Именно в нее попадают маршруты, если добавить их с помощью ip route add или route без дополнительных параметров. Еще пара таблиц зарезервирована, а с остальными можно делать что хочешь.

Какая таблица для какого трафика будет использоваться, определяется правилами, ты можешь создать их с помощью ip rule add. Вывод ip rule show покажет правила по умолчанию:

$ ip rule show
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Символьные имена таблиц можно найти (и перенастроить) в файле /etc/iproute2/rt_tables. У правила про таблицу main (254) такой низкий приоритет, чтобы пользовательские таблицы с меньшими номерами обрабатывались до нее. Как видим, никакого особого статуса у main на самом деле нет, это правило можно было бы удалить или переопределить.

Таблица local, которая фигурирует в правиле 0, содержит специальные маршруты для локальных и широковещательных адресов. Например, присвоение адреса 192.0.2.1/24 интерфейсу eth0 создает вот такие маршруты в этой таблице:

broadcast 192.0.2.0 dev eth0 proto kernel scope link src 192.0.2.1
local 192.0.2.1 dev eth0 proto kernel scope host src 192.0.2.1
broadcast 192.0.2.255 dev eth0 proto kernel scope link src 192.0.2.1

Ядро управляет этой таблицей самостоятельно. Знать о ней полезно, но трогать в ней ничего не нужно.

Создаем свои таблицы

Новые таблицы создаются автоматически, если добавить в них маршрут. Указать таблицу можно опцией table:

$ sudo ip route add 203.0.113.0/24 via 192.0.2.10 table 200

Чтобы просмотреть маршруты в новой таблице, нужно добавить ту же опцию к ip route show.

$ ip route show table 200
203.0.113.0/24 via 192.0.2.1 dev eth0

INFO

В iproute2 все команды можно сокращать. Например: ip ro sh t 200.

Сами по себе таблицы не приносят никакой пользы — нужны правила, которые направят в них трафик.

Создаем правила

Правила создаются командой ip rule add. Самый распространенный вариант применения — source-based routing, к примеру отправка трафика разных сетей через разных провайдеров.

Предположим, что у нас есть локальная сеть 10.0.0.0/24 и мы хотим отправить ее трафик в интернет через маршрутизатор 192.0.2.10, а не основной маршрут по умолчанию. Это можно сделать командами

$ sudo ip route add default via 192.0.2.10 table 200
$ sudo ip rule add from 10.0.0.0/24 table 200

WWW

За детальными инструкциями по работе с несколькими провайдерами можно обратиться к классическим lartc.org HOWTO или policyrouting.org, а за справкой по синтаксису — к man ip-rule или моему руководству.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Даниил Батурин: @dmbaturin Координатор проекта VyOS (https://vyos.io), «языковед», функциональщик, иногда сетевой администратор

Комментарии (2)

  • Побольше бы такого материала! Качественно и тема годная.
    Благодарю автора, пиши еще!

  • вполне годная статья. хотя бы на подобных статьях редакции надо догонять остальной интернет.