Как прослушивать пакеты с помощью Racket?

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

Вот мой код (большая часть взята из статьи Racket в Википедии).

#lang racket

(require racket/tcp)

(define listener (tcp-listen 80))

(define (echo-server)
  (define-values (in out) (tcp-accept listener))
  (thread (lambda () (copy-port in out) 
                     (print (read in)) 
                     (close-output-port out)))
  (echo-server))

(echo-server)

Когда я подключаюсь к localhost:80, я получаю некоторую обратную связь, но когда я пытаюсь использовать свои веб-браузеры, я не могу ничего распечатать. Как изменить этот код, чтобы он прослушивал входящие и исходящие пакеты из веб-запросов?


person sdasdadas    schedule 04.08.2013    source источник
comment
Когда я пишу прохождение, у меня создается впечатление, что вы хотите перехватить связь с портом 80, в то время как ваш код работает только для URL-адресов, представляющих машину, на которой он работает, например localhost/blabla, а не как сниффер. Если вы просто ищете сниффер, я предлагаю wireshark.   -  person Sylwester    schedule 04.08.2013
comment
Я полагаю, что вы хотите реализовать прокси-сервер, а не эхо-сервер: процесс, который находится в середине HTTP-соединения и видит весь входящий/исходящий трафик, обеспечивая при этом нормальную связь.   -  person Óscar López    schedule 04.08.2013
comment
@ ÓscarLópez Да, я считаю, что это то, что я ищу - не могли бы вы уточнить в ответе разницу между тем, что у меня есть, и прокси-сервером (вкратце, если я слишком много прошу)?   -  person sdasdadas    schedule 05.08.2013
comment
@sdasdadas ищите примеры прокси-серверов. По сути, это процесс, который находится между ними, получает запрос от клиента, перенаправляет его на реальную цель, получает ответ цели и пересылает его клиенту... и делает все, что хочет, с полученным запросом/ответом. через это   -  person Óscar López    schedule 05.08.2013
comment
Библиотека packet-socket (последнее обновление 2017 г.) обеспечивает доступ к необработанным кадрам Ethernet.   -  person Ryan    schedule 21.11.2019


Ответы (3)


Тем не менее, я, кажется, сталкиваюсь со стеной либо с моим пониманием того, как работает анализатор пакетов

Да. Сниффер пакетов не использует обычные сокеты; он использует любые доступные механизмы для пассивного наблюдения за пакетами, полученными или отправленными через сетевой интерфейс. Если вы хотите просто смотреть HTTP-трафик через порт 80, не отвечая на этот трафик и не изменяя этот трафик, вам нужно будет использовать что-то вроде как libpcap/WinPcap, которые используют соответствующий механизм вашей ОС для пассивного просмотра пакетов. См., например, библиотеку SPeaCap для Racket.

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

person Community    schedule 04.08.2013
comment
Ах, спасибо. Я не возражаю против того, чтобы влезть между пакетами (например, атака «человек посередине»?) — но я не знал, можно ли сидеть между моим клиентом Chrome и портом 80 (и перехватывать, анализировать и передавать пакеты, идущие из Chrome на какой-либо веб-сервер). Легко ли это сделать? Или именно в этом случае существует обнюхивание пакетов? - person sdasdadas; 05.08.2013
comment
Перехват пакетов включает в себя перехват и анализ; это не включает в себя передачу вперед, так же как, например, прослушивание телефонных разговоров включает в себя прослушивание того, что сказал один человек, и повторение этого другому человеку, чтобы он это услышал. Другой альтернативой является написание программы веб-прокси, которая пропускает весь трафик в обоих направлениях, а также выполняет собственный анализ трафика. Однако, чтобы использовать это, вам нужно настроить Chrome для работы с вашим приложением в качестве прокси-сервера. Я оставлю это на ваше усмотрение, чтобы понять, как это сделать. - person ; 05.08.2013
comment
SPeaCap очень устарел. Библиотека packet-socket (последнее обновление в 2017 г.) обеспечивает доступ к необработанным кадрам Ethernet. - person Ryan; 21.11.2019

Ваш TCP-сервер просто действует как эхо-сервер, что означает, что он не соответствует HTTP. Ваш браузер ожидает действительный ответ HTTP, поэтому неудивительно, что он не работает.

В Racket есть библиотеки на все случаи жизни. Быстрый поиск документации показал следующее: Веб-сервер: HTTP-сервер

person DaoWen    schedule 04.08.2013
comment
Я могу ошибаться, но меня не слишком интересует сторона веб-сервера. Я просто хочу получить заголовки сетевых данных, поступающих через порт 80. Даже если мой браузер ожидает ответа HTTP, не перехватит ли я исходящий запрос? - person sdasdadas; 04.08.2013

Библиотека packet-socket (последнее обновление 2017 г.) обеспечивает доступ к необработанным кадрам Ethernet. packet-socket на pkgd

person Ryan    schedule 21.11.2019