Добрый день коллеги,столкнулся с задачей которую никак не могу решить верно (с помощью одного роутера freebsd).
сеть состоит из 3-х хостов R0, R1, H1. Необходимо обеспечить доступность H1 по обоим ip адресам, пусть для простоты будет tcp 110, при этом строгое условие - H1 должен отправлять пакеты отправителю с того адреса на который получен запрос.
Схематично: https://c.radikal.ru/c33/2112/a8/c337fae01d2f.jpg
R0 (не изменяемая часть)
ip A.A.A.A/24
================================
R1 (em0) (alias делать запрещено)
ip A.A.A.A+1/24
gw A.A.A.AR1 (em2)
ip A.A.A.A+2/24
gw A.A.A.AR1 (em1)
ip B.B.B.B/24
=================================
H1 (em0)
ip B.B.B.B+1/24 alias0 ip B.B.B.B+2/24
gw B.B.B.B
Как видно классический PBR и NAT, эта задача решается fwd (next-hop, c подменой mac), давнешний конфиг для этого (nat отдельным демоном) :ipfw add 1000 divert 8778 ip from B.B.B.B+1 to any
ipfw add 1100 divert 8668 ip from B.B.B.B+2 to anyipfw add 3000 fwd A.A.A.A log ip from A.A.A.A+1 to any
ipfw add 3100 fwd A.A.A.A ip from A.A.A.A+2 to anyipfw add 4000 divert 8778 ip from any to A.A.A.A+1
ipfw add 4100 divert 8668 ip from any to A.A.A.A+2ipfw add 5000 allow ip from any to any
Данный конфиг работает отлично когда внешние шлюзы R1 разные, т.е. A.A.A.A и какой-нибудь С.С.С.С, но в задаче выше шлюз одинаковый (читай mac+ip). Отладка правил показывает, что ipfw корректно работает по правилам, но отправка пакета действием fwd идет по первому попавшемуся соответствию в таблице соответствия mac+ip. Т.е. в случае выше по default-gateway A.A.A.A через интерфейс em0. По em2 tcpdump показывает, что получает пакеты из вне, но отправка ответа идет через em0. При этом хост H1 доступен через em0.
Соответственно вопрос, как в данной задаче обеспечить доступность хоста H1 через оба адреса (интерфейса) и с использованием только одного роутера R1 на базе FreeBSD? Накиньте идей, кручусь возле net.fibs(setfib), но что-то никак.
P.S. повторюсь, неизменяемые условия: R0, настройки R1 в части адресов А.А.А.0/24.
На хосте H1 надо сделать дополнительную таблицу маршрутизации для второго интерфейса со своим шлюзом по умолчанию R1, тогда ответ на пакет пришедший на второй интерфейс будет отправляться с этого же интерфейса.
> На хосте H1 надо сделать дополнительную таблицу маршрутизации для второго интерфейса со
> своим шлюзом по умолчанию R1, тогда ответ на пакет пришедший на
> второй интерфейс будет отправляться с этого же интерфейса.гхм. поясните с адресацией, на мой взгляд ваше утверждение не верно. Как я понимаю решение о маршрутизации принимает R1 согласно своей таблицы маршрутизации. На это никак не может влиять H1. Т.е. вне зависимости от таблиц H1, R1 будет руководствоваться своей таблицей с той же проблемой mac+ip по первому найденному соответствию.
причем не зависимо как получен трафик через B.B.B.B или например D.D.D.D (если ввести дополнительную адресацию между R1 и H1, где D.D.D.D адрес R1 и шлюз по умолчанию для H1)
>[оверквотинг удален]
>> своим шлюзом по умолчанию R1, тогда ответ на пакет пришедший на
>> второй интерфейс будет отправляться с этого же интерфейса.
> гхм. поясните с адресацией, на мой взгляд ваше утверждение не верно. Как
> я понимаю решение о маршрутизации принимает R1 согласно своей таблицы маршрутизации.
> На это никак не может влиять H1. Т.е. вне зависимости от
> таблиц H1, R1 будет руководствоваться своей таблицей с той же проблемой
> mac+ip по первому найденному соответствию.
> причем не зависимо как получен трафик через B.B.B.B или например D.D.D.D (если
> ввести дополнительную адресацию между R1 и H1, где D.D.D.D адрес R1
> и шлюз по умолчанию для H1)man ipfw
ключевое слово setfib
Я с FreeBSD не работал и поэтому по синтаксису буду ошибаться.
На роутере вам надо поднять дополнительную таблицу маршрутизации с помощью setfib (?)
Что-то типа:setfib 1 route add default A.A.A.A via em2
В дефолтной таблице маршрутизации 0 у вас уже должен быть маршрут по умолчанию через A.A.A.A via em0
В правилах файрвола указать что-то типа:ipfw add 1100 setfib 1 divert 8668 ip from B.B.B.B+2 to anyчтобы пакеты с адреса B.B.B.B+2 и портами 8668 попадали во вторую таблицу маршрутизации.
ipfw add 4100 setfib 1 divert 8668 ip from any to A.A.A.A+2
Думаю идея понятна?Но это ещё не всё.
Пускай у вас приходит пакет на A.A.A.A+2 порт 8668, он отправляется на адрес B.B.B.B+2 и попадает на интерфейс em0_alias, но проблема в том что на хосте H1 только один шлюз по умолчанию через интерфейс em0, соответственно ответ с хоста H1 пойдет через интерфейс em0 с адресом B.B.B.B+1 и роутере R1 он не попадет в правила файрволла, так как правиломipfw add 1100 divert 8668 ip from B.B.B.B+2 to anyон ждет пакета с адреса B.B.B.B+2, а не B.B.B.B+1 для порта 8668