задолбался с pf на freebsd

12
N
На сайте с 06.05.2007
Offline
419
2590

Есть у меня система на freebsd6.2.

Хотелось соорудить некую простенькую защиту от перегрузок в ddos, и поэтому был выбран openbsd packet filter (pf), тк там есть таблицы обеспечивающие быструю выборку из большого списка.

Из тех же соображений защиты от ddos, возникла необходимость ограничить число одновременно установленных соединений с одного ip. В мануалах описан финт, который переводчики понимают по-своему, некоторые так и перевели что мол число соединений, но это не так. В оригинале там просто число записей в трекинговой таблице независимо от состояния.

Как четко ограничить число полностью открытых соединений в состоянии ESTABLISHED?

Ниже пример конфига, на ограничение 3 соединений на порт 250. вроде бы срабатывает, но в таблице соединений pf постоянно творится ерунда и в итоге я легко открываю первые 3 и пару секунд спустя еще 3 соединения. (всего 6 копий программы telnet запускаю одновременно)

ext_if="em0"
set optimization normal
set block-policy drop
set timeout src.track 900

set skip on lo0
scrub in all

block in on $ext_if proto tcp to 1.2.3.4 port 250
pass in on $ext_if proto tcp to 1.2.3.4 port 250 flags S/SA \
keep state (max 1000,source-track rule, max-src-states 1000, max-src-nodes 10000,max-src-conn 3)

Подозреваю, что нужно отдельно написать правило для продолжения трекинга установленных соединий или увеличить какой-нибудь хитрый лимит. Может быть кто-то решал подобную задачу?

Кнопка вызова админа ()
O
На сайте с 13.08.2008
Offline
26
#1

telnet запускаете с одной и той же машины?

Уже запущенные telnet-сессии не дохнут к тому времени, как вы следующие три запускаете?

Outsourcenow.ru: оттюним ваш веб-сервер. 100 млн. запросов в сутки - наш размерчик!
N
На сайте с 06.05.2007
Offline
419
#2

c одной и одновременно и она без ната. есть такая штука clusterssh : нажимаю один enter, а она нажимает его в шести терминалах.

O
На сайте с 13.08.2008
Offline
26
#3
netwind:
c одной и одновременно и она без ната. есть такая штука clusterssh.

М-м-м-м... Надо бы внимательно поизучать pfctl -s all на предмет сгенереных динамических правил, и, если в них все кошерно - смотреть в tcpdump на предмет ISN.

Есть мнение, что правило по keep state создается на пару src_ip / dst_ip + dst_port. А если это так, то с одной и той же машины сколько хочешь соединений провалится.

Конкретнее сейчас ничего не скажу, надо тору почитать, посмотреть поподробнее.

N
На сайте с 06.05.2007
Offline
419
#4

точно отловил что pfctl -sa показывает меньше состояний чем на самом деле (через netstat).

правило упростил совсем :

block in on $ext_if proto tcp to any port 250

pass in on $ext_if proto tcp to any port 250 keep state \

(max 10000, source-track rule, max-src-nodes 4000, max-src-conn 3)

pass out on ext_if proto tcp from any port 250 to any keep state

то есть теперь весь незаблокированный трафик должен проходить через трекер, но все равно такое впечатление что max-src-conn включает режим забывчивости и я вижу только 3 соединения.

Пример из Торы с max-src-states 3 работает стабильно и блокирует все.

Пожалуй, даже решает задачу ограничения совсем уж наглых ддосеров и качальщиков, хотя и неточно.

Andreyka
На сайте с 19.02.2005
Offline
822
#5

Это защита от пионеров

В настоящем DDOS от 1 ip идет только 1 коннект

Не стоит плодить сущности без необходимости
N
На сайте с 06.05.2007
Offline
419
#6

Andreyka, смерть человекам! опять вы со своей колокольни?

это одна из мер. снос крыши у этого весьма хилого сетевого стека во время ддоса меня не устраивает.

S
На сайте с 07.05.2007
Offline
20
#7
pass in on $ext_if proto tcp to 1.2.3.4 port 250 flags S/SA \
keep state (max 1000, source-track rule, max-src-states 1000, max-src-nodes 10000, max-src-conn 3)

насколько я знаю по мануалу:

max - число записей в таблице состояний, то есть сессий

max-src-nodes - число возможных исходящих ИПов, то есть разных клиентов, непонятно как их может быть больше чем возможных соединений на правило

max-src-conns - число established соединений с одного ИПа (насколько я знаю не всегда правильно работает)

max-src-states - вот это называется сколько сессий с ОДНОГО ИПа, а не в общем, для того был параметр max

так что пишите:

pass in on $ext_if proto tcp to 1.2.3.4 port 250 flags S/SA \
keep state (max 1000, source-track rule, max-src-states 3, max-src-nodes 1000, max-src-conns 3)

N
На сайте с 06.05.2007
Offline
419
#8

а в этой конфигурации засада :

закрытые или не полностью открытые соединения так же заполняют эту таблицу states и влияют на лимит соединений.

то есть я открываю 3 телнета, сразу же закрываю соединения. следущие попытки установить соединения приведут к блокировке до тех пор пока не освободится хотя бы один state в таблице

поставил вот очень небольшие значения

tcp.finwait 4s

tcp.closed 3s

довольно неплохое приближение к требуемому решению

S
На сайте с 07.05.2007
Offline
20
#9
то есть я открываю 3 телнета, сразу же закрываю соединения. следущие попытки установить соединения приведут к блокировке до тех пор пока не освободится хотя бы один state в таблице
Ниже пример конфига, на ограничение 3 соединений на порт 250.

разве эти две фразы не описывают одно и то же задание???

может лучше объяснить толком что вам нужно сделать, тогда и подумаем

N
На сайте с 06.05.2007
Offline
419
#10

Нет, любая запись в той таблице описывает Состояние Соединения. там все соединения, включая неполные и недавно закрытые. Но мне то нужно именно число установленных соединений в состоянии ESTABLISHED.

Я так понимаю это не проблема портирования pf, все работает как и обычно работает в оригинальной openbsd?

Вот линуксе connlimit работает как часы и делает именно то, чего ожидают люди, а не то, что смог сделать программист.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий