Удалось разобраться самому, правда так как опыта мало, не знаю насколько красивым получилось решение. На стенде всё работает, после проверки в бою станет ясно.
В общем решение выглядит следующим образом:
1. Настраиваем бридж (пример настроек прилагал выше)
2. Устанавливаем модуль ipset - нужен для того, чтобы iptables мог работать с большим количеством ip адресов:
sudo apt-get install ipset
sudo apt-get install netfilter-extensions-source
sudo apt-get install linux-headers-2.6.26-1-686
sudo m-a build netfilter-extensions
sudo m-a update && m-a a-i netfilter-extensions
3. Создал хеш таблицу для ip адресов:
ipset -N blacklist iphash
4. Настраиваем iptables. Использовал модуль recent, который позволяет собрать список всех адресов источников и считать количество переданных ими пакетов, в моём случае это будут syn пакеты, количество которых будет равно количеству попыток установить соединение с сервером.
#В этой цеопчке вы формируем список всех адресов источников и количества обращений
iptables -N iplist
iptables -A iplist -m recent --set -j RETURN
#В этой цепочке фильтруем трафик
iptables -A FORWARD -d 172.20.1.1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 172.20.1.1 -p tcp --dport 80 -m conntrack --ctstate NEW -j iplist
iptables -A FORWARD -d 172.20.1.1 -m set --set blacklist src -j DROP // берем адреса из ipset
iptables -P FORWARD ACCEPT
5. модуль recent по умолчанию список всех адресов заносист в файл /proc/net/ipt_recent/DEFAULT в формате:
src=192.168.1.100 ttl: 65 last_seen: 46746371 oldest_pkt: 3 45205899, 45205918, 45233353
где src= адрес источника, oldest_pkt: количество пакетов от источника (в нашем случае 3 syn пакета)
Пишем скрипт, выполняющий следующую задачу: если кол-во значение после oldest_pkt: > N, то заночим адрес в файл blacklist. Затем выгружаем адреса из файла blacklist в утилиту ipset, при помощи команды:
print `/usr/sbin/ipset -q -A blacklist $da[1]`;
$da[1] - строка в файле blacklist, соответствует ip адресу.
Полный пример скрипта приводить не буду.
6. Добавляем задание на выполнение скрипта в cron.
Хотелось бы услышать комментарии, так как возможно я чего-то не учитываю или уткнусь на какие-нить грабли, например производительность. Кстати хотелось бы знать как расчитать какое кол-во адресов можно блокировать с использованием утилиты ipset и как это отражается на производительности.
P.S Думаю кому-нибудь будет полезно. Возможно такому же начинающему изучение Linux и iptables.