Срочная публикация научной статьи
+7 995 770 98 40
+7 995 202 54 42
info@journalpro.ru
Сиднев Андрей Андреевич
Магистр МГУПИ (МТУ), Россия, г. Москва
sidnev38@gmail.com
Как сделать так, чтобы компьютер отвечал в интернете на все свои IP-адреса по всем своим интерфейсам, каждый из которых имеет шлюз по умолчанию? (касается серверов и десктопов).
Есть достаточно статей про policy routing в Linux. Но они чаще всего разбирают общие, более тонкие и сложные случаи. Я же разберу тривиальный сценарий следующего вида:
Нашему компьютеру (серверу) доступно три интерфейса, на каждом интерфейсе шлюз ему выдал 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 такого не пропустит, плюс вам надо иметь включенную маршрутизацию. На обычном сервере такая конфигурация совершенно безопасна и довольно надёжна.