Что вы действительно хотите сделать, это внедрить устройство глубокой проверки пакетов в режиме реального времени, которое проверяет поток TCP, заголовки HTTP и выполняет собственный ответ, если обнаруживает доступ к определенному сайту.
В целом, невозможно выполнить сложные ответы на уровне приложений с помощью пассивного устройства, которое просто контролирует трафик, но трафик не будет идти через пассивное устройство.
Вы, скорее всего, должны будете выполнить некоторую разработку на уровне ядра Linux, используя крючки netfilter. Возможно передать пакеты в пользовательское пространство и обратно в kernelelspace, если вы предпочитаете кодирование пользовательского пространства. Мое мнение состоит в том, что лучше проводить комплексную инспекцию глубоких пакетов в пользовательском пространстве.
Для разбора HTTP-заголовков вам, скорее всего, потребуется создать собственный генератор синтаксического анализатора, поскольку ни один из существующих генераторов парсера не удовлетворяет всем требованиям для глубокого контроля пакетов. В частности, вы хотите использовать данные PUSH в синтаксическом анализаторе, а не для анализатора для данных PULL, вызывая функцию, которая возвращает часть данных. И парсер должен работать постепенно. Таким образом, yacc или bison не работают. Кроме того, практически ни один из сетевых протоколов не был разработан с использованием двухэтапного (lexer, parser) разбора, поэтому вам, скорее всего, понадобится решение, которое объединяет лексер и парсер в один и включает и выключает лексемы на основе анализатора контекст. Это непростая задача. Однако отсутствие генератора синтаксического анализатора для генерации кода анализа заголовка HTTP будет полным адским содержанием. Он был опробован раньше, и краткое изложение: не делайте этого.
Учтите, что устройства с глубоким контролем пакетов имеют вещи, называемые уклонениями. Например, что вы делаете, если вместо «GET/HTTP/1.1 \ nHost: badsite.com \ n \ n» вы видите «G», «E», «T», «», «/», «" , "H", "T", "T", "P", "/", "1", ".", "1", "\ n", "H", "o", "s" «t», «:», «», «b», «a», «d», «s», «i», «t», «e», «.», «c», «o», , "m", "\ n", "\ n" в разных сегментах TCP? У вас будет много работы перед вами, если вы хотите справиться с глубокими уклонениями от проверки пакетов в своей системе.
Отказ от ответственности: Я работал с крупным поставщиком устройств сетевой безопасности, поэтому я знаю, как это реализовано.
Используете ли вы правильные строки. (Это должна быть строка возврата каретки ('' \ r \ n "'))? Правильно ли вы заканчиваете заголовки (с пустой строкой)? –
Да, мои http-данные: «HTTP/1.1 302 временно перемещен \ r \ nLocation: http: //www.example.com \ r \ n \ r \ n". Тем не менее, клиент не переходит в новое место. @ JoachimPileborg – Scott
Вы использовали пакетный снифер, например, [Wireshark] (https://www.wireshark.org/), чтобы увидеть, что правильный пакет и данные отправляются клиенту? –