Вступление

В последнее время в ядре Linux появилась куча новых модулей Iptables. О многих вы, наверное, слышали, некоторые, возможно, уже используете, но вы даже представить себе не можете насколько легче становится жизнь сисадмина и сколько действительно интересных и полезных возможностей обеспечивают эти модули.
Все, рассматриваемые в статье дополнения являются расширениями пакетного фильтра iptables. Некоторые из модулей, представленных в этой статье (помечены звёздочкой) ещё не присутствуют в обычных ядрах, но вы можете поставить пакет "patch-o-matic", который добавит эти модули в любое ядро. О том, как поставить пакет Patch-o-Matic, можно прочитать в статье Forb’а из бумажной версии
Хакера 09(69) за сентябрь. Кроме того, часть модулей уже была описана там же, но я надеюсь, что эта статья не потеряет своего значения от этого.

В этой части будут рассмотрены следующие возможности:

1. Определение нескольких портов в одном правиле
2. Сбалансированная загрузка
3. Ограничение числа подключений.

1. Определение нескольких портов в одном правиле при помощи multiport модуля.

Расширение multiport позволяет определить несколько разных портов в одном правиле. Это даёт возможность использовать меньше правил и упрощает редактирование и контроль файла конфигурации iptables, а также поиск правил в нём. Например, если мы хотим разрешить полный доступ к SMTP, HTTP, HTTPS и SSH сервисам на нашем сервере, мы скорее всего сделали бы так:

-A INPUT -i eth0 -p tcp -m state --state NEW --dport ssh -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW --dport smtp -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW --dport http -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW --dport https -j ACCEPT

Используя multiport можно сократить запись и написать, например, так:

-A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT

Это должно использоваться или вместе с опцией -p tcp или -p udp, причём только 15 портов может быть определенно одновременно в одном правиле. Такие вот ограничения =( Также поддерживаются варианты записи вида:

--sports port[,port,port...]
matches source port(s) 
--dports port[,port,port...]
matches destination port(s) 
--ports port[,port,port...]
matches both source and destination port(s) 

mport* - другое подобное расширение которое ещё и позволяет вам определять диапазоны портов, например - dport 22,80,6000:6100. Всё просто и ясно. 

2. Сбалансированная загрузка c использованием random* или nth*

Как расширение random, так и nth могут быть использованы для сбалансированной загрузки. Например, если вы желаете сбалансировать весь входящий web-трафик между четырьмя зеркалами вашего сайта, вы можете добавить любой из следующих наборов правил:

A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \
-j DNAT --to-destination 192.168.0.5:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 1 \
-j DNAT --to-destination 192.168.0.6:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 2 \
-j DNAT --to-destination 192.168.0.7:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 3 \
-j DNAT --to-destination 192.168.0.8:80

или:

-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
-j DNAT --to-destination 192.168.0.5:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
-j DNAT --to-destination 192.168.0.6:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
-j DNAT --to-destination 192.168.0.7:80
-A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW \
-j DNAT --to-destination 192.168.0.8:80

Расширение фильтрации nth позволяет создать до 16ти (0..15) счётчиков для одной машины, по которым будет производиться счёт пришедшего пакета. В приведённом выше примере используется счётчик 0 для каждого четвёртого пакета. Как только получен 4-ый пакет, счётчик устанавливается в 0. Первое правило применяется для первого по счёту пакета номер 4 (т.е четвёртый из четырёх подряд идущих пакетов, равнозначно четвёртый по общему счёту количества пакетов, пришедших на данный порт) (--every 4 --packet 0), второе правило - для второго по счёту пакета номер 4 из четырёх (--every 4 --packet 1),
т.е. восьмой полученный пакет по счёту и так далее.

Расширение random предоставляет возможность фильтровать пакеты с заданной частотой. Так в примере правила random перенаправляют около 25% (--average 25) соединений на 80й порт к зеркалу вашего web-сервера. 75% подключений не удовлетворяют этому правилу и 25% из них будут перенаправлены вторым правилом, ещё 25% следующим, и оставшиеся 25% соответственно последним.

Другим применением фильтрации по random может быть эмуляция перегрузки системных ресурсов.

3. Ограничение числа подключений используя limit и
iplimit*.

Расширение фильтрации limit может быть использовано, чтобы ограничить число подключений за определённый промежуток времени, в то время как iplimit может ограничивать число параллельных TCP соединений от определённого порта или сети. Эти возможности могут быть использованы для разных целей:

  • чтобы защищаться от DOS атак (отказ в обслуживании) или нападения типа HTTP-flood, не доставляя неудобств вашим клиентам и
    пользователям;
  • предотвращать bruteforce атаки (перебор паролей);
  • ограничивать использование Internet сотрудников в течение рабочего дня; 

Рассмотрим пример, в котором ты вредный админ, и шеф дал тебе указание запретить бездельникам из офиса сидеть в инете целый день и пинать пингвинов. Можем использовать правило:

-A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m limit --limit 50/hour --limit-burst 5 -j ACCEPT

Это правило предполагает, что мы действуем как прокси-сервер, где внешнее подключение идёт через интерфейс eth0, а eth1 соединён с нашей офисной сетью. Правило ограничивает все наши внутренние компьютеры только 50 новыми подключениями по HTTP и HTTPS, а использование –limit-burst предотвращает израсходование лимита в 50 соединений одним единственным офисным жлобом. Ограничение также можно ставить с параметрами /day, /hour,
/minute. Параметр –limit-burst может показаться сначала слегка запутанным. В вышеупомянутом примере он гарантирует, что если все служащие будут лезть в Internet в течение часа, то только 5 подключений будут происходить каждые 5 минут. Если истекут 30 минут на протяжении которых не будет происходить подключений, а затем в оставшиеся 30 минут пользователи начнут обращаться к проксе, то 5 подключений будут разрешаться каждые 2.5 минут. Иногда это объясняют ещё подобным образом:
для каждого правила limit, есть "область памяти", содержащая "маркеры". Всякий раз, когда срабатывает правило, “маркер” убирается, и когда количество маркеров достигает нуля, правило больше не существует.

--limit – это “область памяти”
--limit-bursts - размер области памяти (количество маркеров).

Расширение iplimit позволяет нам ограничивать число параллельных подключений по TCP протоколу от определённого хоста или сети. Если, например, мы хотим ограничить число подключений по HTTP от определённого IP-адреса пятью параллельными соединениями, можно сделать так:

-A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP

Конец первой части.

Вольный перевод статьи Advanced Features of netfilter/iptables by
Barry O'Donovan

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии