Назад | Перейти на главную страницу

Указание предпочтительного маршрута при наличии нескольких ссылок на одну сеть

У меня есть сервер с несколькими интерфейсами и IP-адресами в одной сети. Я хотел бы, чтобы трафик, не относящийся к iSCSI, использовал исключительно один из интерфейсов, а трафик iSCSI - исключительно остальные интерфейсы. Ограничить трафик iSCSI подмножеством моих интерфейсов очень просто; Я просто не создаю записи в / var / lib / iscsi / ifaces / для интерфейсов, которые не хочу использовать. Однако я не уверен, что является хорошим подходом к ограничению трафика, не относящегося к ISCSI, одним интерфейсом. Что касается Linux, интерфейсы iSCSI и не iSCSI являются одинаково хорошими маршрутами к сети.

Вот пример конфигурации

Хранилище iSCSI имеет IP-адреса 172.16.50.70-78.

Сервер имеет следующие интерфейсы, адреса и маршруты.

$ ip route list
149.76.12.0/24 dev eth0  proto kernel  scope link  src 149.76.12.4
172.16.0.0/16 dev eth1  proto kernel  scope link  src 172.16.50.80 
172.16.0.0/16 dev eth2  proto kernel  scope link  src 172.16.50.81 
172.16.0.0/16 dev eth3  proto kernel  scope link  src 172.16.50.82
default via 149.76.12.1 dev eth0

Требуемая конфигурация - использовать eth3 для трафика, отличного от ISCSI, а eth1 и eth2 - для трафика iSCSI. Однако в настоящее время трафик, отличный от iSCSI, выходит из eth1.

$ ip route get to 172.16.50.90
172.16.50.90 dev eth1  src 172.16.50.80

(некоторые правки с момента публикации ниже)

В моей текущей конфигурации, если eth1 и eth2 полностью загружены, отправляя трафик iSCSI, мой не-iSCSI трафик будет конкурировать с трафиком iSCSI на eth1, пока eth3 простаивает.

Как я могу настроить Linux так, чтобы он предпочитал отправлять трафик в локальную сеть с использованием eth3, а не eth1 или eth2?

Я уже установил net.ipv4.conf.all.arp_ignore в 1 и net.ipv4.conf.all.arp_announce в 2. Это должно предотвратить перемещение моих IP-адресов между интерфейсами, например поток arp. Думаю, мне просто нужна помощь с маршрутизацией.

(больше правок)

Благодаря pfo я начал смотреть на метрики. Если я удалю маршруты и воссоздаю их с интерфейсами iSCSI, имеющими более высокую метрику, чем интерфейс без iSCSI, все будет работать так, как я хочу. Трафик iSCSI по-прежнему использует выделенные интерфейсы, и я не настраиваю статические маршруты к IP-адресам iSCSI. Весь остальной локальный трафик уходит через eth3. Теперь мне нужно выяснить, как правильно устанавливать метрики автоматически при открытии интерфейсов. Это на RHEL 5.5.

ip route delete to 172.16.0.0/16 dev eth1
ip route delete to 172.16.0.0/16 dev eth2
ip route delete to 172.16.0.0/16 dev eth3
ip route add to 172.16.0.0/16 dev eth1 src 172.16.50.80 metric 1
ip route add to 172.16.0.0/16 dev eth2 src 172.16.50.81 metric 1
ip route add to 172.16.0.0/16 dev eth3 src 172.16.50.82 metric 0

(последнее обновление)

Назначение другой метрики с использованием существующих сетевых скриптов RHEL кажется невозможным, https://bugzilla.redhat.com/show_bug.cgi?id=498472

Чтобы решить свою проблему, я написал nethook, демон, запускающий сценарии при изменении состояния сетевых интерфейсов в дистрибутивах на основе RHEL. У меня это работает этот сценарий для интерфейсов, метрику маршрута которых я хочу увеличить.

РЕДАКТИРОВАТЬ: я написал nethook до того, как узнал о ifup-local и ifdown-local. Вы, вероятно, можете использовать их вместо этого.

Есть некоторые вещи, о которых нужно позаботиться, когда вы используете хосты с несколькими адресами. Во-первых, вам нужно знать, как стек TCP / IP Linux будет обрабатывать несколько интерфейсов, находящихся в одной подсети, в отношении запросов и ответов ARP - этот параметр является интерфейсом arp_filter значение, которое вы можете запросить через sysctl(1) или /proc файловая система.

0 - (по умолчанию) стек TCP / IP будет отвечать на запросы ARP с адресами из других интерфейсов. Это может показаться неправильным, но обычно имеет смысл, потому что увеличивает шансы на успешное общение. IP-адреса принадлежат всему хосту в Linux, а не конкретным интерфейсам.

1 - Позволяет иметь несколько сетевых интерфейсов в одной подсети и получать ответы на запросы ARP для каждого интерфейса в зависимости от того, будет ли ядро ​​маршрутизировать пакет с IP-адреса ARP на этот интерфейс. Другими словами, он позволяет контролировать, какие сетевые адаптеры будут отвечать на запрос ARP и, наконец, разрешить выполнение ваших потоков TCP / IP.

Сначала вы должны включить arp_filter на всех интерфейсах, которые находятся в одной подсети, и вы можете легко добавить запись в свою таблицу маршрутизации для вашего портала iSCSI, чтобы использовать определенный iface и настроить метрику других интерфейсов так, чтобы один был предпочтительнее Другой.

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

Причина, по которой eth1 удален, заключается в том, что его IP-адрес имеет наименьшее числовое значение и выбран для связи с этой сетью.