URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 83430
[ Назад ]

Исходное сообщение
"SOURCE ROUTING и DNAT на двух локальных интервесах"

Отправлено tetris , 21-Дек-08 10:48 

Здравствуйте знатоки.

Имеется сервак с двумя каналами в инет, на обоих настроен НАТ, прописаны близкие маршруты на каждого прова, подбит source routing:


iptables -t nat -A POSTROUTING -o FIRST_IF -j SNAT --to-source FIRST_IP
iptables -t nat -A POSTROUTING -o SECOND_IF -j SNAT --to-source SECOND_IP

ip route add FIRST_NET dev FIRST_IF src FIRST_I table FIRST
ip route add default via FIRST_GW table FIRST
ip rule add from FIRST_IP table FIRST

ip route add SECOND_NET dev SECOND_IF src FIRST_I table SECOND
ip route add default via SECOND_GW table SECOND
ip rule add from SECOND_IP table SECOND

В принципе класика, все работает, все устраивает НО.

Понадобилось тут пробросить порт:

iptables -t nat -A POSTROUTING -p tcp -d FIRST_IP --dport PORT -j DNAT --to-destination SECOND_IP:PORT

Ну и как вы понимаете это не работает приходит с FIRST_IP на PORT перекидывается на SECOND_IP PORT и уходит через SECOND_ROUTE.

Вот и все, на этом мои познания закончины прошу помощи, КАК?

PS просьба троллинг вида, а че за порт, а зачем это надо и т.д. и т.п., вообщем все что не касается конструктивного решения проблемы не писать.

PPS на фре я это сделал так:

ipfw add № fwd SECOND_IP,PORT all from any to FIRST_IP PORT in via FIRST_IP
ipfw add № tee SECOND_NAT all from SECOND_IP PORT to any out
ipfw add № divert FIRST_NAT ip from NET to any out via FIRST_IP


Содержание

Сообщения в этом обсуждении
"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено Oyyo , 21-Дек-08 11:27 
ну как говорится, читаем мануалы внимательней

POSTROUTING - исходящая цепочка, как понимаю нужно приходящий запрос направить на другую машину
>iptables -t nat -A POSTROUTING -p tcp -d FIRST_IP --dport PORT -j >DNAT --to-destination ECOND_IP:PORT

iptables -t nat -A PREROUTING -p tcp -d FIRST_IP --dport PORT -j DNAT --to-destination IP-на_который отправляем_например_192.168.2.2


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 21-Дек-08 11:35 
На правах автора:
http://www.opennet.me/openforum/vsluhforumID10/3679.html#4


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено ronin , 21-Дек-08 12:52 
Здравствуй,  tetris

я тоже вроде не эксперт, но помочь постараюсь, поскольку успешно сделал когда-то подобную вещь.

Но есть некоторые замечания:

>ip route add SECOND_NET dev SECOND_IF src FIRST_I table SECOND

а не ошибка ли здесь с src FIRST_I?

Почему-то напрашивается src SECOND_I...  (могу ошибаться - ещё не проснулся :-) )


>iptables -t nat -A POSTROUTING -p tcp -d FIRST_IP --dport PORT -j
>DNAT --to-destination SECOND_IP:PORT

А вот здесь явно "не альо":
DNAT-преобразование выполняется в цепочке PREROUTING, а не POSTROUTING. В цепочке POSTROUTING выполяется SNAT-преобразование.


Теперь по сути проблемы:

насколько я понял, необходимо пробросить порт с первого интерфейса на второй.
В этом случае вот что могу предложить:

iptables -t nat -A PREROUTING -i FIRST_I -p tcp -d FIRST_IP --dport PORT -j DNAT --to-destination SECOND_IP:PORT

ip route add client_ip via FIRST_GW dev FIRST_I table SECOND


здесь client_ip - это адрес клиента, который должен подключаться к сервису; подставь сюда целый субнет, если надо


Только что реализовал эту схему и проверил - работает.


Недостаток этой схемы - привязка роутинга к конкретным IP клиентов :-(
С другими клиентами получится что пакеты с SECOND_IP пойдут по SECOND_I согласно с правилом

ip route add default via SECOND_GW table SECOND

Как реализовать эту схему для произвольных IP клиентов ещё не придумал, но попробую. Думаю, того что я написал здесь будет достаточно для продолжения поиска (у меня есть идея заюзать таблицу MANGLE и таргеты MARK (iptables -t mangle -A PREROUTING -i FIRST_I -s 0/0 -d FIRST_IP -p tcp --dport PORT -m mark --mark 1) плюс роутинг в стиле "ip rule add fwmark 1 table mark ; ip route add default via FIRST_GW dev FIRST_I table mark", но пока что не добился положительных результатов).

Есть ещё идея отказаться от кренделей в iptables/routing и организовать всё с помощью xinetd и его опции redirect для конкретного сервиса (не пробовал сам, но это стандартная фича и должна работать).


respect,
ronin


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено tetris , 21-Дек-08 14:43 
Всем большое спасибо :-)

FOR PavelR
Попробую, ваше решение кажется наиболее вероятным, я пробовал MARK, но как я понял маркировка держется только до тех пор пока пакет не дош[о|ё]л до приложения, а потом увы :-(.
А как маркироват пакеты в бастионе до процесса выбора маршрута я не знаЛ.

FOR ronin
По поводу ваших замечаний насчет не точностей, ДА вы правы copy past понимаете ЛИ :-)
А дальше увы, client_ip это 0.0.0.0/0 :-), то есть уже не покатит.

xinetd можно конечно попробовать, но блин а если это там к примеру DNS, WEB или че то из этой же оперы.


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено ronin , 21-Дек-08 15:14 
>xinetd можно конечно попробовать, но блин а если это там к примеру
>DNS, WEB или че то из этой же оперы.

Дык какая разница какой там сервис? Необходимо просто "пробросить сокет". xinetd это может.
Возможно, это не самое оптимальное решение, но поскольку лучшего на данный момент нету, то придтся юзать то что есть.


>я пробовал MARK, но как я понял маркировка держется только до тех пор пока пакет не дош[о|ё]л до приложения, а потом увы

да, я тоже уперся рогами в это :-)
и, по ходу, не вижу никаких способов решить это

ещё одна идея - навесить на SECOND_I дополнительный IP алиас, сконфигурить службу чтоб слушала на нём, и на основном IP, а тогда добавить третью таблицу маршрутизации для этого алиаса:

ip rule add from SECOND_ALIAS table SECOND_A
ip route add default via FIRST_GW dev FIRTS_I table SECOND_A

ну, и DNAT-правило скорректировать на этот алиас

но тогда возникает вопрос: а не проще ли заставить саму службу слушать на обоих интерфейсах одновременно?


respect,
ronin


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 21-Дек-08 18:15 
>[оверквотинг удален]
>ip route add default via FIRST_GW dev FIRTS_I table SECOND_A
>
>ну, и DNAT-правило скорректировать на этот алиас
>
>но тогда возникает вопрос: а не проще ли заставить саму службу слушать
>на обоих интерфейсах одновременно?
>
>
>respect,
>ronin

а я типа для галочки написал доку и ссылку на неё парой сообщений выше зря кинул ?


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено ronin , 21-Дек-08 18:45 

>а я типа для галочки написал доку и ссылку на неё парой
>сообщений выше зря кинул ?

Ну, поленился я прочитать, каюсь :-)

Сейчас прочитал, согласен - CONNMARK --set-mark, CONNMARK --restore-mark - как раз то что надо.


respect,
ronin


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 21-Дек-08 19:00 
>[оверквотинг удален]
>>сообщений выше зря кинул ?
>
>Ну, поленился я прочитать, каюсь :-)
>
>Сейчас прочитал, согласен - CONNMARK --set-mark, CONNMARK --restore-mark - как раз то
>что надо.
>
>
>respect,
>ronin

написать проблему - влом, прочитать то что дали - влом. Смените род деятельности. Хотя даже дворы подметать Вам будет влом.

Именно от пох-зма  и "влом" и имеются национальные проблемы масштаба страны.

Все ждут пока за них проголосуют, выразят их мнение, разжуют и с ложечки покормят.


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено ronin , 21-Дек-08 20:19 
>
>написать проблему - влом, прочитать то что дали - влом. Смените род
>деятельности. Хотя даже дворы подметать Вам будет влом.
>
>Именно от пох-зма  и "влом" и имеются национальные проблемы масштаба страны.
>
>
>Все ждут пока за них проголосуют, выразят их мнение, разжуют и с
>ложечки покормят.

Попробую обьяснить. Когда я начал писать свой ответ, то ни Вашего ответа, ни предыдущего ещё не было. Пока я тут експериментировал и писал ответ прошло довольно много времени. Я увидел другие ответы только после того как отослал свой. Потому и ответы частично перекрываются, и оказалось что я "не в теме" :-) Это не из-за пох-зма и "влом".

респект,
ронин


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено tetris , 23-Дек-08 18:31 
Привет всем еще разок

А вот скажите мне Господа что мне мешает НЕ использовать source routing так как он предлагается в LARTC, а воспользоватся только технологией с CONNMARK:

ТО ЕСТЬ ВМЕСТО

ip route add FIRST_NET dev FIRST_IF src FIRST_IP table FIRST
ip route add default via FIRST_GW table FIRST
ip rule add from FIRST_IP table FIRST

ip route add SECOND_NET dev SECOND_IF src SECOND_IP table SECOND
ip route add default via SECOND_GW table SECOND
ip rule add from SECOND_IP table SECOND

ЮЗАЕМ

iptables -t mangle -A PREROUTING -i FIRST -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -i SECOND -j CONNMARK --set-mark 2
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

ip route add FIRST_NET dev FIRST_IF src FIRST_IP table FIRST
ip route add default via FIRST_GW table FIRST

ip route add SECOND_NET dev SECOND_IF src SECOND_IP table SECOND
ip route add default via SECOND_GW table SECOND

ip rule add fwmark 1 table FIRST
ip rule add fwmark 2 table SECOND

плюс с коробки избавляемся от проблем с DNAT'ом, что может вылезти при таком подходе?


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 23-Дек-08 19:57 
>[оверквотинг удален]
>ip route add default via FIRST_GW table FIRST
>
>ip route add SECOND_NET dev SECOND_IF src SECOND_IP table SECOND
>ip route add default via SECOND_GW table SECOND
>
>ip rule add fwmark 1 table FIRST
>ip rule add fwmark 2 table SECOND
>
>плюс с коробки избавляемся от проблем с DNAT'ом, что может вылезти при
>таком подходе?

Отсутствие правильной маршрутизации исходящих соединений.


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено tetris , 24-Дек-08 12:33 
И последнее для закрепления материала :-)

ОЧЕНЬ хотелось бы узнать как отрабатывают правила в таблицах маршрутизации.

Поясню, к примеру такой набор правил:

from 192.168.0.0/24 lookup first
fwmark 1 lookup second

Однеркой маркируются ПРИ ОПРЕДЕЛЕННЫХ УСЛОВИЯХ узлы из 192.168.0.0/24
Получается, как бы это правельно выразится перекрытие правил. Какое правило в этом случае отработает?


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 24-Дек-08 22:04 
>[оверквотинг удален]
>ОЧЕНЬ хотелось бы узнать как отрабатывают правила в таблицах маршрутизации.
>
>Поясню, к примеру такой набор правил:
>
>from 192.168.0.0/24 lookup first
>fwmark 1 lookup second
>
>Однеркой маркируются ПРИ ОПРЕДЕЛЕННЫХ УСЛОВИЯХ узлы из 192.168.0.0/24
>Получается, как бы это правельно выразится перекрытие правил. Какое правило в этом
>случае отработает?

если бы вы хоть раз набрали

ip ru sh

то вы бы увидели там preferences

from 192.168.0.0/24 lookup first  pref 100
fwmark 1 lookup second  pref 110


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено tetris , 25-Дек-08 07:37 
PavelR можно же и без понтов

У меня ip rule show выдает:

from 192.168.0.0/24 lookup first
fwmark 1 lookup second

Про ВЕС правила я знаю меня интересует как все это разруливается если ВЕС не задан рукам, как то же он(ВЕС) раставляется.

Раз уж пошла такая пьянка у меняк вам PavelR будет еще парочка вопросов:

Повторю схему

iptables -t mangle -A PREROUTING -i FIRST -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -i SECOND -j CONNMARK --set-mark 2
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

ip route add FIRST_NET dev FIRST_IF src FIRST_IP table FIRST
ip route add default via FIRST_GW table FIRST
ip rule add from FIRST_IP table FIRST

ip route add SECOND_NET dev SECOND_IF src SECOND_IP table SECOND
ip route add default via SECOND_GW table SECOND
ip rule add from SECOND_IP table SECOND

ip rule add fwmark 1 table FIRST
ip rule add fwmark 2 table SECOND

iptables -t nat -A PREROUTING -p tcp -d FIRST_IP --dport PORT -j DNAT --to-destination SECOND_IP:PORT

Первая проблема FIRST_IP и SECOND_IP это с внешки, а есть еще LAN_RANGE, и вот когда мы с LAN_RANGE пингуем/конектимся к FIRST_IP или к SECOND_IP, то пакеты из-за правил:

ip rule add from FIRST_IP table FIRST
ip rule add from SECOND_IP table SECOND

обламываются, естественно LAN_RANGE ответки не получит.
То есть это не проблема добавляем правила на LAN_RANGE и все работает:

ip rule add from FIRST_IP/SECOND_IP to LAN_RANGE table main

Но это нюанс который отнял у меня пол часа времени.

Вторая проблема это тот же DNAT, то есть source routing работает и CONNMARK тоже, а вот:

iptables -t nat -A PREROUTING -p tcp -d FIRST_IP --dport PORT -j DNAT --to-destination SECOND_IP:PORT

Уже нет :-(, такое впечатление что обратка от DNAT'а идет мима SNAT, то есть.
Цепляюсь с внешки на FIRST_IP PORT и на серваке запускаю tcpdump на интерфейсе FIRST_IFACE, получается такая картина:

tcpdump на FIRST_IFACE
         ....
xxx.xxx.xxx.xxx > FIRST_IP
xxx.xxx.xxx.xxx > FIRST_IP
xxx.xxx.xxx.xxx > FIRST_IP
SECOND_IP > xxx.xxx.xxx.xxx
SECOND_IP > xxx.xxx.xxx.xxx
SECOND_IP > xxx.xxx.xxx.xxx
         ....

SNAT
iptables -t nat -A POSTROUTING -o FIRST_IFACE -j SNAT --to-source FIRST_IP
iptables -t nat -A POSTROUTING -o SECOND_IFACE -j SNAT --to-source SECOND_IP

Вообщем я уже немного закипаю, нужна помощ


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 25-Дек-08 08:50 
>PavelR можно же и без понтов
>
>У меня ip rule show выдает:
>
>from 192.168.0.0/24 lookup first
>fwmark 1 lookup second

У меня выдает:

ch:~# ip ru sh
0:      from all lookup local
2000:   from xx.204.yy.0/20 lookup z1
2010:   from xx.204.yy.0/20 lookup z1
2020:   from xx.140.yy.0/20 lookup z1
32766:  from all lookup main
32767:  from all lookup default

Первый столбец - префы.

задаются так

/sbin/ip ru add from xx.204.yy.0/20 lookup z1 pref 2000
/sbin/ip ru add from xx.204.yy.0/22 lookup z1 pref 2010
/sbin/ip ru add from xx.140.yy.0/20 lookup z1 pref 2020

>[оверквотинг удален]
>Про ВЕС правила я знаю меня интересует как все это разруливается если
>ВЕС не задан рукам, как то же он(ВЕС) раставляется.
>
>Раз уж пошла такая пьянка у меняк вам PavelR будет еще парочка
>вопросов:
>
>Повторю схему
>Первая проблема FIRST_IP и SECOND_IP это с внешки, а есть еще LAN_RANGE,
>и вот когда мы с LAN_RANGE пингуем/конектимся к FIRST_IP или к
>SECOND_IP, то пакеты из-за правил:

..
>Но это нюанс который отнял у меня пол часа времени.

Известная проблема. Лечится организацией схемы так:


ch:~# ip ru sh
0:      from all lookup local
1000:  from all lookup main
2000:   from xx.204.yy.0/20 lookup z1
2010:   from xx.204.yy.0/20 lookup z1
2020:   from xx.140.yy.0/20 lookup z1
32766:  from all lookup main
32767:  from all lookup default

добавляем 1000 правило.

затем:
ip ro del default table main

и вносим его в table default

все внутренние подсетки прописываем в main.


// да, лучше наоборот, сначала добавить в default а потом удалить из main.

ну, так сказать стандартные правила игры с рутерами )

>[оверквотинг удален]
>SECOND_IP > xxx.xxx.xxx.xxx
>SECOND_IP > xxx.xxx.xxx.xxx
>SECOND_IP > xxx.xxx.xxx.xxx
>         ....
>
>SNAT
>iptables -t nat -A POSTROUTING -o FIRST_IFACE -j SNAT --to-source FIRST_IP
>iptables -t nat -A POSTROUTING -o SECOND_IFACE -j SNAT --to-source SECOND_IP
>
>Вообщем я уже немного закипаю, нужна помощ

AFAIK DNAT и SNAT никак не связаны в обработке. Посмотрите статейку, которую я писал и кидал ссылку на её копию в сообщении форума. Там описана схема: маркировки входящих пакетов, восстановление маркера и всё такое. Схема работоспособна. проверена и используется.


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено pavel_simple , 25-Дек-08 09:09 
просто маладца -- с таким опытом пора готовить серьёзную доку в wiki.opennet.ru -- я готов помочь(но думаю что она не понадобиться)

"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено PavelR , 25-Дек-08 10:11 
>просто маладца -- с таким опытом пора готовить серьёзную доку в wiki.opennet.ru
>-- я готов помочь(но думаю что она не понадобиться)

Да как-то мертвенько смотрится и вика,
и советы (в советах - не всегда грамотные советы, да и оформлены они в виде списка команд которые выполнить надо, без пояснения "почему так" и что делать если не так)
а в статьях фиг чего найдешь.

ИМХО.

// отправил на сайт свой текст по поводу "два провайдера и проброс соединений к сервисам, расположенным в локальной сети" - вот я хз где его теперь тут искать :))

И это при том, что я знаю что он точно тут есть )


"SOURCE ROUTING и DNAT на двух локальных интервесах"
Отправлено pavel_simple , 25-Дек-08 10:59 
>[оверквотинг удален]
>а в статьях фиг чего найдешь.
>
>ИМХО.
>
>// отправил на сайт свой текст по поводу "два провайдера и проброс
>соединений к сервисам, расположенным в локальной сети" - вот я хз
>где его теперь тут искать :))
>
>И это при том, что я знаю что он точно тут есть
>)

to Максим Чирков
ждём подтверждения и ссылку если текст удобен для размещения на ресурсе


"matrix"
Отправлено Andrey Mitrofanov , 25-Дек-08 11:36 
>соединений к сервисам, расположенным в локальной сети" - вот я хз
>где его теперь тут искать :))

Matrix has you, натурально. :)) Искать тут:
google.ru + "к сервисам, расположенным в локальной сети" site:opennet.ru + ENTER

>И это при том, что я знаю что он точно тут есть
>)

http://www.opennet.me/tips/info/1651.shtml
Не оно?


"matrix"
Отправлено PavelR , 25-Дек-08 12:17 
>[оверквотинг удален]
>>где его теперь тут искать :))
>
>Matrix has you, натурально. :)) Искать тут:
>google.ru + "к сервисам, расположенным в локальной сети" site:opennet.ru + ENTER
>
>>И это при том, что я знаю что он точно тут есть
>>)
>
>http://www.opennet.me/tips/info/1651.shtml
>Не оно?

Ага, оно.


Замечание:

Открываем http://www.opennet.me/tips/info/1651.shtml

внизу статьи навигационная полоса:
Раздел:    Корень / Администратору / Сетевая подсистема, маршрутизация / Туннелинг, VPN, VLAN


переходим  в http://www.opennet.me/tips/sml/84.shtml (Туннелинг, VPN, VLAN) - там его нет

А вот на уровень выше, в (Сетевая подсистема, маршрутизация ) http://www.opennet.me/tips/sml/62.shtml


есть...

Неправильный раздел.. Глюк ?