Как фильтровать IP-трафик между устройствами в одной локальной сети

Обо мне

Я старший инженер-программист в области кибербезопасности.
Я люблю программировать, и я кодирую на многих языках программирования и в разных средах.
У меня большой опыт работы с сетевым стеком Linux, и я люблю решать задачи в этой области.

Проблема, которую я хотел решить

В Linux фильтрация пакетов осуществляется с помощью таких инструментов, как iptables.
iptables — это удобное приложение для установки правил того, какой тип трафика вы хотите принимать или отбрасывать.
приложение iptables отлично работает для исходящего или входящего трафика. т.е. пользователь, который хочет войти на определенный веб-сайт.
но что произойдет, если трафик является межсетевой связью? т.е. Wi-Fi-устройство «x», которое хочет связаться с Wi-Fi-устройством «y».
ответ прост — этот трафик не может быть отфильтрован, так как трафик проходит только через чип Wi-Fi и IP-стек операционной системы.
Вот почему iptables нельзя использовать для установки правил фильтрации при передаче данных через Wi-Fi.
я хотел решить эту проблему и позволить сетевому администратору фильтровать трафик локальной сети Wi-Fi.

Какое приложение позволяет выполнять фильтрацию пакетов между устройствами Wi-Fi с одним и тем же ssid?

первый пакет, отправленный между двумя устройствами в локальной сети, будет запросом arp.
каждый узел должен знать аппаратный адрес узла, с которым он хочет установить связь.
Итак, чтобы преодолеть проблему, с которой я столкнулся, я понял, что моя главная цель — обмануть узлы в локальной сети и «солгать» им об аппаратном адресе каждого другого узла в локальной сети.
для этого я создал приложение, работающее на маршрутизаторе, задача которого состоит в том, чтобы перехватывать пакеты запроса ARP и генерировать сообщения ответа ARP с собственным MAC-адресом маршрутизатора. как только приложение запускается, весь трафик поступает в IP-стек операционной системы и может быть отфильтрован с помощью iptables.

Стек технологий

Чтобы создать приложение, которое обнюхивает пакеты, я создал необработанный сокет, который «прослушивает» весь трафик, который получает адаптер Wi-Fi. поскольку адаптер Wi-Fi постоянно получает много трафика, необработанный сокет, который принимает весь трафик, может сильно нагружать ЦП. поэтому я решил использовать фильтры пакетов bpf. фильтры bpf позволяют нам определять правила фильтрации и применять их к сокету, я не буду вдаваться в подробности, просто скажу, что это повышает производительность.
поэтому я создал фильтр, который будет получать пакеты только на нужный адаптер Wi-Fi и только кадры, MAC-адрес назначения которых равен ff: ff: ff: ff: ff: ff (широковещательные кадры). приложение запущено и работает, но этого все равно недостаточно. приложение действительно ответило на запросы ARP правильным ответом ARP, но ему пришлось «конкурировать» с другим ответом ARP, отправленным с узла в локальной сети. краткое объяснение — когда узел «x» хочет связаться с узлом «y», он отправляет запрос arp, узел «y» отвечает, и они начинают общаться. таким образом, помимо ответа ARP моего нового приложения, был также «оригинальный» ответ ARP. так что мне избавиться от «оригинального» ответа ARP? , к счастью, большинство чипов Wi-Fi сегодня поставляются с возможностью установки беспроводной изоляции. это означает, что клиенты LAN Wi-Fi не смогут общаться друг с другом, они могут общаться только со своим вышестоящим маршрутизатором. это было идеально для меня, поскольку, как только я включу изоляцию, «исходный» ответ arp не дойдет до другого клиента, а поскольку сгенерированный ответ arp из приложения поступает от маршрутизатора, он не будет изолирован чипом Wi-Fi.
теперь у нас есть система, чьи сетевые устройства могут взаимодействовать друг с другом с помощью маршрутизатора, это добавляет небольшую задержку к трафику, но теперь трафик можно фильтровать обычным и простым способом.

Процесс создания приложения, которое позволяет выполнять фильтрацию пакетов между устройствами Wi-Fi с одним и тем же ssid.

сначала мне нужно было понять, почему я не могу фильтровать сетевой трафик, мне нужно было получить хорошее представление о потоке пакетов внутри чипа Wi-Fi и в стеке IP-адресов Linux. затем я понял, что фильтрация пакетов будет невозможна, если я не выполню какой-нибудь сетевой трюк.
поскольку я знаю, что одноадресный трафик переключается на чип Wi-Fi и, следовательно, не может быть «увиден» маршрутизатором, мне было ясно, что я должен начать с первого трафика, который является широковещательным запросом ARP.
изучив чип Wi-Fi и изучив его возможности изоляции, я понял, что это «обязательная» возможность для работы моего приложения.
последняя проблема заключалась в том, чтобы не повредить слишком сильно производительности, и именно здесь на сцену вышли фильтры bpf. они позволили мне определить конкретный фильтр для необработанного сокета, поэтому мне не нужно было обрабатывать все пакеты, а только часть из них (широковещательные пакеты) и, следовательно, не заставлять мое приложение потреблять процессор.

Проблемы, с которыми я столкнулся

в обычных проектах обычно вы ищете ответы в stackoverflow, поскольку многие из ежедневных проблем, с которыми мы сталкиваемся как инженеры-программисты, уже сталкивались с другими разработчиками. проблема, с которой я столкнулся, не имеет документированного решения. мне нужно было собрать все свои сетевые способности и знания и найти уникальное решение этой проблемы, и даже после решения проблемы возникает куча «мелких» проблем которые заставляют вас очень хорошо читать и понимать протокол arp и решать любые доп. проблемы, о которых вы не думали.

Основные выводы

проще всего было отпустить и сказать, что проблема не решаема,
но иногда творческий подход и нестандартное мышление могут привести к очень интересным решениям, которых нет даже в stackoverflow. 😃

Советы и советы

учитесь и будьте хороши в любой области, которую вы выберете, иногда все знания и опыт, которые вы собрали, сводятся к уникальной проблеме, которую, возможно, очень немногие раньше решали или пытались решить, и в этом вы, наконец, найдете все годы тяжелой работы и опыта. оплата из.

Заключительные мысли и следующие шаги

это сделанный проект, с нетерпением жду моего следующего вызова.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *