Перекладывание пакетов в другой сегмент с заменой src и dst MAC это то, что делает любой роутер с обычным трафиком. В вашем случае разница только в перекладывании копии вместо оригинала. Поэтому для этой задачи вовсе не обязательно заморачиваться с опусканием на уровень Ethernet-фреймов, раз Ethernet-заголовки не нужны. Нужно лишь a) создавать копии IP-пакетов и b) делать ipfw fwd копиям.
Можно воспользоваться тем, что ipfw tee одновременно создаёт копию пакета и засовывает её в divert-сокет и если divert-сокет выплюнет копию обратно в ipfw, то у копии будет флаг diverted, который можно проверить следующим правилом ipfw. Осталось только заставить divert-сокет отражать пакеты обратно. Это легко делается парой нод ng_ksocket и ng_echo: нода ksocket принимает пакеты из divert-сокета, отдаёт в echo, а та разворачивает пакет обратно по цепочке.
Comments 7
/dup-to
Reply
Мне надо менять и dst и src _mac_ у пакета. Не трогая ip адрес.
Или я что-то упустил?
Reply
Настраивается в одну строчку в конфиге.
Reply
Reply
Можно воспользоваться тем, что ipfw tee одновременно создаёт копию пакета и засовывает её в divert-сокет и если divert-сокет выплюнет копию обратно в ipfw, то у копии будет флаг diverted, который можно проверить следующим правилом ipfw. Осталось только заставить divert-сокет отражать пакеты обратно. Это легко делается парой нод ng_ksocket и ng_echo: нода ksocket принимает пакеты из divert-сокета, отдаёт в echo, а та разворачивает пакет обратно по цепочке.
Вот скрипт для ngctl:
mkpeer echo dummy dummy ( ... )
Reply
Reply
Leave a comment