iproute2 :: Магия роутинга в Linux

Встала передо мной недавно, казалось бы, совсем заурядная задачка, настроить роутинг на хосте с двумя сетевыми интерфейсами, каждый из которого имеет свой шлюз и VLAN. После недолгого гугления (опрос знакомых UNIX-оидов не помог) нашел несколько советов по решению подобной задачи с помощью iproute2.

Итак, есть хост на котором 2 сетевых интерфейса в подсетях, к примеру, 192.168.0.0/24 (eth0 192.168.0.10) и 192.168.1.0/24 (eth1 192.168.1.10) соответсвенно, траффик с интерфейсов тегируется в разные VLAN-ы (для примера возьмем 100 и 200), в каждой сети свой шлюз, для простоты будем считать 192.168.0.1 и 192.168.1.1. Шлюз по-умолчанию 192.168.0.1.
Все, вроде бы хорошо и работает, но представим такую картину что у нас нет доступа к 100-му VLAN-у (запрещен доступ на маршрутизаторе, как в моем случае, оборвался кабель, сломался шлюз 192.168.0.1 или его шлюз 🙂 и т.д. и т.п.). В итоге мы получаем недоступную извне машину (ведь весь траффик (в том числе и ICMP echo-reply) пойдет на default gateway 192.168.0.1 и котороый недостепен! В общем случае стоит задача сделать машину доступной по обоим сетевым интерфейсам, независимо от доступности шлюза 192.168.0.1.
Решается это довольно просто непростыми средствами iproute2, если совсем вкратце «традиционная» маршрутизация в Linux и других Unix-системах состоит из одной единственной таблицы, которую мы можем созерцать в выводе команды route (или netstat -r) и не позволяет решить нашу задачу из-за наличия одного единственного маршрута по-умолчанию, куда весь трафик и отправляется. iproute2 может создавать несколько таблиц, трафик в которые попадает в зависимости от тех или иных условий (в нашем случае адрес источника)

echo "70 mytable" >> /etc/iproute2/rt_tables # создаем таблицу mytable
ip route flush table mytable # очищаем таблицу, от лукавого
ip route add table mytable to 192.168.1.0/24 dev eth1 # добавляем весь трафик подсети 192.168.1.0 в таблицу mytable
ip route add table mytable to default via 192.168.1.1 dev eth1 # прописываем шлюз по-умолчанию для этой таблицы
ip rule add from 192.168.1.0/24 table mytable priority 70 # устанавливаем приоритет
ip route flush cache

После чего траффик «ходит» правильно до первой перезагрузки 🙂 Можно конечно добавить эти команды в скрипт и вызывать из rc.local (признаться честно я так и делал сначала), но это не «Red Hat way». Почитав «Deployment Guide» понял куда копать и немногого погуглив нашел список рассылки CentOS.
Создаем таблицу (если не была создана на предыдущем шаге):

echo "70 mytable" >> /etc/iproute2/rt_tables

Создаем два файла:

/etc/sysconfig/network-scripts/rule-eth1:
from 192.168.1.0/24 table mytable # правила обработки траффика

/etc/sysconfig/network-scripts/route-eth1
8.8.8.8/32 via 192.168.1.1 dev eth1 # в первой сети у меня совсем все туго с доступом наружу, она management
default via 172.17.206.201 table mytable # маршрут по умолчанию
172.17.206.200/29 dev etv1 table mytable # весь трафик рулить в mytable

Раньше я боялся iproute2, считая его слишком сложным и для меня ненужным, но после экспериментов с tc, ip, а теперь и ss (да-да, это все из этого пакета) мнение мое поменялось, нет в этом ничего сложного 🙂

Комментарии запрещены.