Доброго времени суток!По мануалу никак не могу разобраться с такой проблемой:
Стоит FreeBSD 6.x, в качестве файрвола используется PF. Необходимо блокировать пользователей внутренней сети по IP адресу. Реализовал я это так:
Создал таблицу:
table <ipblock> persist { }
куда добавляю ip адреса для блокировки.Правило для блокировки:
block in quick log on $int_if from <ipblock> to anyСобсно, все работает, за исключением нюанса. Если есть активная сессия на блокируемом ip, ну например кто-то слушает on-line радио, то правило не срабатывает пока сессия не закончится.
Насколько я понимаю, это связано с обработкой keep state/modulate state в разрешающих правилах. Тоесть фильтр игнорирует сразу же все пакеты активной сессии. И применяет правило блокирования только для попыток установить новую сессию.Вот собсно и вопрос, как сразу же рубить сессию у ip адресов попавших в таблицу ipblock.
Наверняка есть простое решение, но я его к сожалению не вижу :-[
set block-policy какие параметры?
может большую часть конфига покажете ?
>set block-policy какие параметры?
>может большую часть конфига покажете ?Вот такой у меня конфиг:
set optimization normal
set block-policy drop
set limit { states 20000, frags 20000, src-nodes 20000 }
set state-policy floatingtable <ipblock> persist { } # localnet users out of traffic limit
scrub in on $int_if all no-df fragment reassemble
scrub in on $ext_if all
scrub on $ext_if random-id reassemble tcp#------------------
# NAT
nat-anchor "pftpx/*"
nat on $ext_if from $int_if:network to any -> ($ext_if)
rdr-anchor "pftpx/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021# squid
rdr on $int_if proto tcp from any to any port 80 -> 127.0.0.1 port 3128#------------------
# Filterblock all
pass quick on lo0 all
# Antispoffing interfaces
antispoof log for $int_if
antispoof log for $ext_ifblock in quick log on $int_if from <ipblock> to any
pass on $int_if from any to any keep state
pass in log on $ext_if inet proto icmp from any to $ext_addr icmp-type echoreq keep state (max 10)
#_Allow_SSH_connections_to_ME
pass in log on $ext_if inet proto tcp from any to $ext_if port 22 modulate state (max 20) flags S/SA# _FTP
anchor "pftpx/*"
pass out log inet proto tcp from $ext_addr to any port 21 flags S/SA modulate state# _HTTP
pass out log on $ext_if inet proto tcp from $ext_if to any port 80 flags S/SA modulate state
pass out log on $ext_if inet proto tcp from $ext_if to any port 443 flags S/SA modulate state# _CVSUP
pass out on $ext_if inet proto tcp from $ext_if to any port 5999 flags S/SA modulate state# _DNS
pass out log on $ext_if inet proto { tcp, udp } from $ext_if to any port 53 flags S/SA keep state# _SSH
pass out log on $ext_if inet proto tcp from $ext_if to any port 22 flags S/SA modulate state
А если изключить из ната таблицу ipblock ?
>А если изключить из ната таблицу ipblock ?Спасибо, попробую! Это должно сработать :)
Добавил правило, перед всеми остальными:
no nat on $ext_if from <ipblock> to anyК сожалению, не сработало...
Видимо по этой причине:
Translation rules modify either the source or destination address of the packets associated with a stateful connection.
A stateful connection is automatically created to track packets matching such a rule as long as they are not blocked by the filtering section of pf.conf.Может есть еще идеи как это сделать?
Возникла одна идея, снижать скорость потока до 0 для таблицы с заблокированными адресами с помощью altq, я думаю должно сработать. ;)
>Возникла одна идея, снижать скорость потока до 0 для таблицы с заблокированными
>адресами с помощью altq, я думаю должно сработать. ;)qwest какойто , и как получилось ? ;) а то мне уже любопытно .