Или, что следует сделать в первую очередь при подключении двух и более провайдеров к Linux роутеру.
В данном руководстве не рассматриваются:
- распределение нагрузки между каналами;
- автоматическое переключение между каналами.
Мы делаем первый, подготовительный шаг, который позволит в дальнейшем распределить и/или автоматически переключать трафик между провайдерами.
Дано
В наличии Linux машина, выполняющая функции роутера. У неё три интерфейса:
- Eth0 – локальная сеть. IP0 –его IP адрес. NET0 – адрес сети.
- Eth1 – подключён к первому провайдеру. IP1 — его IP адрес. NET1 – адрес сети. IPR1 – IP адрес роутера провайдера.
- Eth2 – подключён ко второму провайдеру. IP2 — его IP адрес. NET2 – адрес сети. IPR2 – IP адрес роутера провайдера.
Маршрут по умолчанию через роутер первого провайдера R1.
Какая проблема у нас возникает, если всё оставить по умолчанию?
Предположим, что:
- Вы находитесь за пределами офиса и не можете подключиться к машине из локальной сети.
- Соединение с первым провайдером рухнуло.
Вам надо переключить трафик в ручном режиме, так что бы он начал идти через второго провайдера. Для этого достаточно изменить маршрут по умолчанию на IPR2. Вы пытаетесь подключиться по ssh на IP2 и… у вас ничего не получается. Почему?
Пакет пришел на Eth2. Был передан демону ssh. Демон сформировал обратный пакет и отправил его на 3-й уровень для маршрутизации. Таблица маршрутизации выглядит следующим образом:
# ip r sh NET2 dev eth2 proto kernel scope link src IP2 NET1 dev eth1 proto kernel scope link src IP1 NET0 dev eth0 proto kernel scope link src IP0 default via IPR1 dev eth1
Куда будет отправлен пакет? Разумеется, по маршруту по умолчанию. Но у нас нет соединения с первый провайдером и ответ мы не получаем.
Т.е. пакеты к нам приходят, но мы не можем отправлять ответы обратно.
Решение
Предполагается, что перед выполнением приведённых ниже команд, вы определили соответствующие переменные. Например:
# IP0=192.168.0.1 # NET0=192.1678.0.0/24
И т.д.
Что бы всё заработало нам необходимо сделать так, чтобы все пакеты предназначенные для нашего Linux, приходящие на интерфейс Eth1 отправлялись обратно с интерфейса Eth1 на роутер первого провайдера IPR1. Пакеты, приходящие на интерфейс Eth2 отправлялись обратно с интерфейса Eth2 на роутер второго провайдера IPR2.
Создание дополнительных таблиц маршрутизации
Для начала создадим две дополнительные таблицы маршрутизации.
# echo “201 t1” >> /etc/iproute2/rt_tables # echo “202 t2” >> /etc/iproute2/rt_tables
Название таблицы и номер могут быть произвольными. Главное, что бы они не заменяли три стандартных таблицы, которые уже есть в этом файле.
Таблица t1 предназначена для обслуживания трафика на интерфейс Eth1. Таблица t2 для интерфейса Eth2.
Добавление маршрутов
Теперь в эти таблицы необходимо добавить информацию о подключенных к нашему роутеру сетях. Это обязательно. Решение о маршрутизации принимается на основании только одной таблицы маршрутизации и, если в ней не будет, например сети NET0, пакеты в эту сеть передаваться не будут. Отсутствие таких маршрутов — самая распространённая ошибка при использовании нескольких таблиц маршрутизации.
Сформируем таблицу маршрутизации t1. Сначала опишем сети подключённые непосредственно к сетевым интерфесам.
# ip r add $NET0 dev eth0 table t1 # ip r add $NET1 dev eth1 table t1 # ip r add $NET2 dev eth2 table t1
Маршрут по умолчанию в этой таблице должен ссылаться на роутер первого провайдера.
# ip r add default via $IPR1 dev eth1 table t1
Аналогично формируем таблицу маршрутизации t2. Маршрут по умолчанию через роутер второго провайдера.
# ip r add $NET0 dev eth0 table t2 # ip r add $NET1 dev eth1 table t2 # ip r add $NET2 dev eth2 table t2 # ip r add default via $IPR2 dev eth2 table t2
Таблица маршрутизации по умолчанию формируется автоматически, нам ничего с ней делать не надо.
Правила маршрутизации
Тут всё просто. Если IP source равен IP1, отправлять пакет в таблицу маршрутизации t1. Если IP source равен IP2, отправлять пакет в таблицу маршрутизации t2. Во всех остальных случаях использовать таблицу маршрутизации по умолчанию.
Поскольку по умолчанию используется таблица маршрутизации по умолчанию, достаточно создать всего два правила:
# ip rule add from $IP1 table t1 # ip rule add from $IP2 table t2
Конфигурационные файлы
Остался последний штрих – конфигурация системы так, чтобы всё что мы тут наваяли поднялось после перезагрузки сервера.
Конфигурация зависит от типа дистрибутива. Я покажу как это делается в CentOS и ему подобных.
Файл /etc/iproute2/rt_tables является «конфигурационным» и его достаточно отредактировать один раз.
Добавление маршрутов.
Обратите внимание на то, что в конфигурационных файлах нельзя использовать переменные, поэтому вместо IP1, NET2 и т.п. следует писать реальные IP адреса.
Переходим в директорию /etc/sysconfig/network-scripts и создаём три файла:
route-eth0
NET0 dev eth0 table t1 NET0 dev eth0 table t2
route-eth1
NET1 dev eth1 table t1 NET1 dev eth1 table t2 default via IPR1 dev eth1 table t1
route-eth2
NET2 dev eth1 table t1 NET2 dev eth1 table t2 default via IPR2 dev eth1 table t2
Каждый из вышеперечисленных файлов используется при поднятии соответствующего интерфейса. Если нет интерфейса, значит нет сети, подключённой к нему. Поднялся интерфейс – появились сети.
Правила маршрутизации добавляем в файл /etc/rc.d/rc.local.
ip rule add from IP1 table t1 ip rule add from IP2 table t2
Вот и все. Мы готовы к следующим шагам по настройке распределения нагрузки и автоматическому переключению каналов.
З.Ы. Про один из вариантов использования нескольких таблиц маршрутизации можно почитать в моем блоге: Open VPN и хитрый роутинг.