База знаний

Часто задаваемые вопросы, на которые мы уже ответили

iptables

iptables — утилита командной строки, являющаяся стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux.

Текущие правила на случай перезагрузки хранятся в файле /etc/sysconfig/iptables.

Ключевые понятия

  • Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен.
  • Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».
  • Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже.
  • Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.
  • Цепочка— упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.
    • Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).
    • Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.
  • Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.

Как происходит фильтрация

Все пакеты пропускаются через определенные для них последовательности цепочек.

При прохождении пакетом цепочки, к нему последовательно применяются все правила этой цепочки в порядке их следования. Под применением правила понимается проверка пакета на соответствие критерию и применение к нему указанного действия.

Под действием может подразумеваться как элементарная операция (встроенное действие, например, ACCEPT, MARK), так и переход в одну из пользовательских цепочек. Действия могут быть как терминальными, то есть прекращающими обработку пакета в рамках данной базовой цепочки (например, ACCEPT, REJECT), так и нетерминальными, то есть не прерывающими процесса обработки пакета (MARK, LOG).

Если пакет прошел через всю базовую цепочку и к нему так и не было применено ни одного терминального действия, к нему применяется действие по умолчанию для данной цепочки.

Таблицы, цепочки

  • mangle: предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
  • nat: предназначена для операций stateful-преобразования сетевых адресов и портов обрабатываемых пакетов.
  • security: предназначена для изменения маркировки безопасности (меток SELinux) пакетов и соединений.
  • raw: предназначена для выполнения действий с пакетами до их обработки системой conntrack
  • filter: предназначена для фильтрации трафика, то есть разрешения и запрещения пакетов и соединений.

В контексте статьи и примерах будем говорить о цепочке filter.

Цепочки таблицы filter

  • INPUT — эта цепочка обрабатывает трафик, поступающий непосредственно самому хосту.
  • FORWARD — позволяет фильтровать транзитный трафик.
  • OUTPUT — эта цепочка позволяет фильтровать трафик, исходящий от самого хоста.

Базовые действия

  • ACCEPT — пропуск пакета. Пакет покидает текущую базовую цепочку и следует дальше.
  • REJECT — блокировка пакета и сообщение его источнику об отказе. По умолчанию об отказе сообщается отправкой ответного ICMP-пакета «icmp-port-unreachable». Однако, это действие поддерживает опцию --reject-with, позволяющую указать формулировку сообщения об отказе (возможные значения: icmp-net-unreachable, icmp-host-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited). Для протокола TCP поддерживается отказ в форме отправки RST-пакета (--reject-with tcp-reset).
  • DROP — блокировка пакета, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками.
  • RETURN — обеспечивает возврат из текущей цепочки. В частности, если из цепочки A правилом номер 3 пакет был направлен в цепочку B, то применение к нему в цепочке B действия RETURN приведет к его переходу обратно в цепочку A, и он продолжит ее прохождение со следующего правила (номер 4). Для базовой цепочки к пакету сразу будет применено действие по умолчанию.
  • LOG — позволяет записывать информацию о пакетах в журнал ядра (syslog).

Принцип построения правила

Каждое правило — это строка, содержащая в себе:

  • критерии, определяющие, подпадает ли пакет под заданное правило;
  • действие, которое необходимо выполнить в случае выполнения критерия.

Общий вид:

iptables [-t table] command [match] [target/jump]

Разберём синтаксис подробнее:

  • Спецификатор таблицы и описание действия можно указывать в любом месте строки, однако указанный выше формат записи является общепринятым.
  • По умолчанию используется таблица filter. Если предполагается использование другой таблицы, то это требуется указать явно.
  • Команда должна стоять непосредственно за именем таблицы. Если спецификатора таблицы нет, то команда должна стоять первой. Команда определяет действие iptables, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п.
  • Раздел match задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет. Здесь мы можем указать самые разные критерии: IP-адрес источника пакета или сети, IP-адрес места назначения, порт, протокол, сетевой интерфейс, другие.
  • target указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле.

Ключи

Мы рассмотрим часто используемые ключи. Полный список можно получить в выводе --help или документации.

  • -t — указывает таблицу правил;
  • -A — проверяет, принадлежит ли пакет цепочке;
  • -p — проверка протокола пакета;
  • -j — указывает, что делать с пакетом;
  • -s — проверяет источник пакета;
  • -i — проверяет входящий интерфейс.

Примеры iptables

Рассмотрим примеры работы с таблицей filter.

Чтобы после ручного изменения правил они использовались и при перезагрузке системы, их необходимо сохранить командой:

$ service iptables save

Фильтрация по источнику пакетов

Для фильтрации по источнику используется опция -s.

  • Разрешить все входящие пакеты с узла 192.168.1.95:
$ iptables -A INPUT -s 192.168.1.95 -j ACCEPT
  • Запретить все пакеты с хостов, отличных от test.host.net:
$ iptables -A INPUT ! -s test.host.net -j DROP
  • Запретить доступ с подсети:
$ iptables -A INPUT -s 192.168.1.0/24 -j DROP
  • Разрешить хождение трафика по localhost:
$ iptables -A INPUT 1 -i lo -j ACCEPT
  • Настройка журналирования:
$ iptables -A INPUT -s 10.134.0.64/26 -m multiport --dports 22,8080,139,445 -j LOG --log-level INFO --log-prefix "Newconnection from ours: " 
$ iptables -A INPUT -s 10.134.0.64/26 -m multiport --dports 22,8080,139,445 -j ACCEPT

Для каждого нового соединения к нашему хосту из подсети 10.134.0.64/26 в системном журнале будет появляться запись примерно такого вида:

Jul 16 20:10:40 interdictor kernel: New connection from ours: IN=eth1 OUT=
MAC=00:15:17:4c:89:35:00:1d:60:2e:ed:a5:08:00 SRC=10.134.0.67
DST=10.134.0.65 LEN=48 TOS=0x00 PREC=0x00 TTL=112 ID=38914 DF PROTO=TCP SPT=31521 DPT=8080
WINDOW=65535 RES=0x00 SYN URGP=0
  • Закрываем фрагментированные пакеты (защита от ping flood):
$ iptables -A INPUT -p icmp --fragment -j LOG --log-prefix "ping flooding " 
$ iptables -A INPUT -p icmp --fragment -j DROP
  • Запрещаем ping:
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
$ iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j DROP
  • Разрешаем ping только с нужных нам хостов:
$ iptables -A INPUT -s %IP_АДРЕС% -p icmp --icmp-type echo-request -j ACCEPT
$ iptables -A INPUT -s %IP_АДРЕС% -p icmp --icmp-type echo-request -j ACCEPT
  • Устанавливаем лимит подключений равный 5 для 80 порта:
$ iptables -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 5 --connlimit-mask 32 -j DROP

Закрытие/открытие общих портов

Ниже приведен синтаксис для открытия портов общих портов TCP и UDP. Для закрытия правила выглядят аналогично, только необходимо изменить ACCEPT на DROP.

  • Открыть доступ к порту 25 (SMTP) для всех:
$ iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
  • Открыть доступ к порту 53 (DNS) для всех:
$ iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
  • Открыть доступ к портам 80,443 (Apache) для всех:
$ iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
  • Открыть доступ к порту 110 (POP3) для всех:
$ iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
  • Открыть доступ к порту 143 (IMAP) для всех:
$ iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
  • Открыть доступ к порту 3306 для IP-адреса:
$ iptables -A INPUT -s %IP-адрес% -p tcp -m tcp --dport 3306 -j ACCEPT

Настройка NAT на примере Debian/Ubuntu

NAT — механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов.

Используется для работы в локальных сетях для скрытия от внешнего доступа одной (или нескольких) машин.

Рассмотрим ситуацию, когда 2 бокса объединены в локальную сеть. Настройки указаны для той машины, которая недоступна извне.

Представим, что интерфейс смотрящий в локальную сеть — eth0, а в интернет — eth. Локальная сеть имеет адреса 192.168.0.0/24, внешний IP-адрес — 185.185.3.3.

В Debian по умолчанию транзитный трафик отключен, поэтому первым делам активируем такую возможность.

  • Открываем конфигурационный файл:
$ vim /etc/sysctl.conf
  • Убираем комментирование в следующей строке (либо добавляем ее при отсутствии):
#net.ipv4.ip_forward=1

Теперь приступим к настройке iptables.

  • Очищаем таблицы от лишних правил:
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F
  • Разрешаем транзитным пакетам трафик по внутреннему диапазону IP-адресов и запрещаем остальной:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP
  • Включаем NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT –to-source 185.185.3.3

Настройка iptables в панели управления Hestia производится согласно инструкции.

Настройка iptables в панели управления ISP производится в разделе «Система» → «Брандмауэр» веб-интрефейса. Подробнее — в статье.

Была ли эта статья полезной?