Нижеприведенные команды iptables требуют соответствующую поддержку ядра системы. Если у вас стандартное системное ядро, то эти модули уже присутствуют в системе и будут подгружаться при необходимости.
Длинные правила я обрезал символом “\”. На самом деле эти правила надо писать в одну строку.
Использование IP диапазона
В любых правилах можно задавать диапазоны ip. Это требуется, когда масками сети не перекрыть все возможные ip диапазоны.
#Запрет ip с 192.168.0.1 по 192.168.0.16
iptables -A INPUT -p tcp -i eth0 -m iprange --src-range 192.168.0.1-192.168.0.16 -j DROP
Задание мультипортов
Очень полезно, чтобы не писать несколько правил на каждый порт, используем только одно правило
#запрещаем входящие соединения к нам на перечисленные порты от сети 192.168.10.0
iptables -A INPUT -p tcp -m multiport --dports \
ssh,smtp,http,587,110,https -i eth0 -s 192.168.10.0/24 -j DROP
Задаем вероятность соединения
Очень хитрое правило 🙂 Можно задавать вероятности срабатывания правил.
Я читал байку, что таким образом были выбиты деньги на новый сервер, когда системный администратор грамотно расставил вероятности в правилах и доказал начальству, что старый сервер не справляется с нагрузкой. Т.к понять неискушенному человеку почему то есть соединение на порт, то нет, да еще непонятна закономерность очень непросто.
#соединение на порт ssh будет с вероятностью успеха 25%
iptables -A INPUT -i eth0 -m statistic --mode random \
--probability 0.25 -p tcp --destination-port 22 -j ACCEPT
Защищаем 22 порт SSH от брутфорса (перебора паролей)
Задача следующих правил ограничить соединения на порт ssh пятью попытками в течении 10 минут с 1 ip адреса.
Создаем новую цепочку правил SSHDROP
iptables -N SSHDROP
Все новые соединения на порт 22 пропускаем через цепочку SSHDROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSHDROP
iptables -A SSHDROP -m recent --set --name SSH
Если требуется будем писать лог соединений ssh
iptables -A SSHDROP -m recent --update --seconds 300 \
--hitcount 3 --name SSH -j LOG --log-level info --log-prefix "SSH DROP: "
Если начальные условия нарушены то запретим соединение
iptables -A SSHDROP -m recent --update --seconds 300 --hitcount 5 --name SSH -j DROP
Добавляем правило не перегружая весь конфиг iptables
Чтобы добавить правило в определенное место требуется вывести правила с нумерацией строк. На примере цепочки INPUT это делается командой:
iptables -L INPUT -n --line-numbers
Номера строк идут по порядку и ничего страшного, что надо вставить вместо какой-то строки новое правило. Правила подвинуться 🙂
Для вставки строки выполняем команду:
iptables -I INPUT <номер строки> <остальная часть правила>
Если после тестирования правила все нормально не забываем добавить это же правило и в конфиг iptables.
Удаляем правила из цепочек
Правила удалять достаточно просто. Иногда требуется удалить только одно правило, не перегружая весь конфиг iptables.
Например у нас в системе есть правило.
iptables -A INPUT -p udp -i eth0 -s 192.168.10.0/24 -j DROP
Удаляем это правило, используя команду iptables -D <правило>.
iptables -D INPUT -p udp -i eth0 -s 192.168.10.0/24 -j DROP
Еще пример с более сложный правилом для NAT
#добавили правило
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
#удалили
iptables -t nat -D POSTROUTING -o eth1 -j MASQUERADE
Еще одна возможность удалять правила, через его номер.
Смотрим номера к примеру цепочки INPUT
iptables -L INPUT -n --line-numbers
Первым столбцом идут номера правил.
Удаляем первое правило в цепочке INPUT
iptables -D INPUT 1
Аналогичным образом можно смотреть, а потом удалять правила в любой цепочке.
Статья еще не закончена и будет постоянно пополняться по мере накопления мной знаний по новым интересным возможностям (хитростям) Iptables