Появилась задача: блокировать доступ некоторому списку пользователей доступ в сеть Internet, трафик пользователей проходит через софтварный (программный) Linux маршрутизатор (роутер).
Первая мысль — блокировать в iptables. Мысль это безусловна верная, но при большом количестве правил, это будет создавать излишнюю нагрузку на CPU. Так например линейный список из 1000 правил убьет производительность роутера под нуль.
Каким образом можно увеличить производительность данной схемы ?
Выход был найден – ipset.
Установка ipset для CentOS i386 занимает 1 минуту:
Подключаем CentALT:
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
Устанавливаем нужные пакеты:
yum install ipset kmod-ipset
Обновляем iptables — пересобран штатный для CentOS iptables, только добавлен модуль SET.
yum update iptables
Создаем файл /etc/ipset.conf в который будем писать ip которым запрещен доступ следующего содержания
#!/bin/bash
# Создаем новую цепочку правил
ipset -N access iphash
# добавляем список доступа
ipset -A access 192.168.0.2
ipset -A access 192.168.0.3
ipset -A access 192.168.0.4
добавляем в автоматический запуск в файл /etc/rc.d/rc.local
добавляем последней строку
/bin/bash /etc/ipset.conf
Затем добавляем в /etc/sysconfig/iptables единственную строку которая закроет доступ всем ip адресам из выше приведенного списка
-A FORWARD -m set --set access src -j DROP
перегружаем правила iptables
service iptables restart
Все.
Переход от блокировки в iptables на блокировку в ipset снизил нагрузку на систему более чем в 2 раза при количестве правил >1000, сетевой трафик проходящий через роутер в районе 100 kpps.
Подобным образом можно успешно защищаться от простейших DDOS атак.