Функция подключения 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 был побочным продуктом моей дипломной работы и, возможно, не подходил для производственного использования (если вы сделаете его более подходящим, запросы на извлечение приветствуются:-).

Другие вопросы по тегам