Дано: Плоский Ethernet-сегмент, в который входит несколько роутеров (рассчитываем на ~10 штук), типа точки обмена трафиком, но не она. Есть IBGP, OSPF, куча маршрутов. IPv4 Only (пока). Маршрутизаторы разные - Cisco, PS.... в перспективе - что угодно.В эту сеть смотрит ОДНИМ ИНТЕРФЕЙСОМ маршрутизатор на базе FreeBSD 7.0 (бордер между OSPF-сегментом и BGP).
Задача:
В исходящей цепочке правил проверять next-hop пакета.
Подробнее:
Через интерфес выходят пакеты, которые дальше пойдут через разные маршрутизаторы. Кто-то через 192.168.1.1, кто-то через 192.168.1.2 и т.д. В зависимости от того, через какой маршрутизатор они дальше пойдут должна проводиться различная обработка - где-то нужен NAT, где-то нет. Где-то надо считать трафик, где-то нет, разные правила шейпинга и т.д.
Нужно в ipfw ввести условие типа
ipfw add 7000 skipto 8000 ip from any to any out via em0 next-hop 192.168.1.1
для пакетов, которые будут направлены через 192.168.1.1
Тупые идеи:
1. Сделать столько интерфейсов, сколько в сегмента маршрутизаторов... ужасно;
2. Периодически выгружать таблицу маршрутизации в ipfw table. Не уютно - маршруты могут меняться достаточно часто, производительность упапдет (второй раз просамтривать таблицу маршрутизации);
3. Включить пропуск через ipfw L2-пакетов, и работать с мак-адресами роутеров... жалко производительность на второй заход в ipfw;
4. Прохачить route.c на предмет навешивания mbuf_tag на каждый прошедший пакет... обновляться будет противно;
5. Нарисовать модуль netgraph, который будет выдирать откуда-то информацию про next-hop, и навешивать ее в виде tag'а... откуда выдирать информацию?
Есть ли какие-то стандартные средства?