Введение

Вам, наверное. не раз хотелось перехватить пакеты, проходящие туда-сюда через вашу машину? Нет, я не говорю о простом просмотре пакетов в натуральном виде (как в raw-сокетах или libpcap (tcpdump)). Я говорю именно о том, чтобы перехватить пакет и, затем, возможно, после некоторой модификации, переслать его дальше. Ну что ж, время, когда это было простой мечтой, закончилось - теперь у нас есть divert-сокеты для Linux!

Divert-сокеты именно это и делают - они отфильтровывают пакеты, в соответствии с настройками firewall, и передают их вашей программе. Затем вы можете: просто отправить пакет дальше, модифицировать и отправить, или не пересылать его вообще.

Как вы наверно уже догадались по названию пакета, этот механизм включает в себя использование специальных RAW-сокетов, называемых divert (IPPROTO_DIVERT), позволяющих вам производить передачу и прием данных на них таким же образом, как и на обычных сокетах. Единственное различие состоит в том, что этот сокет привязан к порту - на него можно пересылать конкретные пакеты, попадающие в firewall. Любые данные, проходящие через firewall, могут быть посланы в этот сокет.

Эта система изначально входила в состав FreeBSD. Divert-сокеты для Linux - это адаптированная версия исходного пакета, претендующая на совместимость с ним (по крайней мере на уровне исходных текстов программ, использующих этот механизм).