Привет всем!
Наступил на непонятность с iproute2. А именно:
1. Есть хост с двумя физическими сетевыми платами (eth0 и eth1).
2. Есть интернет, до которому можно добраться через двух провайдеров. Но топология моей сети такова, что роутеры можно подключить не к одному интерфейсу, а один к eth1, другой - к eth0.
2. Для подключения второго роутера на плате eth0 поднят дополнительно виртуальный интерфейс eth0:1 со своей IP-сетью.
3. Таким образом имеем три IP-сети А (сеть роутера 1),В (локальная сеть) и С (сеть роутера 2), и нашим интерфейсам присвоены адреса А.2, В.2 и С.2. Адрес А.2 присвоен интерфейсу eth1, В.2 и С.2 интерфейсам eth0 и eth0:1 соответственно. Даю маршрут по умолчанию на хост (роутер локальной сети) В.1.
3. Далее решаю задачу, чтобы на пакеты, пришедшие на определенный интерфейс, отвечалось на определенные адреса своей сети или уходили на свой дефолтный роутер. То есть настраиваю таблицы маршрутизации в iproute2. Добавляю таблицы А, В и С. В и наполняю их нужным содержимым по следующей схеме:
#ip rule add from А.2 table А
#ip route add A.0/24 dev eth1 proto kernel scope link src A.2 table A
#ip route add default via A.1 dev eth1 table A
и так далее для всех интерфейсовИ всё начинает работать. В локальной сети. Но дальше, если начать стучаться на хост на "совмещенный" интерфейс из глобальной сети - начинаются чудеса. А именно - очень похоже, что дефолный маршрут сильно вляет на таблицы маршрутизации, на те "субдефолтные" маршруты, что внесены в "интерфейсные" таблицы маршрутизации виртуального интерфейса.
А именно, если глобальный дефолтный маршрут показывает на роутер В.1, то установить соединение с С.2 из интернета невозможно, пакеты SYN на интерфейс С.2 приходят, но ASK/SYN отправляются хостом, похоже, по дефолтному маршруту, на B.1. И дальше оно улетает в никуда. То есть игнорируется запись "default via С.1 dev eth0" в интерфейсной таблице маршрутизации.
Но если глобальный дефолтный маршрут установить на C.1 (тот роутер, через который хотим зайти на хост), то связь устанавливается. Но мне нужно иметь дефольный маршрут именно В.1, а не С.1.
Как наблюдение - если на физическом интерфейсе сидит один IP-адрес, А.2, то ему наши упражнения с дефолным маршрутом (выбор между В.1 или С.1) глубоко фиолетовы. От отливает свои пакеты именно туда, куда и прописано, а именно, в А.1.
Вопрос тривиальный - как вывернуться из такой ситуации? Как сказать системе, что дефолтные маршруты, заданные в таблицах поинтерфейсной маршрутизации, на виртуальных интерфейсах имет больший приоритет, чем обычный "глобальный" дефолтный маршрут? То есть надо обеспечить такую схему дефолтной маршрутизации (здесь введу слово replay)
default gateway = B.1 через интерфейс eth0.
replay gateway интерфейса eth0 (сеть В) = B.1
replay gateway интерфейса eth0:1 (сеть С) = С.1
replay gateway интерфейса eth1 (сеть А) = A.1
Я понимаю, что топология моей сети не сахар, но не я этот бамбук растил. Мне кабельная система досталось в наследство и есть ряд вещей, которые по объективным причинам мне не изменить (без больших финансовых затрат), топологию мне не переделать и точки доступа к инету не перенести. Приходится выкручиваться на логических настройках. И как выкрутиться в этом случае не понимаю.