Функция подключения iptables / ebtables для фильтрации на интерфейсе или уровне 2
Я использовал функции ловушки netfilter для фильтрации / прослушивания исходящих IP-пакетов. Я пытаюсь отфильтровать исходящие (от хоста) пакеты между уровнем IP и канальным уровнем, чтобы изучить информацию уровня 2, такую как - интерфейс, MAC-адрес. NF_INET_POSTROUTING не дает информацию о MAC-адресе, так как он вызывается в ip_output() до разрешения адреса, я думаю.
Я посмотрел функции хуков ebtables, они, похоже, связаны с Bridge INPUT/FORWARD/OUTPUT. Если я понимаю, исходящие пакеты от локального TCP / IP не проходят через переадресацию моста. Есть ли способ, которым я могу подключиться к пакетам между Linux IP и канальным уровнем для фильтрации (DROP или изменить) ...?
1 ответ
Я не уверен, есть ли общий способ перехватить это, но некоторые методы приходят на ум:
LD_PRELOAD
Операции с сокетами: предоставьте совместно используемую библиотеку с собственной реализациейsend(|to|msg)
- Зарегистрируйте виртуальный интерфейс TAP и привязайте к нему ваше приложение
- Зарегистрируйте виртуальный интерфейс в ядре и привязайте к нему ваше приложение
Водитель склеивания является примером последнего. За кулисами он распределяет исходящий трафик на ведомые устройства и собирает входящий трафик от них.
Я попробовал это в моем водителе. Вы можете настроить через DebugFS интерфейс для микроуправления. Любое приложение, связывающее с uman0
через виртуальный интерфейс будет проходить выходной трафик uman_start_xmit
и входящий трафик через uman_handle_frame
, где вы можете добавить код, чтобы решить, следует ли переслать / перебрать / отбросить пакет uman
был побочным продуктом моей дипломной работы и, возможно, не подходил для производственного использования (если вы сделаете его более подходящим, запросы на извлечение приветствуются:-).