Несколько сетевых карт в Linux: как вернуть маршрут через установленный?

Несколько сетевых карт в Linux: как вернуть маршрут через установленный?

Если имеется хост Linux с двумя интерфейсами в двух разных сетях (основная сеть и сеть внешнего управления, назовем их «основная» и «mgmt»), как можно направить обратный трафик обратно через тот же интерфейс, с которого он пришел?

Другими словами: с того места, где я нахожусь, я прохожу через маршрутизатор, чтобы получить доступ либо к основному интерфейсу, либо к интерфейсу mgmt машины. Когда я подключаюсь по ssh к основному интерфейсу, проблем нет. Когда я подключаюсь по ssh к интерфейсу mgmt, мой пакет приходит на сервер, но сервер отправляет свой ответ обратно через шлюз по умолчанию, который находится на основном интерфейсе. Следовательно, мое соединение не устанавливается. Как мне заставить сервер отвечать на запросы через сеть mgmt, которые были получены в сети mgmt?

решение1

Большую часть ответа я нашел здесь:https://unix.stackexchange.com/questions/4420/reply-on-same-interface-as-incoming

Более подробная информация здесь:http://linux-ip.net/html/routing-tables.html

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

Следующий процесс работает у меня на Centos 7. Я не смог заставить его работать с NetworkManager, потому что NetworkManager не читает /etc/sysconfig/network-scripts/rule-*и route-*, и я не смог найти эквивалентную nmcliкоманду, чтобы сделать эти изменения постоянными. Если у кого-то есть такая команда, пожалуйста, поделитесь. Поэтому первым необходимым шагом является отключение NetworkManager:

systemctl disable NetworkManager
systemctl enable network
systemctl stop NetworkManager
systemctl start network

Ядра Linux 2.2 и 2.4 поддерживают несколько таблиц маршрутизации, каждая из которых пронумерована от 0 до 255. Обычно используются две таблицы маршрутизации: local(таблица маршрутизации 255) и main(таблица маршрутизации 254). Они перечислены в /etc/iproute2/rt_tables. Вы можете создать новую таблицу маршрутизации, выбрав неиспользуемый номер (см. в /etc/iproute2/rt_tables) и добавив его в /etc/iproute2/rt_tables.

В моем случае «основной» интерфейс — eth0192.168.20.20 со шлюзом 192.168.20.1, а интерфейс «mgmt» — eth1192.168.5.5 со шлюзом 192.168.5.1.

Я выбираю номер новой таблицы маршрутизации 200 и новое имя таблицы маршрутизации mgmt.

echo "200 mgmt" >> /etc/iproute2/rt_tables

Далее вам нужно создать правило для использования новой таблицы маршрутизации для трафика, полученного на интерфейсе mgmt. Другие ресурсы в Интернете говорят, что вам нужно сделать это только для одного интерфейса, но на самом деле вам нужно сделать это на обоих по следующей причине: обратите внимание, если вы поднимаете только один интерфейс, этот интерфейс может отвечать на ping, но если вы поднимаете оба интерфейса, тот, который вы подняли первым, отвечает на ping, а второй — нет. Это означает, что если вы поднимаете mgmtсначала интерфейс, а затем основной интерфейс, основной не будет отвечать. Поэтому хорошей практикой является определение правил на обоих интерфейсах.

Это можно сделать однократно (непостоянно) следующим образом:

ip rule add from 192.168.20.20 table main
ip route add default via 192.168.20.1 dev eth0 table main

ip rule add from 192.168.5.5 table mgmt
ip route add default via 192.168.5.1 dev eth1 table mgmt

На этом этапе оба интерфейса должны отвечать. Теперь, чтобы сделать его постоянным, обратите внимание, если вы читаете /etc/sysconfig/network-scripts/ifup-routes, он проанализирует все файлы rule-*и route-*и передаст каждую строку в качестве аргумента в ip rule addили ip route addсоответственно. Поэтому создайте четыре новых файла следующим образом:

echo "from 192.168.20.20 table main" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 192.168.20.1 dev eth0 table main" > /etc/sysconfig/network-scripts/route-eth0

echo "from 192.168.5.5 table mgmt" > /etc/sysconfig/network-scripts/rule-eth1
echo "default via 192.168.5.1 dev eth1 table mgmt" > /etc/sysconfig/network-scripts/route-eth1

После перезагрузки вы обнаружите, что оба интерфейса работают по умолчанию.

решение2

Маршрутизация на основе источника / ip rule.

Предположим, primaryчто есть 1.2.3.4и mgmtесть 2.3.4.5(а их шлюзами по умолчанию являются 1.2.3.1и 2.3.4.1соответственно):

ip rule add from 1.2.3.4 table 234
ip route add default via 1.2.3.1 dev primary table 234

(вышеуказанное необязательно)

ip rule add from 2.3.4.5 table 345
ip route add default via 2.3.4.1 dev mgmt table 345

Связанный контент