dadv: (Default)
[personal profile] dadv

Всплыла интересная задачка: на FreeBSD с работающим CARP заставить определённое приложение ходить к одним сетям с виртуального IP-адреса протокола CARP, к другим с других IP-адресов. Само приложение такой гибкости не обеспечивает и работает с сетью, не привязываясь к конкретным IP-адресам.

Одно из решений для современных версий FreeBSD состоит в использовании дополнительной таблицы маршрутизации. Добавляем в неё маршрут по умолчанию и несколько специальных маршрутов:

setfib 1 route add default gw1
setfib 1 route add -iface -host target1 -link carp0:1.2.3.4.5.6
setfib 1 route add -iface -net  target2 -link carp0:1.2.3.4.5.6
ipfw add 10 fwd gw2 ip from any to target1 fib 1 out
ipfw add 20 fwd gw3 ip from any to target2 fib 1 out

И запускаем наше приложение, назначая ему эту таблицу маршрутизации:

setfib 1 /usr/local/etc/rc.d/srv start

Таким образом, для приложения маршруты на target1 и target2 лежат через интерфейс carp0 и поэтому адрес источника для пакетов, предназначенных этим точкам назначения, будет взят ядром с интерфейса carp0. Фейковый MAC-адрес 1:2:3:4:5:6 нужен для того, чтобы отключить работу протокола ARP для этих адресатов. Файрвол же устанавливает действительный адрес шлюза для пакетов, при этом gw2 и gw3 могут быть равны gw1, конечно.

Решение работает не только для сокетов TCP/UDP, но и вообще для любого IP-трафика. Например, для ICMP (приложение может захотеть мониторить targets при помощи echo-requests).

Date: 2011-07-24 10:29 (UTC)
From: [identity profile] pluknet.livejournal.com
Пообщайся с glebius@, у него грандиозные планы по ембендингу карповых IP в родительский интерфейс (типа алиасов, но не алиасы).

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios