Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #87, МАРТ 2006 г.

Нарезаем трафик ломтиками

Andrey Matveev

Хакер, номер #087, стр. 087-130-3


При создании набора правил фильтрации для протокола TCP хорошей практикой является контроль за прохождением пакетов с SYN и ACK в случае, когда флаг SYN уже "взведен":

scrub on $ext_if all

pass in log(all) on $ext_if inet proto tcp from any to any \

port ssh flags S/SA keep state

pass out on $ext_if inet proto tcp from any to any \

flags S/SA keep state

Особую роль здесь играет ключевое слово keep state, с помощью которого сохраняется вся информация о пакетах, соответствующих данному правилу. Использование keep state упрощает написание правил файрвола, повышает производительность фильтра пакетов, а также препятствует проведению некоторых сетевых атак, например IP-спуфинга, когда атакующий отправляет пакеты с подделанными адресом и портом источника. Указав в правиле modulate state вместо keep state, мы включим модуляцию для исходящих TCP-соединений и получим качественно сгенерированные ISN-числа. Так мы станем менее уязвимыми для атак типа TCP Hijacking.

При работе scrub необходимость в постоянном слежении за FIN и RST отпадает, так как scrub позволяет не только производить нормализацию пакетов и пересобирать фрагментированные IPv4-дейтаграммы, но и отбрасывать пакеты с недопустимыми комбинациями флагов. Кроме того, с помощью этой директивы можно установить максимальное количество данных, которое узел, отправляющий SYN, будет принимать в каждом TCP-сегменте по данному соединению. Зачем? Чтобы попытаться предотвратить фрагментацию пакетов.

Формула вычисления значения параметра MSS (Maximum Segment Size) такова: максимальный размер Ethernet-кадра (1500) - заголовок PPPoE+PPP (8) - заголовок IP (20) - заголовок TCP (20) = 1452. Примечание: заголовок IPv4 имеет длину 20 байт, а заголовок IPv6 - 40 байт. Будь осторожен, неверные значения MSS и MTU (максимальная единица передачи, которая определяется характеристиками аппаратных средств и требованиями протоколов) могут привести к потере в скорости и недоступности некоторых сайтов.

scrub in on $ext_if all

scrub out on $ext_if all random-id max-mss 1452

В данном примере опция random-id позволяет генерировать случайные идентификаторы в заголовках исходящих IP-пакетов.

При работе по протоколу TCP мы получаем надежные двунаправленные соединения (данные отправляются и принимаются в обоих направлениях в любой момент времени). Даже при скачивании файла клиенту приходится отправлять серверу ACK'и, чтобы избежать увеличения времени ожидания подтверждения и потери/дублирования пакетов.

А что произойдет, если одновременно мы начнем закачивать что-либо на удаленный сервер? К примеру, заливать сайт на хостинг или отправлять письма с вложениями. Вне зависимости от используемой операционной системы результат окажется неутешительным - появится задержка всех исходящих пакетов с установленными ACK-флагами, и скорость скачивания заметно упадет.

Так что решение задачи напрашивается само собой: нужно дать указание файрволу обрабатывать сегменты ACK в первую очередь. К слову, по объему такие пакеты довольно малы и не несут никакой полезной нагрузки.

Назад на стр. 087-130-2  Содержание  Вперед на стр. 087-130-4