source address
2011-06-21 02:51Всплыла интересная задачка: на 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).
no subject
Date: 2011-09-14 11:58 (UTC)На домашней машинке пробовал назначить обратный адрес для маршрутизируемой IPv6 сети, получалось.