Я только что прочитал книгу о ПФ (Книга ПФ, без крахмала), но есть один вопрос, на который он не ответил.
Если у меня есть компьютер шлюза, использующий два интерфейса, $ int_if и $ ext_if, и я NAT пакеты, идущие от $ int_if: net (который, скажем, 10.0.0.0/24) к $ ext_if, используя match
, когда применяется NAT ? До или после правил фильтрации?
Пример:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23
Это работает? Или получает исходный IP-адрес пакета, пришедшего с 10.0.0.23 NAT, по адресу $ ext_if до того, как будет проверена проверка, что он с 10.0.0.23?
Думаю, эта диаграмма не поможет ответить на этот вопрос, но, тем не менее, она интересна: [ http://www.benzedrine.cx/pf_flow.png ]
Если вы прочитаете FAQ по PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], особенно раздел «Настройка NAT», вы увидите следующие предложения:
Когда пакет выбирается правилом соответствия, параметры (например, nat-to) в этом правиле запоминаются и применяются к пакету, когда достигается правило прохода, соответствующее пакету. Это позволяет обрабатывать целый класс пакетов одним правилом сопоставления, а затем конкретные решения о том, разрешать ли трафик, могут приниматься с помощью правил блокировки и прохождения.
Я думаю, это звучит так, как будто это не так, как я указывал в предыдущем параграфе, поэтому исходный IP-адрес «запоминается» до тех пор, пока не будет принято решение о действии, которое должно быть выполнено с пакетом. Если решение принято, применяется NATting.
Что вы думаете?
PS: это довольно теоретический вопрос. Если вы немного прагматичны, вы сделаете это так:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23
Таким образом, block
правило уже применяется, когда пакет входит в $ int_if.
РЕДАКТИРОВАТЬ: Другая возможность, конечно, решить до NAT:
pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
Если приходит пакет из .23, он сначала соответствует первому правилу, затем соответствует второму правилу и третьему «правилу». Но так как второе правило является последним при принятии решения о передаче / блокировке, пакет блокируется. Правильно?
quick
ключевом слове, но оно мне не очень нравится - я всегда стараюсь использовать порядок оценки pf;) Кстати, я нашел ответ на странице часто задаваемых вопросов OpenBSD: «NAT указан как необязательный параметр nat-to для правило исходящего прохода. Часто вместо того, чтобы быть установленным непосредственно в правиле прохода, используется правило соответствия. Когда пакет выбирается правилом соответствия, параметры (например, nat-to) в этом правиле запоминаются и применяются к пакет при достижении правила прохода, соответствующего пакету. " Так что мой набор правил не вызовет никаких проблем и правильно заблокирует