Цитата из хэндбука:
"setup - это обязательное ключевое слово определяет начало запроса сессии для TCP пакетов.
keep-state - это обязательное ключевое слово. При совпадении межсетевой экран создает динамическое правило, которое по умолчанию будет совпадать с двунаправленным трафиком между отправителем и получателем для данной пары IP/порт по указанному протоколу."
Имеем вот такой простой набор правил закрытого типа:
#!/bin/sh
cmd="ipfw -q add"
skip="skipto 800"
pif="em0"
ks="keep-state"
ipfw -q -f flush
# LOCAL
$cmd 010 allow all from any to any via em1
$cmd 020 allow all from any to any via lo0
# NAT IN
$cmd 100 divert natd ip from any to any in via $pif
$cmd 101 check-state
# OUT
$cmd 120 $skip icmp from any to any out via $pif $ks
$cmd 130 $skip udp from any to any 53 out via $pif $ks
$cmd 140 $skip tcp from any to any 53 out via $pif setup $ks
$cmd 150 $skip tcp from any to any 80 out via $pif setup $ks
$cmd 160 $skip tcp from any to any 443 out via $pif setup $ks
# IN
$cmd 300 allow tcp from any to me 22 in via $pif setup $ks
$cmd 700 deny ip from any to any
# SKIPTO
$cmd 800 divert natd ip from any to any out via $pif
$cmd 810 allow ip from any to any
$cmd 900 deny ip from any to any
Разберем на примере входящего SSH подключения, как я это понимаю:
Пакет снаружи попадает в фаерволл, на 100 правиле срабатывает нат, дальше пакет попадает под 300 правило, которое во-первых разрешает пакет и тот выходит с фаервола, а во-вторых создает запись в динамической таблице (keep-state). Ответный пакет попадает на 101 правило и улетает с фаервола наружу, пройдя нат. Следующий входящий пакет обрабатывается 100 и 101 правилом, и так как для него уже есть запись в динамической таблице, проходит.
Изучая разные примеры настройки фаерволов, я видел запись и
$cmd 300 allow tcp from any to me 22 in via $pif setup $ks
и
$cmd 300 allow tcp from any to me 22 in via $pif $ks
Работает в обоих случаях.
Вопрос: зачем тогда нужен setup?, а учитывая что хэндбук говорит что setup обязателен для TCP сессий, я вообще ничего не понимаю...