Два провайдера. Правильная конфигурация таблицы маршрутизации.

Или, что следует сделать в первую очередь при подключении двух и более провайдеров к Linux роутеру.

В данном руководстве не рассматриваются:

  • распределение нагрузки между каналами;
  • автоматическое переключение между каналами.

Мы делаем первый, подготовительный шаг, который позволит в дальнейшем распределить и/или автоматически переключать трафик между провайдерами.

Дано

В наличии Linux машина, выполняющая функции роутера. У неё три интерфейса:

  • Eth0 – локальная сеть. IP0 –его IP адрес. NET0 – адрес сети.
  • Eth1 – подключён к первому провайдеру. IP1 — его IP адрес. NET1 – адрес сети. IPR1 – IP адрес роутера провайдера.
  • Eth2 – подключён ко второму провайдеру. IP2 — его IP адрес. NET2 – адрес сети. IPR2 – IP адрес роутера провайдера.

Маршрут по умолчанию через роутер первого провайдера R1.

Какая проблема у нас возникает, если всё оставить по умолчанию?

Предположим, что:

  1. Вы находитесь за пределами офиса и не можете подключиться к машине из локальной сети.
  2. Соединение с первым провайдером рухнуло.

Вам надо переключить трафик в ручном режиме, так что бы он начал идти через второго провайдера. Для этого достаточно изменить маршрут по умолчанию на 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 и хитрый роутинг.