Приветствую. Пожалуй, стоит напомнить, что в
прошлой части мы рассмотрели следующие возможности:
1. Определение нескольких портов в одном правиле
2. Сбалансированная загрузка
3. Ограничение числа подключений
Тем, кто ещё не ознакомился с данными дополнениями или забыл, о чём шла речь, настоятельно советую перечитать первую часть. Далее же речь пойдёт о следующих возможностях:
1. Расширения сравнения и фильтрации по списку недавних подключений
2. Фильтрация по строке в полезных данных пакета
3. Правила, действующие по расписаниию
1. Расширения сравнения и фильтрации по списку недавних подключений
Используя подобное расширение можно, как и следовало ожидать, создавать динамические списки фильтрации IP-адресов на основе неких заданных условий и применять к ним соответствующие правила. Выражаясь более просто – это расширение даёт чрезвычайно удобный инструмент для создания пассивной IDS, которая способна, к примеру, перекрывать доступ к некоторому порту, к которому за определённый промежуток времени обращались более n раз. Пусть некий “bad boy” сканирует диапазон IP адресов, натыкается на нашу машину, и его сканнер портов несколько раз обращается к ней в поисках открытого 139 порта. Прекратить творящееся безобразие можно используя расширение сравнения по списку недавних подключений:
-A FORWARD -m recent --name portscan --rcheck --seconds 300 -j DROP
-A FORWARD -p tcp -i eth0 --dport 139 -m recent --name portscan --set -j DROP
Теперь все пакеты фильтруются в течение 300 секунд. Поддерживаются также такие варианты задания этого правила:
--name name
Имя списка, чтобы хранить в нём IP адреса или сравнивать их. Если не заданно имя, используется значение по умолчанию с именем
DEFAULT.
--set
Это добавит исходный адрес пакета в список. Если исходный адрес уже находится в списке, это обновит существующее вхождение.
--rcheck
Проверить, находится ли исходный адрес пакета в настоящее время в списке.
--update
Проверить, находится ли исходный адрес пакета в настоящее время в списке. Если да, то вхождение будет обновлено, и правило возвратит истину.
--remove
Проверит, находится ли исходный адрес пакета в настоящее время в списке и если так, то адрес будет удален из списка, и правило вернёт истину.
--seconds seconds
Эта опция должна использоваться только вместе с - rcheck или –update. Это сузит список поиска соответствий до предела последнего данного количества секунд.
--hitcount hits
Эта опция также должна использоваться только вместе с - rcheck или –update. Если используется, то это сузит список соответствий до количества вхождений с равными или больше или равным количеством пришедших пакетов. Эта опция может использоваться наряду с --seconds, чтобы создать более узкий критерий соответствия, требующий некоторого числа обращений в пределах определенной временной рамки.
2. Фильтрация по строке в данных пакета
Это расширение позволяет производить поиск подстроки в полезных данных пакета. Хотя этому расширению действительно можно найти полезное применение, я советую вам работать с ним как можно аккуратней. Допустим, наш внешний firewall, построенный на Линуксе, защищает внутреннюю сеть, где есть несколько машин под управлением Windows и мы хотели бы блокировать все исполняемые файлы, которые могут быть получены из внешней сети. Можно попытаться использовать что-то вроде этого:
-A FORWARD -m string --string '.com' -j DROP
-A FORWARD -m string --string '.exe' -j DROP
Но это доставит вам несколько неприятных моментов:
- Если '.com' или '.exe' файл разбит на два пакета данных, то подобное правило не принесёт желаемого результата и пакет не будет отфильтрован.
- Любой пакет, содержащий такую подстроку, включая HTTP ответы и почту, будет заблокирован.
Короче, handle with care!
3. Правила, действующие по расписанию
Используя модуль времени, мы можем применять правила фильтрации, основанные на времени дня и дне недели. Это может использоваться для ограничения доступа пользователям к сети, например, чтобы во время обеда выполнить архивацию данных или обслуживание системы.
Следующий пример запрещает доступ к сети в течение часа:
-A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m time --timestart 12:30 --timestop 13:30 --days Mon,Tue,Wed,Thu,Fri -j DROP
Понятно, что время является 24-часовыми с форматом HH:MM. День - отделенный запятыми список, который зависит от регистра символов и может состоять из Mon, Tue, Wed, Thu, Fri, Sat и/или Sun.
Продолжение следует…