LinuxForum.Fans
Тема

Непонятность с iproute2

Автор: Cruiser78 13 сообщений 5236 просмотров
#117375

Привет всем!

Наступил на непонятность с 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. Добавляю таблицы А, В и С. В и наполняю их нужным содержимым по следующей схеме:

text
#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

Я понимаю, что топология моей сети не сахар, но не я этот бамбук растил. Мне кабельная система досталось в наследство и есть ряд вещей, которые по объективным причинам мне не изменить (без больших финансовых затрат), топологию мне не переделать и точки доступа к инету не перенести. Приходится выкручиваться на логических настройках. И как выкрутиться в этом случае не понимаю.

#117388
Cruiser78 написал:

2. Есть интернет, до которому можно добраться через двух провайдеров. Но топология моей сети такова, что роутеры можно подключить не к одному интерфейсу, а один к eth1, другой - к eth0.
2. Для подключения второго роутера на плате eth0 поднят дополнительно виртуальный интерфейс eth0:1 со своей IP-сетью.

нераспарсил , ... это как вообще ? сформулируйте попонятней ...

... а так копать в сторону правильной настройки правил(rules) :lol: , уж слишком нетривиальная задача ... тыц и тыц

#117409
gramozeka написал:

нераспарсил , ... это как вообще ? сформулируйте попонятней ...

Не понял в чем вопрос. Попробу. еще раз. Есть хост. У хоста есть два физических интерфейса. Один (eth1) смотрит в сторону интернетного роутера. На нем поднята соответствующая IP-сеть, чтобы он видел роутер. Я в старотовом топике назвал её сетью А.
На втором интерфейсе (eth0) висит пользовательская локальная сеть. В стартовом топике названо сеть В. Пока всё просто и работает.
Не так давно я получил возможность подключить резервный Inet-канал. Но точка подключения расположена таким образом, что добраться до неё (без внесения серьезных изменений в кабельную систему) можно только по проводам именно локальной сети и, следовательно, второй роутер может повиснуть только на интерфейсе eth0. Решительно не хочу включать этот второй роутер в адресное пространство локальной сети. Решение простое - поднимаем на eth0 виртуальный интерфейс eth0:1 с новым адресом, принадлежащим третьей IP-сети, сети С. Новый роутер так же имеет адрес в этой сети С.
На выход все работает прекрасно. Потоки разделяются между роутерами как доктор прописал. Но мне надо обеспечить решение обратной задачи - обслуживать соединения из интернета. Здесь надо, чтобы ответы от сервера направлялись именно в тот роутер, откуда получен был запрос. Путь решения известен - iproute2. На каждый интерфейс (физический или логический, виртуальный) создаем отдельную таблицу с правилами маршрутизации. То есть, если пакеты приходят на сетевой адрес 192.168.1.2, до добавляем таблицу так:

[console]#ip rule add from 192.168.1.2 table 101[/console]
Если на адрес 192.168.2.2, то:
[console]#ip rule add from 192.168.2.2 table 102[/console]
И так далее.
Далее наполняем таблицы правилами. Во перых надо сказать об обслуживаемой интерфейсом сети (А,В или С в моем случае). Для этого пишем команду:
[console]#ip route add 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 table 101[/console]
После такой команды наш маршрутизатор знает об своей сети и не откидывает пакеты предназначенные для хостов этой сети на дефолтный для неё роутер (ох я и наплясался на этой грабле в свое время...). А дефолтный для данной IP-сети роутер (с традиционным адресом192.168.1ю1) задаем командой:
[console]#ip route add default via 192.168.1.1 table 101[/console]
Здесь всё просто и работает. Работает, если на одном физическом интерфейсе висит только одна IP-сеть. То есть у меня сеть А работает устойчиво.
А вот если на физическом интерфейсе висят две IP-сети (одна своя и вторая своя же, но виртуальная), вот тут и возникает путаница. Почему-то дефолтный машрут (глобальный), который служет для определения роутера, куда откидывать наши _исходящие_ пакеты (не ответные), перебивает правила, которые я задаю в таблицах, привязанных к интерфейсам. Или несмотря на то, что я при задании таблиц маршрутизации указал явно не имя интерфейса, а сетевой адрес, связанный с интерфейсом, система преобразовала этот адрес в интерфейс, причем похерила виртуализацию, то есть превратила eth0:1 в eth0. Считает это одним интерфейсом...
Как от этого избавиться - не понимаю.

#117413
Kettler написал:
http://sys.net.ru/docs/tri-provajdera-i-servera-vnutri-seti/
На скоко понял точто нужно.

Как понял надо схему откуда пришол оттуда и ушол.

вот и я об чём ... но ! ... у ТС не работает почему-то , почему не работает ? (вклучаю телепатию ... Connection refused ... oO )

вероятно тот кто заставляет ТС так извращаться редкостный жлоб и ханыга , таких нужно расстреливать из рогатки , привязав за конечности к ножкам эпического спортивного снаряда "козел" ... :D

#117414

gramozeka ну эт жестоко. Каждый извращяеться как хочет тут и красота linux.

#117418
Kettler написал:
http://sys.net.ru/docs/tri-provajdera-i-servera-vnutri-seti/
На скоко понял точто нужно.

Как понял надо схему откуда пришол оттуда и ушол.

Именно такую схему и реализую. Существенное отличие моего случая от описанного в данной статье - там все три сетевых интерфейса реальные, физические. У меня же один физический и он работает честно, без заморочек. А вот на втором физическом интерфейсе я вынужен поднять интерфейс виртуальный. И вот тут то и началась путаница с дефолтными маршрутами на виртуальном интерфейсе. "Глобальный" дефолтный маршрут перебивает, как я предполагаю, "локальный", привязанный к правилу "откуда пришел".
Видимо придется раскурить и iptables более тщательно.

#117419
gramozeka написал:
вероятно тот кто заставляет ТС так извращаться редкостный жлоб и ханыга , таких нужно расстреливать из рогатки , привязав за конечности к ножкам эпического спортивного снаряда "козел" ... :D

Ага, но я сам себе злобный буратино!!! :-)

#117423
Cruiser78 написал:
[quote=Kettler]http://sys.net.ru/docs/tri-provajdera-i-servera-vnutri-seti/
На скоко понял точто нужно.

Как понял надо схему откуда пришол оттуда и ушол.

Именно такую схему и реализую. Существенное отличие моего случая от описанного в данной статье - там все три сетевых интерфейса реальные, физические. У меня же один физический и он работает честно, без заморочек. А вот на втором физическом интерфейсе я вынужен поднять интерфейс виртуальный. И вот тут то и началась путаница с дефолтными маршрутами на виртуальном интерфейсе. "Глобальный" дефолтный маршрут перебивает, как я предполагаю, "локальный", привязанный к правилу "откуда пришел".
Видимо придется раскурить и iptables более тщательно.[/quote]

может стоит покурить и bind .? ... до кучи , так сказать , если не получается "в лоб" решить проблему , стоить поискать варианты синтеза [ИМХО] ...

#117424

Cruiser78 не замарачивайся и работай с виртуальными как с физическими.

#117437
Kettler написал:
Cruiser78 не замарачивайся и работай с виртуальными как с физическими.

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

ОНО меня игнорирует. Живет своей жизнью... :(

Да, всё это пока в виртуалке делаю, в CentOS 5.5.

Смотрю tcpdump'ом на трафик на нужном интерфейсе - хост мне явно отвечает на мои SYN-пакеты. Но вот ответы до меня не доходят. Пока главный дефолтный маршрут в другую сторону смотрит... Поставлю его на должный роутер - всё проходит замечательно... Но смотреть то надо в другую сторону по дефолту.
-----------------------------
Да, и еще одно, может самое важное - у меня два роутера. Первый DLINK-824. Я на нем непосредственно делаю форвардинг портов на нужный хост, например, приватный порт 22, внешний, пусть будет 4022. Хост в эту сторону работает на стандартных портах. А вот второй роутер (его поставил от больших щедрот провайдер) - TP-LINK 460. Эта зараза не знает ничего про трансляцию портов и прокидывает внешние порты во внутрь как они есть. С тем же номером. Это не проблема, устроить на хосту redirect несложно. Но вот что непонятно совершенно. И на первом, и на втором роутере есть порт, изменить номер которого никак нельзя - это 25, SMTP.
Так вот - если ремутно идти на этот порт telnet'ом, то он доступен по обоим маршрутам, и с первого провайдера, и со второго. А управление - ssh, 22-й порт у меня перенесен в другое место. И вот тут то и начинаются пляски с бубном. Первый роутер преобразует левый номер порта в 22й и получит правильный ответ. А вот второй - если пробросить вовнутрь 22й порт то опять же всё заработает. И, при этом, маркировка пакетов курит в сторонке, она на другие, на левые номера поставлена.
А вот если пробрасывать порт левый и делать ему редирект на хосту, то ответ можно получить только если главный дефолтный маршрут направить на этот роутер. А до того - индейское национальное жилище.
=================================
Дополнение 2. Версия о влиянии виртуального интерфейса отвергута. Заменил роутер TP-LINK (который не умеет делать редирект портов) на D-LINK 804й. Последнему сделать нужный мне редирект не сложно. В результате на хост приходят пакеты не с левым номером порта, а уже со стандартным. При этом поинтерфейсные маршрутные таблицы отрабатывают как положено. И пакеты отправляются туда, откуда они пришли. Проблема почти решена. Осталось одно - понять, как настроить систему таким образом, чтобы и редиректнутые непосредственно на хосту пакеты отправлялись именно отправителю, а не на глобальный дефолный гейт.

#117561
Cruiser78 написал:
[quote=Kettler]Cruiser78 не замарачивайся и работай с виртуальными как с физическими.

Осталось одно - понять, как настроить систему таким образом, чтобы и редиректнутые непосредственно на хосту пакеты отправлялись именно отправителю, а не на глобальный дефолный гейт.[/quote]
А метить (до редиректа) пакеты не пробывал на входе?
Ещё просьба если не жалко скрипт в личку просто люблю сохранять себе такие вещи.

#117587
Kettler написал:
А метить (до редиректа) пакеты не пробывал на входе?
Ещё просьба если не жалко скрипт в личку просто люблю сохранять себе такие вещи.

1. смысл метить на входе? Пакеты входные (SYN) нормально до хоста долетают на левый порт, на нем через iptables происходит редирект на правильный, на стандартный порт, служба, висящая на этом стандартном порту, пытается ответить соответствующим (SYN/ASK) пакетом, он возвращается на левый номер порта и дальше отлетает по глобальному дефолтному маршруту. То есть, если разобрать вывод tcpdump'а, то происходит следующее:
[console]remote-host:66666 -> host:4022 (SYN)
host:4022 -> remote-host:66666 (SYN/ASK)
[/console]
Ну а до моего ремутного хоста ответы не долетают. Если и метить пакеты, то не на входе, а на выходе. Но, увы, мечу, а эффекта положительного не вижу. По каким то причинам оно не срабатывает и помеченные пакеты в нужную таблицу маршрутизации не направляются.

2. О каком скрипте идет речь? Здесь, в обсуждаемой теме, нет никаких скриптов вообще.

Войдите или зарегистрируйтесь, чтобы ответить.