У меня есть сервер с несколькими интерфейсами и 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-адрес имеет наименьшее числовое значение и выбран для связи с этой сетью.