ipset значительно облегчает жизнь iptables

В iptables мне очень не хватало таблиц PF!

block in quick on $if inet proto tcp from to $me port 80

Как красиво выглядит такое правило в PF по сравнению с ужасным аналогом в iptables:

$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 192.168.0.1 -d $me –dport 80 -j DROP
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 192.168.4.1 -d $me –dport 80 -j DROP
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 10.10.0.1 -d $me –dport 80 -j DROP
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 10.0.1.1 -d $me –dport 80 -j DROP

И так далее. Более того, проверка каждого нового правила – это лишняя нагрузка на процессор, так что если у вас несколько тысяч правил, то не удивляйтесь idle процессора, равного 0 процентов… В общем такое положение дел в iptables меня долго отпугивало от него. Но не так давно я нашел проект http://ipset.netfilter.org/ , который дает весь функционал таблиц PF и даже больше!

Настройка вся ведется на gentoo, так что мне не пришлось патчить ядро и пересобирать его:

emerge ipset
modprob ipt_set

Теперь у нас есть и работает ipset. В ipset нет таблиц, а есть set различных типов. Типы позволяют задавать ip адреса из определенной подсети (ipmap тип), связки ip адресов с MAC адресами (macipmap), порты из заданного диапазона (portmap), набор ip адресов или сетей (iphash, nethash), разные комбинации этих set-ов, или даже хранить ip адреса в set только определенное время (iptree). Более подробно советую посмотреть man ipset(8).

Для нашей задачи подходит тип iphash. Создаем set с именем badip, и смотрим его содержимое:

# ipset -N badip iphash
# ipset -L badip
Name: test
Type: iphash
References: 0
Default binding:
Header: hashsize: 1024 probes: 8 resize: 50
Members:
Bindings:

Добавляем несколько ip в badip и смотрим содержимое set

# ipset -A badip 192.168.0.1
# ipset -A badip 10.10.0.1
# ipset -L test
Name: test
Type: iphash
References: 0
Default binding:
Header: hashsize: 1024 probes: 8 resize: 50
Members:
192.168.0.1
10.10.0.1
Bindings:

Удаляем ip из set

# ipset -D badip 192.168.0.1
# ipset -L test
Name: test
Type: iphash
References: 0
Default binding:
Header: hashsize: 1024 probes: 8 resize: 50
Members:
10.10.0.1
Bindings:

Проверяем, есть ли ip в set

# ipset -T badip 10.10.0.1
10.10.0.1 is in set test.

Удаляем все ip из set

# ipset -F badip

Удаляем сам set

# ipset -X badip

Теперь, когда мы разобрались с основными командами ipset нужно научиться использовать его в iptables, перепишем правило iptables:

$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -d $me -m set –set badip src –dport 80 -j DROP

Т.е. мы подключили модуль set (-m set), потом указали какой set использовать (–set badip src). src – это флаг, который показывает какие ip сравнивать с set, src или dst . Если нужно проверить и src и dst, то флаг задается так src,dst. В результате использования ipset можно упросить и само написание правил и быстродействие фаервола в целом.


Tags: , ,

Четверг, Октябрь 8th, 2009 Советы
Tinkerbell Personal Checks |Garden Planters | Jewellery For Women | Best Dog Foods | Budget Wedding Gowns | Shop For Jewellery | Vintage Jewellery| Diamante Jewellery | Car Finance Credit | DoorStep Loans