Как фильтровать TCP-пакеты на основе флагов с помощью Packet Filter в OpenBSD

Ну, я точно не знал, как задать этот вопрос, но я знаю, что вы можете использовать ключевое слово flags, чтобы указать, какие флаги вы хотите отфильтровать.

Согласно документации Пакетного фильтра:

Чтобы PF проверял флаги TCP во время оценки правила, используется ключевое слово flags со следующим синтаксисом:

flags check/mask
помечает любые

Часть маски указывает PF проверять только указанные флаги, а часть проверки указывает, какие флаги должны быть включены в заголовке, чтобы произошло совпадение. Использование ключевого слова any позволяет установить любую комбинацию флагов в заголовке.

передача на fxp0 proto tcp с любого на любой порт ssh flags S/SA
передача на fxp0 proto tcp с любого на любой порт ssh

Поскольку флаги S/SA установлены по умолчанию, приведенные выше правила эквивалентны. Каждое из этих правил пропускает TCP-трафик с установленным флагом SYN, при этом рассматривая только флаги SYN и ACK. Пакет с флагами SYN и ECE будет соответствовать приведенным выше правилам, а пакет с SYN и ACK или просто ACK — нет.

Итак, на примере я понял, почему пакет с флагами S и E может пройти (потому что флаг E не считается из-за маски SA) и почему пакет только с флагом Ack не может пройти фаервол.

Чего я не понял, так это почему пакет с флагами S и A не может пройти правило S/SA, если флаг S в заголовке пакета "включен". Может быть, документация неоднозначна? Извините, если это глупый вопрос или неправильное понимание английского языка.

Я предполагаю, что он может пройти, только если он ДОЛЖЕН ИМЕТЬ ТОЛЬКО флаг S. В арифметике набора будет что-то вроде этого:

флаги должны быть включены в заголовке -> флаги относятся к замаскированному подмножеству [pf doc]
только флаг (s) должен быть включен в заголовке -> флаг(ы) эквивалентен замаскированному подмножеству [что я понял из приведенного примера]

Заранее спасибо!


person Davi Sampaio    schedule 18.04.2013    source источник
comment
Кстати, это, вероятно, следует перенести в serverfault.   -  person ramrunner    schedule 20.04.2013


Ответы (1)


Чего я не понял, так это почему пакет с флагами S и A не может пройти правило S/SA, если в заголовке пакета стоит флаг S. Может быть, документация неоднозначна?

Из раздела флагов в pf.conf(5)

флаги (A)/(B) | Любые

Это правило применяется только к TCP-пакетам, для которых установлены флаги (A) из набора (B).

Если (B) := SA и (A) := S -> Это правило применяется только к TCP-пакетам, для которых установлены флаги S вне установленного SA.

Это означает, что у него нет набора A. Немного перефразируя:

Это правило применяется только к TCP-пакетам, у которых точно установлены флаги (A) из набора (B)

Или, как поясняется позже на странице руководства:

флаги S/SA

Это настройка по умолчанию для соединений с отслеживанием состояния.

Из SYN и ACK может быть установлен именно SYN

person ramrunner    schedule 19.04.2013
comment
Вот о чем я подумал после просмотра примера @ramrunner. Вы не согласны с тем, что документация неоднозначна? В нем говорится, что флаг(и) в контрольной части должен быть включен в заголовке. Таким образом, случай, который вы указали, когда у вас есть S и A, также будет соответствовать. Это не говорит о том, что должны совпадать только флаги в контрольной части. - person Davi Sampaio; 24.06.2013