«Iptables» — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) Netfilter для ядер Linux. С её помощью можно создавать и изменять правила, управляющие фильтрацией и перенаправлением пакетов. Для использования утилиты Iptables требуются привилегии суперпользователя (root).

Ключевыми понятиями iptables являются:

Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен.

  • Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».

  • Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже.

  • Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.

Цепочка — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.

  • Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

  • Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.

Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.

В зависимости от того, какие работают сервисы на серверах, набор портов будет разный. Для начала создадим свою цепочку, в которую добавим список IP адресов, которым позволено/запрещено иметь доступ к списку портов.

# iptables -N antiscan
# iptables -A antiscan -s 111.111.111.111 -j ACCEPT
# iptables -A antiscan -s 00.00.00.00 -j ACCEPT
# iptables -A antiscan -j DROP

В данном случае разрешено доступ только для двух IP-адресов. Теперь нужно добавить в цепочку INPUT список портов, к которым ограничивается доступ. Для начала добавим TCP порты.

# iptables -I INPUT -m tcp -p tcp --dport 25 -j antiscan
# iptables -I INPUT -m tcp -p tcp --dport 82 -j antiscan
# iptables -I INPUT -m tcp -p tcp --dport 3306 -j antiscan
# iptables -I INPUT -m tcp -p tcp --dport 8083 -j antiscan

Далее добавим UDP порты.

# iptables -I INPUT -m udp -p udp --dport 111 -j antiscan
# iptables -I INPUT -m udp -p udp --dport 161 -j antiscan

Теперь можно добавить правила в автозагрузку.

# iptables-save > /etc/iptables.rules
# cat > /etc/network/if-pre-up.d/iptablesup << EOF
#!/bin/bash
iptables-restore </etc/iptables.rulesexit 0 EOF  
# chmod +x /etc/network/if-pre-up.d/iptablesup
Обновлено 14 августа 2018 г.