2015-03-23 2 views
-1

Я разрабатываю систему, которая может обнаружить запрос в локальной сети. Если клиенты запрашивают определенный сайт, система отправит пакет перенаправления http. Я строю HTTP перенаправления пакетов через ЛИБНЕТ, новый Ури установлен в месте, например:Как создать и отправить пакет перенаправления HTTP 302 по libnet?

 
HTTP/1.1 302 Moved Temporarily 
Location: http://www.example.com 

Но это не работает, браузер не переходит на новый сайт. Клиент не отправляет новый запрос GET для перенаправления URL-адреса.

Спасибо за все ответы.

+0

Используете ли вы правильные строки. (Это должна быть строка возврата каретки ('' \ r \ n "'))? Правильно ли вы заканчиваете заголовки (с пустой строкой)? –

+0

Да, мои http-данные: «HTTP/1.1 302 временно перемещен \ r \ nLocation: http: //www.example.com \ r \ n \ r \ n". Тем не менее, клиент не переходит в новое место. @ JoachimPileborg – Scott

+0

Вы использовали пакетный снифер, например, [Wireshark] (https://www.wireshark.org/), чтобы увидеть, что правильный пакет и данные отправляются клиенту? –

ответ

0

Что вы действительно хотите сделать, это внедрить устройство глубокой проверки пакетов в режиме реального времени, которое проверяет поток 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? У вас будет много работы перед вами, если вы хотите справиться с глубокими уклонениями от проверки пакетов в своей системе.

Отказ от ответственности: Я работал с крупным поставщиком устройств сетевой безопасности, поэтому я знаю, как это реализовано.

+0

Благодарим вас за ответ. Мой сервер может контролировать трафик. Я вставляю пакет переадресации http 302 в разговор. Я уверен, что мой пакет прав, однако, клиент не может перейти на сайт, установленный в Location. Теоретически, я думаю, он может работать до тех пор, пока клиент может разрешить мой пакет перенаправления. Если моя идея ошибочна, можете ли вы дать мне больше предложений о подключении ядра Linux? Я не переживаю. – Scott

+0

Ну, похоже, у вас большая задача, чем то, на что вы способны. Таким образом, вы являетесь пассивным контроллером трафика, а не активным встроенным устройством. Если вы вставляете свои собственные данные в соединение, как вы предотвращаете доступ к клиенту альтернативных данных с сервера? Кажется, вы не можете этого сделать сейчас. Вы можете попробовать отправить RST-пакет на сервер и пакет данных клиенту, но в сети могут появляться альтернативные пакеты данных в полете с сервера, которые до сих пор могут дойти до клиента. – juhist

+0

В качестве стороннего варианта: если вы хотите взломать подобные работы, вы можете попробовать использовать Wireshark, чтобы выяснить, действительно ли пакет, который вы отправляете, является допустимым пакетом для TCP-соединения. Правильно ли номер ACK, т. Е. Подтверждает ли он запрос, отправленный клиентом? Правильно ли порядковый номер? Но будьте готовы к тому, что ваш хак может однажды провалиться, а затем, если вы измените его, он может снова потерпеть неудачу и так далее ... На самом деле, устранение всех потенциальных проблем потребует сложного подхода, который я описал в своем ответе. – juhist