Нарезаем трафик ломтиками 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 в первую очередь. К слову, по объему такие пакеты довольно малы и не несут никакой полезной нагрузки. |