Colobridge WIKI

Source based routing

Применимость: Linux, FreeBSD, Windows, Выделенный сервер, VDS-KVM, VDS-XEN

Слова для поиска: маршрутизация по источнику


Например на вашем сервере два отдельных интерфейса с двумя адресами из разных подсетей.

Шлюз по умолчанию (default gateway) в системе предусмотрен один. Доступен этот шлюз только для одной из подсетей и только по одному интерфейсу.

В случае обрыва связи между этим интерфейсном и шлюзом ваш сервер может стать недоступным.

Эта проблема может не касаться серверов которые подключены к маршрутизаторам с поддержкой VRRP.

Policy Based Routing - механизм реализации пересылки (forwarding)/ маршрутизации(routing) пакетов данных, основанный на политике из набора правил, определенной администраторами сети.

Policy Based Routing позволяет использовать множество альтернативных таблиц маршрутизации используемых по условию связанному со значением одного из полей IP ракета или маркеру который назначен iptables.

Один из вариантов Policy Based Routing - Source Based Routing.

При реализации этой политики маршрутизатор выбирает дальнейший путь следования пакетов данных по полю «адрес источника».

В нашем примере можно будет использовать альтернативную таблицу маршрутизацию для того, чтобы пакеты из резервного интерфейса использовали другую таблицу маршрутизации где шлюз по умолчанию расположен по другому адресу из подсети соответствующей адресу на этом интерфейсе.

Таким образом на нашем сервере будут работать два канала без зависимости от исправности другого канала.

Пример Source Based Routing

Например у вас есть второй интерфейс в сети 77.72.130.0/24

Я опишу два варианта для Centos и Debian

1. Установить пакет iproute

Centos:

yum install iproute

Debian:

apt-get install iproute

В некоторых дистрибутивах пакет может называться iproute2

2. Создать идентификатор для альтернативной таблицы маршрутизации

echo "300	net130" >> /etc/iproute2/rt_tables

Номер 300 выбран произвольно, главное, чтобы он не совпадал с другими номерами таблиц маршрутизации, имя net130 также дается произвольно.

Таблица будет доступна после перезагрузки системы и к ней можно будет обращаться по имени net130

3. Добавить параметры в таблицу маршрутизации net130

ip route add 77.72.130.0/24 dev eth1 table net130
ip route add default via 77.72.130.1 dev eth1 table net130

4. Создать и активировать политику маршрутизации пакетов из сети 77.72.130.0/24

ip rule add from 77.72.130.0/24 table net130

Смысл выполненных действий

Важно правильно понять смысл - изначально в системе была только одна таблица маршрутизации - main

Вы добавили еще одну - net130, а команда

ip route add default via 77.72.130.1 dev eth1 table net130

добавляет шлюз по умолчанию в таблицу net130 Теперь в системе два шлюза по умолчанию, а куда идти пакетам?

Нужно выполнить команду добавления правила чтобы пакеты из сети 77.72.130.0 использовали не main, а net130

ip rule add from 77.72.130.0/24 table net130

То есть в системе будет два шлюза по умолчанию и выбор производится по признаку источника пакетов

Основные команды для отладки:

Просмотреть все таблицы

ip r l t all

Посмотреть таблицу net130

ip r l t net130

Просмотреть правила

ip rule
Правила определенные упомянутыми выше командами потеряются при перезагрузке системы. Чтобы эти команды выполнялись автоматически нужно настроить конфигурационные файлы.

Примерно так должен выглядеть файл /etc/iproute2/rt_tables

/etc/iproute2/rt_tables

#
# reserved values
#
255	local
254	main
253	default
0	unspec
#
# local
#
#1	inr.ruhep
300     net130

Его форма одинакова для всех систем. А вот конфигурационные файлы для интерфейсов разные.

Centos:

/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
IPADDR=77.72.130.226
NETMASK=255.255.255.0

А этих файлов у вас нет, надо их создать:

/etc/sysconfig/network-scripts/route-eth1

77.72.130.0/24 dev eth1 table net130
default via 77.72.130.1 dev eth1 table net130

/etc/sysconfig/network-scripts/rule-eth1

prio 100 from 77.72.130.0/24 table net130

Debian

/etc/network/interface

auto lo eth0 eth1

iface lo inet loopback

iface eth0 inet static
address 77.72.131.126
netmask 255.255.255.0
gateway 77.72.131.1

iface eth1 inet static
 address 77.72.130.126
 netmask 255.255.255.0
 post-up ip route add 77.72.130.0/24 dev eth1 table net130
 post-up ip route add default via 77.72.130.1 dev eth1 table net130
 post-up ip rule add prio 100 from 77.72.130.0/24 table net130
 post-down ip rule del prio 100 from 77.72.130.0/24 table net130

Windows

Говорят, что Windows тоже может работать с несколькими равноправными внешними интерфейсами.

(Не проверял)

Для этого надо:

1. Отключить DeadGWDetect

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

Создать REG_DWORD EnableDeadGWDetect = 0 (нужна перезагрузка)

2. На все внешние интерфейсы назначить шлюзы с одинаковыми метриками. Интерфейсы должны быть на разных адаптерах, то есть несколько шлюзов (или несколько адресов и шлюзов) на одном интерфейсе не работают.

3. После перезагрузки проверить что таблица маршрутизации содержит все 0/0-маршруты с одинаковыми метриками.

Примечание: Иногда это может не работать