Что такое BPF для HTTP? - PullRequest
       10

Что такое BPF для HTTP?

4 голосов
/ 05 мая 2010

Определение можно увидеть здесь .

Возможный ответ может быть tcp and dst port 80, но может ли tcp and dst port 80 гарантировать, что это HTTP трафик и включает весь трафик HTTP?

Кажется, что нет, потому что какой-то сайт можно посетить, указав другой порт, отличный от 80, таким образом:

http://domain.name:8080

Так что мой вопрос: что такое BPF для HTTP?

UPDATE

Существует ли реализация для проверки того, является ли пакет HTTP уже в c?

Ответы [ 4 ]

4 голосов
/ 06 мая 2010
  • Простейший фильтр: tcp and dst port 80
  • Множество портов (включая SSL): tcp and (dst port 80 or dst port 8080 or dst port 443)
  • Если вы хотите, например, только пакеты HTTP GET, и не возражаете, что вы получите только первый пакет каждого GET, и вы предполагаете, что в пакетах GET нет параметров TCP, вы можете отфильтровать TCP и тот факт, что полезная нагрузка TCP (HTTP) начинается с «GET» без кавычек: tcp and tcp[20:4] = 0x47455420
  • Если вы считаете, что могут быть параметры TCP (я уверен, что это не так часто для пакетов, отличных от SYN), вы можете сделать более сложный фильтр, который фактически использует заголовок TCP и проверяет длину заголовка TCP (вместо этого). предполагая, что это 20): tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • Комбинация всех этих фильтров будет выглядеть так (хотя SSL здесь не будет работать, поскольку GET зашифрован): tcp and (dst port 80 or dst port 8080 or dst port 443) and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • Аналогичным образом вы можете отфильтровать любой метод HTTP-запроса, отфильтровав байты, с которых начинается этот метод. Если вам нужны также пакеты SYN и SYN-ACK, вы можете добавить их, отфильтровывая флаги TCP с помощью побитовых операций.
  • К сожалению, фильтровать весь HTTP-трафик довольно сложно, поскольку пакет, который не входит в первый запрос или ответ, довольно сложно фильтровать - любая полезная нагрузка TCP может быть частью HTTP-запроса или ответа. Если вам нужен весь HTTP-трафик, вам, вероятно, следует полагаться только на порты.
3 голосов
/ 05 мая 2010

Точного BPF для HTTP нет, поскольку HTTP не является протоколом канального уровня. Лучший способ сделать это - выбрать любой трафик, который может быть HTTP, а затем проверить это в своем приложении. Для этого вам придется соединять сегменты TCP, так как данные в определенном сегменте TCP из середины потока не указывают протокол прикладного уровня.

2 голосов
/ 05 мая 2010

BPF не является фильтром пакетов с сохранением состояния, поэтому любой трафик, который находится на нестандартных портах HTTP, не будет обнаруживаться с помощью BPF.BPF фильтрует на уровне transport , а не на уровне application , поэтому он заботится только о TCP / IP, а не о данных приложения, инкапсулированных в пакеты TCP / IP.Лучше всего фильтровать по обычным портам HTTP, 80, 8000 и 8080. Также 443, если вы также хотите учесть HTTPS.

0 голосов
/ 11 апреля 2011

Wireshark неплохо справляется с декодированием пакетов и маркировкой их HTTP, где это необходимо.

...