Евразийский
научный
журнал

Multihome IPv4 в Linux

Поделитесь статьей с друзьями:
Автор(ы): Сиднев Андрей Андреевич
Рубрика: Технические науки
Журнал: «Евразийский Научный Журнал №9 2016»  (сентябрь)
Количество просмотров статьи: 1468
Показать PDF версию Multihome IPv4 в Linux

Сиднев Андрей Андреевич
Магистр МГУПИ (МТУ), Россия, г. Москва
sidnev38@gmail.com

Как сделать так, чтобы компьютер отвечал в интернете на все свои IP-адреса по всем своим интерфейсам, каждый из которых имеет шлюз по умолчанию? (касается серверов и десктопов).

Есть достаточно статей про policy routing в Linux. Но они чаще всего разбирают общие, более тонкие и сложные случаи. Я же разберу тривиальный сценарий следующего вида:Безымянный.png

Нашему компьютеру (серверу) доступно три интерфейса, на каждом интерфейсе шлюз ему выдал IP. Если мы оставим эту конфигурацию как есть, то будет использоваться принцип «кто последний встал, того и дефолтный шлюз». Если последним поднимется нижний интерфейс (241), то в него будет отправляться весь трафик. Если к нашему серверу придёт запрос на первый интерфейс (188), то ответ на него всё равно пойдёт по нижнему. Другими словами, в обычном варианте будет работать только один интерфейс.

Общее решение — policy routing. Этот тип роутинга позволяет маршрутизировать пакеты на основании ряда достаточно гибких правил, в отличие от классического механизма маршрутизации destination-routing (роутинг на основании адреса назначения). Policy-routing применяется в случае наличия нескольких сетевых интерфейсов и необходимости отправлять определенные пакеты на определенный интерфейс.

Мы задаём три варианта маршрутизации трафика: «всё в eth0», «всё в eth1», «всё в eth2», дальше формулируем правила: трафик с IP первого интерфейса отправлять через первый вариант, трафик со второго IP — через второй вариант, третий IP — через третий.

В результате мы получаем такую конструкцию:

source: 188.188.188.188

в таблицу eth0-route

default via 188.188.1

via eth0

source: 75.75.75.75

в таблицу eth1-route

default via 75.75.75.1

via eth1

source: 241.241.241.241

в таблицу eth2-route

default via 241.241.241.1

via eth2

Настройка iroute2

Мы назовём наши таблицы маршрутизации eth0-route, eth1-route, eth2-route. Возьмём случайные символичные номера — 100, 101, 102.

echo 100 eth0-route >>/etc/iproute2/rt_tables

echo 101 eth1-route >>/etc/iproute2/rt_tables

echo 102 eth2-route >>/etc/iproute2/rt_tables

Настройка маршрутов в трёх таблицах маршрутизации

Для каждой таблицы зададим маршрут по умолчанию.

ip route add default via 188.188.188.1 dev eth0 table eth0-route

ip route add default via 75.75.75.1 dev eth1 table eth1-route

ip route add default via 241.241.241.1 dev eth2 table eth2-route

Включение policy routing

ip rule  add from 188.188.188.188 lookup eth0-route

ip rule  add from 75.75.75.75 lookup eth1-route

ip rule  add from 241.241.241.241 lookup eth2-route

С этого момента сервер начнёт отвечать по всем трём адресам. Приятная новость: policy routing имеет более высокий приоритет, чем dhcp'шный default route.

Замечание о маршрутизации: source routing в общем случае открывает уязвимость в системе, вам шлют пакет с фальшивым source, а вы его передаёте дальше, как будто так и надо, но эта уязвимость уровня directly connected. Кроме того, если вы ограничиваетесь только своим адресом в правилах, то linux такого не пропустит, плюс вам надо иметь включенную маршрутизацию. На обычном сервере такая конфигурация совершенно безопасна и довольно надёжна.