Изоляция трафика разных сетей в пределах одной ОС распространена повсеместно. Для конечных пользователей она незаметна — в этом ее цель. Но знаешь ли ты, какие средства для разных уровней изоляции предоставляет ядро Linux и как ими воспользоваться самому, не рассчитывая на интегрированные средства управления вроде Docker? Давай разбираться.
Изоляцию частей сетевого стека можно использовать по-разному. Провайдеры предоставляют клиентам виртуальные выделенные линии и вынуждены как-то обходить конфликты адресов пользовательских сетей, чтобы агрегировать их трафик на одном устройстве. Админы и разработчики изолируют приложения в контейнерах, чтобы не запускать отдельную копию всей ОС в виртуальной машине, и контейнер взаимодействует с миром через виртуальный интерфейс, хотя ядро у всех контейнеров общее.
В этой статье предполагается, что у тебя свежее ядро — 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
В 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
За детальными инструкциями по работе с несколькими провайдерами можно обратиться к классическим lartc.org HOWTO или policyrouting.org, а за справкой по синтаксису — к man ip-rule
или моему руководству.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости