dadv (dadv) wrote,
dadv
dadv

Category:

source address

Всплыла интересная задачка: на 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).
Tags: carp, freebsd, ipfw, networking, setfib
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments