Настройка iptables на Linux: Что такое iptables?
Iptables — утилита брандмауэра командной строки, которая использует цепную политику для разрешения или блокирования трафика. Когда соединение пытается установить себя в вашей системе, iptables ищет правило в своем списке, чтобы соответствовать ему. Если он не находит его, он прибегает к действию по умолчанию.
Iptables почти всегда поставляется с предустановленной версией на любом дистрибутиве Linux. Чтобы обновить / установить его, просто загрузите пакет iptables:
Есть GUI-альтернативы iptables, такие как Firestarter, но iptables не так уж и сложно, если вы выполните буквально несколько команд. Будьте предельно осторожными при настройке правил iptables, особенно если вы используете SSH’d на сервере, потому что одна неправильная команда может надолго заблокировать вас до тех пор, пока она не будет вручную зафиксирована на физической машине.
Как сохранить правила iptables?
Debian 7 / Wheezy
Устанавливаем пакет iptables-persistent
# apt-get install iptables-persistent
Сохраняем текущие правила iptables
# /etc/init.d/iptables-persistent save
Добавляем в автозагрузку
# update-rc.d iptables-persistent defaults
Debian 8 / Jessie
Устанавливаем пакет netfilter-persistent
# apt-get install netfilter-persistent iptables-persistent
Сохраняем текущие правила iptables
# netfilter-persistent save
Добавляем в автозагрузку
# systemctl enable netfilter-persisten
В некоторых случаях может появиться следующая ошибка при установке пакета netfilter-persistent
root@localhost:~# apt-get install iptables-persistent Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: netfilter-persistent The following NEW packages will be installed: iptables-persistent netfilter-persistent ---cut--- update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults A dependency job for netfilter-persistent.service failed. See 'journalctl -xn' for details. invoke-rc.d: initscript netfilter-persistent, action "start" failed. dpkg: error processing package netfilter-persistent (--configure): subprocess installed post-installation script returned error exit status 1 dpkg: dependency problems prevent configuration of iptables-persistent: iptables-persistent depends on netfilter-persistent (= 1.0.3); however: Package netfilter-persistent is not configured yet. dpkg: error processing package iptables-persistent (--configure): dependency problems - leaving unconfigured Processing triggers for systemd (215-17+deb8u3) ... Errors were encountered while processing: netfilter-persistent iptables-persistent E: Sub-process /usr/bin/dpkg returned an error code (1)
Workaround — закомментировать в /etc/modules строку acpiphp и перезагрузить машину.
root@localhost:~# cat /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. loop # acpiphp
Ключи iptables и примеры их использования
Для работы с таблицами (iptables -t)
Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.
Ключ | Описание |
---|---|
-t filter | Таблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты) |
-t nat | Для пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих). |
-t mangle | Для изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING. |
-t raw | Для создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT. |
Команды
Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.
Ключ | Описание и примеры |
---|---|
-A | Добавление правила в конец списка:iptables -A INPUT -s 192.168.0.15 -j DROP запретить входящие с 192.168.0.15. |
-D | Удаление правила:iptables -D INPUT 10 удалить правило в цепочке INPUT с номером 10. |
-I | Вставка правила в определенную часть списка:iptables -I INPUT 5 -s 192.168.0.15 -j DROP вставить правило 5-м по списку. |
-R | Замена правила.iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT заменить наше 5-е правило с запрещающего на разрешающее. |
-F | Сброс правил в цепочке.iptables -F INPUT |
-Z | Обнуление статистики.iptables -Z INPUT |
-N | Создание цепочки.iptables -N CHAINNEW |
-X | Удаление цепочки.iptables -X CHAINNEW |
-P | Определение правила по умолчанию.iptables -P INPUT DROP |
-E | Переименовывание цепочки.iptables -E CHAINNEW CHAINOLD |
Условия
Данные ключи определяют условия правила.
Ключ | Описание и примеры |
---|---|
-p | Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.iptables -A INPUT -p tcp -j ACCEPT разрешить все входящие tcp-соединения. |
-s | Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.iptables -A INPUT -s 192.168.0.50 -j DROP запретить входящие с узла 192.168.0.50 |
-d | Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.iptables -A OUTPUT -d 192.168.0.50 -j DROP запретить исходящие на узел 192.168.0.50 |
-i | Сетевой адаптер, через который приходят пакеты (INPUT).iptables -A INPUT -i eth2 -j DROP запретить входящие для Ethernet-интерфейса eth2. |
-o | Сетевой адаптер, с которого уходят пакеты (OUTPUT).iptables -A OUTPUT -o eth3 -j ACCEPT разрешить исходящие с Ethernet-интерфейса eth3. |
—dport | Порт назначения.iptables -A INPUT -p tcp —dport 80 -j ACCEPT разрешить входящие на порт 80. |
—sport | Порт источника.iptables -A INPUT -p tcp —sport 1023 -j DROP запретить входящие с порта 1023. |
Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.
Действия
Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j.
Таблица | Действие | Описание |
---|---|---|
filter | ACCEPT | Разрешает пакет. |
DROP | Запрещает пакет. | |
REJECT | Запрещает с отправкой сообщения источнику. | |
nat | MASQUERADE | Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет. |
SNAT | Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены. | |
DNAT | Подмена адреса для входящих пакетов. | |
REDIRECT | Перенаправляет запрос на другой порт той же самой системы. | |
mangle | TOS | Видоизменение поля TOS (приоритезация трафика). |
DSCP | Изменение DSCP (тоже приоритезация трафика). | |
TTL | Изменение TTL (время жизни пакета). | |
HL | Аналогично TTL, но для IPv6. | |
MARK | Маркировка пакета. Используется для последующей фильтрации или шейпинга. | |
CONNMARK | Маркировка соединения. | |
TCPMSS | Изменение значения MTU. |
Маскарадинг (или маскирование)
Маскарадинг — это метод обработки пакетов, при котором пакеты передаются через некоторую машину, работающую как шлюз. Эта машина при пересылке пакетов помечает их, чтобы знать, какой машине в сети вернуть полученный ответ. Таким образом, несколько машин из внутренней сети могут обращаться к внешней сети, а извне это будет выглядеть так, как будто обращения идут от той самой машины, являющейся шлюзом. Маскарадинг связан в первую очередь с NAT (Network Address Translation), пакеты при трансляции адресов маскируются, чтобы ответ вернулся именно к источнику запроса.
Например, у нас есть некоторая локальная сеть с адресами 192.168.0.0/24, в этой сети есть шлюз с адресом 192.168.0.1, имеющий два сетевых интерфейса, eth0 и eth1. eth0 — внешний, подключенный к провайдеру, например, с адресом 192.168.100.25, eth1 — внутренний, подключенный к локальной сети, тот самый, на котором адрес 192.168.0.1. Необходимо обеспечить работу всех клиентов из локальной сети в сети Интернет таким образом, чтобы это было для них прозрачно.
В таком случае в первую очередь необходимо включить форвардинг пакетов между сетевыми интерфейсами шлюза, чтобы пропускать трафик из внутренней сети наружу. Есть два варианта, как это можно сделать. Первый — раскомментировать в файле /etc/sysctl.conf строчку
net.ipv4.ip_forward=1
После этого вам надо будет перезагрузиться, чтобы убедиться, что форвардинг работает. Второй — включить форвард вручную командой
echo "1" >/proc/sys/net/ipv4/ip_forward
Этот способ заработает без перезагрузки. Можно использовать оба, а можно в скрипте, например, использовать при загрузке правил iptables только второй.
После этого мы можем задать правило для адресной трансляции:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j MASQUERADE
Это правило после обработки пакетов осуществит маскирование, если пакеты из внутренней сети направлены куда-то в другую подсеть. Если нам нужно маскировать пакеты для конкретной подсети, к примеру, из одной локальной подсети (192.168.2.0/24) в другую (192.168.0.0/24), то мы можем создать следующее правило:
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.0.0/24 -j MASQUERADE
AUTHORS
Marc Boucher made Rusty abandon ipnatctl by lobbying for a generic packet
selection framework in iptables, then wrote the mangle table, the owner match,
the mark stuff, and ran around doing cool stuff everywhere.
James Morris wrote the TOS target, and tos match.
Jozsef Kadlecsik wrote the REJECT target.
Harald Welte wrote the ULOG and NFQUEUE target, the new libiptc, as well as the TTL, DSCP, ECN matches and targets.
The Netfilter Core Team is: Jozsef Kadlecsik, Pablo Neira Ayuso,
Eric Leblond, Florian Westphal and Arturo Borrero Gonzalez.
Emeritus Core Team members are: Marc
Boucher, Martin Josefsson, Yasuyuki Kozakai, James Morris, Harald Welte and
Rusty Russell.
Man page originally written by Herve Eychenne <[email protected]>.
Установка iptables
На самом деле фаервол у нас на сервере уже стоит и работает, просто нет никаких правил, все открыто. Установить нам нужно будет дополнительные утилиты управления, без которых конфигурировать iptables невозможно. Например, нельзя будет перезапустить фаервол:
# systemctl restart iptables.service Failed to issue method call: Unit iptables.service failed to load: No such file or directory.
Или добавить в автозапуск не получится:
# systemctl enable iptables.service Failed to issue method call: No such file or directory
Чтобы подобных ошибок не было, установим необходимый пакет с утилитами:
# yum -y install iptables-services
Теперь можно добавить iptables в автозагрузку и запустить:
# systemctl enable iptables.service # systemctl start iptables.service
SYNOPSIS
iptables-ttable-A-C-Dchainrule-specification
ip6tables [-t table] {-A|-C|-D}
chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
О состояниях соединения
Существует множество протоколов, которым требуется двусторонняя коммуникация. К примеру, пользователю понадобилось поработать с SSH-соединением, ему придется внести правило сразу и в Output, и в Input.
Что делать, если юзер хочет предоставить разрешение исключительно входящему соединению? В этом случае поможет состояние соединения. Оно даст возможность пользователю описать любую двустороннюю коммуникацию, в которой разрешено подключение заданного направления.
Разрешим соединение типа SSH, приходящее через хост 120.120.120.120. Система будет отправлять данные по этому протоколу только, если сессия установлена.
Как сохранить изменения в конфигурации файрвола
После всех изменений, которые мы внесли в цепочку межсетевого экрана, понадобится их сохранение. Иначе перезапуск утилиты удалит проделанные нами настройки. Команда сохранения будет различаться от дистрибутива к дистрибутиву Линукс.
Для Убунту команда выглядит так:
Для Red Hat и CentOS:
Либо
Дополнительно
Чтобы вывести сконфигурированное ранее правило:
Чтобы просмотреть данные о входящих/исходящих пакетах и трафике, достаточно добавить ключ –v.
Данные об имени хоста, протоколах, сетях появятся в цифровом виде, если дописать в команду –n.
Разом удалить все имеющиеся установленные правила возможно командой:
191028
Санкт-Петербург
Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700
300
ООО «ИТГЛОБАЛКОМ ЛАБС»
Вступление
Iptables в настоящее время является стандартом де-факто в среде современных linux дистрибутивов. Я даже сходу не могу припомнить, что еще используют в качестве фаервола. Так что любому администратору линукс приходится сталкиваться в своей работе с настройкой этого межсетевого экрана.
К этому фаерволу существуют разные обвязки, которые используются для более «удобной» настройки. В ubuntu есть ufw, в centos — firewalld, с другими не знаком. Лично я не вижу никакого удобства в использовании этих инструментов. Я привык настраивать линуксовый фаервол по-старинке, как научился в самом начале работы. Мне кажется это наиболее простым и удобным способом, которым я с вами и поделюсь. Суть его сводится к тому, что создается скрипт с правилами фаервола. Этот скрипт можно легко редактировать под свои нужды и переносить с сервера на сервер.
Автозагрузка правил iptables
1. Загрузка правил с помощью скрипта
Сохраненные правила с помощью утилиты iptables-save можно восстанавливать с помощью скрипта, запускаемого при каждом запуске операционной системы. Для этого необходимо выполнить следующие действия:
Сохранить набор правил межсетевого экрана с помощью команды:
Для запуска набора правил при старте операционной системы перед включением сетевого интерфейса мы создаем новый файл с помощью команды:
Заметим — в сети есть много вариантов места размещения скрипта на локальной машине, но я считаю именно размещение в папке if-pre-up.d наиболее верным, так как при этом скрипт будет выполнятся перед включением сетевого интерфейса. Добавляем в данный файл следующий скрипт:
Сохраняем файл iptables Ctrl+O. Выходим из editor Ctrl+X. Устанавливаем необходимые права для созданного файла:
Перезагружаем компьютер и проверяем результат для таблицы filter с помощью команды:
Для обеспечения безопасности необходимо, чтобы конфигурация iptables применялась до запуска сетевых интерфейсов, сетевых служб и маршрутизации. Если данные условия не будут соблюдены — появляется окно уязвимости между загрузкой операционной системы и правил защиты межсетевого экрана. Для реализации такого варианта защиты можно использовать пакет iptables-persistent.
2. Автозагрузка правил iptables-persistent
По умолчанию данный пакет не установлен в операционной системе. Данный вариант реализации автозапуска конфигурации возможен в операционных системах Debian, Ubuntu. Для установки пакета требуется выполнить команду:
Этот пакет впервые стал доступен в Debian (Squeeze) и Ubuntu (Lucid). Используемые этим пакетом правила iptables хранятся в следующих директориях:
- /etc/iptables/rules.v4 для набора правил протокола IPv4;
- /etc/iptables/rules.v6 для набора правил протокола IPv6.
Но они должны быть сохранены в понятном утилите iptables-persistent виде.
Требования к формату данных файлах не задокументированны, что создает некоторые сложности для создания этих файлов вручную. Их можно создать с помощью dpkg-reconfigure:
Или можно использовать iptables-save и ip6tables-save:
Утилита netfilter-persistent тоже позволяет управлять автозагрузкой правил. Вот её синтаксис:
sudo netfilter-persistent
Где может принимать следующие значения:
- start — вызывает все плагины с параметром start, для загрузки правил в netfilter;
- stop — если настроена конфигурация сброса настроек Netfilter при остановке плагина, сбрасывает все настройки firewall на значения по умолчанию. Иначе просто выдает предупреждение;
- flush — плагины вызываются с параметром flush, что приводит к сбросу правил межсетевого экрана на значения по умолчанию;
- save — вызывает плагины с параметром save, позволяя сохранить значения правил брандмауэра в файлы на диске;
- reload — не задокументированный параметр, возникали случаи когда параметр start не срабатывал, помогал вызов этого параметра для загрузки правил из файла на диске;
Значит, чтобы сохранить правила мы можем вызвать следующую команду:
Для загрузки же сохраненных правил мы можем использовать команду:
Замечание После установки netfilter-persistent система при использовании iptables и формата хранения файлов, связанного с ним, начинает при работе выдавать предупреждение
Это связано с наличием новой утилиты настройки и редактирования правил Netfilter — nftables, для миграцию на эту утилиту старых правил iptables можно использовать автоматический транслятор правил iptables-translate. Но это уже тема для отдельной статьи.
Удаление правил по цепочке и номеру
Другой способ удаления правил Iptables состоит в использовании цепочки и номера строки. Чтобы определить номер строки правила, выведите список правил в формате таблицы и добавьте опцию :
Эта команда добавляет номер строки для каждой строки таблицы правил в столбце с заголовком .
Когда вы знаете, какое правило нужно удалить, запомните цепочку и номер строки правила. Затем запустите команду , указав далее цепочку и номер правила.
Например, если мы хотим удалить правило для входящего трафика, которое отклоняет недействительные пакеты, мы видим, что это правило с номером в цепочке . Поэтому нам нужно запустить следующую команду:
Теперь, когда вы знаете, как удалить отдельные правила брандмауэра, давайте рассмотрим возможность сброса цепочек правил.
Общие правила брандмауэра в iptables
Ниже перечислены примеры общих правил брандмауэра.
Принять все пакеты ESTABLISHED и RELATED:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Разрешать соединения HTTP и HTTPS из любого места:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Разрешить доступ к порту 21 только с определенного IP-адреса (например, 192.168.1.123) и блокировать доступ со всех других IP-адресов на сервер (например, IP-адрес сервера 192.168.1.100):
iptables -A INPUT -s 192.168.1.123 -d 192.168.1.100 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT iptables -A INPUT -d 192.168.1.100 -p tcp -m tcp --dport 21 -j DROP iptables-save
Блокировать IP-адрес (например, 192.168.1.21):
iptables -A INPUT -s 192.168.1.21 -j DROP
Заблокируйте диапазон IP и отклоните все пакеты (например, 192.168.1.0/24):
iptables -A INPUT -s 192.168.1.0/24 -j REJECT
Чтобы заблокировать исходящий трафик на порт (например, порт 123), используйте:
iptables -A OUTPUT -p tcp --dport 123 -j DROP
Проверка открыт ли порт
Когда мы настроили все правила, закрывающие и открывающие порты, нам необходимо проверить корректность примененных настроек. Для этого можно использовать приложение telnet. Telnet — приложение, позволяющее установить двунаправленное соединение между двумя компьютерами с помощью протокола telnet. В рамках нашей задачи попытка установления соединения между двумя машинами в сети используется как тест правил Netfilter. Выполняем команду следующего вида:
$ telnet ip-адрес порт
Например:
В данной команде будет проверен 443 порт у машины с ip-адресом 192.168.1.5. Если на порту 443 на удаленной машине разрешено входящее соединение и правила на локальной машине разрешают исходящее соединение на порту 443, то получим сообщение:
Или неожиданно можем получить приглашение доступа к данной машине, если на этом порте ожидает подключения серверная часть telnet.
Если же правила запрещают входящее соединение на удаленной машине, или исходящее соединение на нашей локальной машине на порту 443, то получим сообщение:
Примечание: Чтобы получить результаты необходимо подождать довольно продолжительное время, чтобы telnet получил результат попытки соединения по указанному порту.
Журналирование
Цель позволяет при срабатывании правила добавлять информацию о пакете в журнал. В отличие от прочих целей, вроде или , при срабатывании цели пакет продолжает продвижение по цепочке. Поэтому, например, чтобы включить журналирование всех отброшенных пакетов, необходимо перед каждым -правилом добавить аналогичное -правило. Правда, это не очень выгодно с точки зрения эффективности и удобства, и вместо этого лучше создать отдельную цепочку :
# iptables -N logdrop
Добавьте в неё следующие правила:
# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG # iptables -A logdrop -j DROP
Опции и объяснены разделе.
Теперь для отбрасывания пакета с добавлением соответствующей записи в журнал необходимо просто выполнить переход на цепочку :
# iptables -A INPUT -m conntrack --ctstate INVALID -j logdrop
Ограничение скорости логирования
Цепочка из предыдущего раздела использует модуль , который помогает предотвратить разрастание журнала и избежать ненужных операций записи на диск. Если этого не сделать, то неправильно настроенная служба, которая пытается установить соединение, или просто злоумышленник, могут привести к исчерпанию свободного места на диске (как минимум в разделе ) из-за добавления чрезмерного количества записей в журнал.
Модуль limit подключается опцией . Опцией задаётся средняя скорость журналирования, а опцией — начальная. В примере цепочки выше команда
# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
добавляет правило, которое логирует все проходящие через него пакеты. Первые 10 пакетов будут добавлены в журнал, но затем скорость логирования не будет превышать 5 пакетов в минуту. Если значение какое-то время не нарушается, то снова «разблокируется», т.е. журналирование автоматически вернётся к нормальному режиму.
В журнале systemd логированные пакеты отображаются как сообщения ядра.
# journalctl -k --grep="IN=.*OUT=.*"
syslog-ng
Если вы используете syslog-ng, то в файле можно настроить место хранения логов iptables. Замените:
filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
на
filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
После этого вывод iptables больше не будет отправляться в .
Если необходимо задать произвольный файл для хранения журнала iptables (вместо ), то измените значение пути в параметре (в том же файле ():
destination d_iptables { file("/var/log/iptables.log"); };
Ubuntu и CentOS
В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.
В CentOS
В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.
Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:
yum install iptables-services
Отключаем firewalld:
systemctl stop firewalld
systemctl disable firewalld
Разрешаем и запускаем iptables:
systemctl enable iptables
systemctl start iptables
В Ubuntu
Для управления брандмауэром теперь используется ufw.
Для работы с iptables, устанавливаем следующий пакет:
apt-get install iptables-persistent
Отключаем ufw:
ufw disable
Сохранение правил (permanent)
По умолчанию, все правила перестают работать после перезапуска сети или компьютера. Для сохранения правил после перезагрузки есть несколько способов настройки.
Способ 1. iptables-save (универсальный)
Сохраняем правила в файл:
iptables-save > /etc/iptables.rules
Открываем настройки сети:
vi /etc/network/interfaces
и добавляем строку:
pre-up iptables-restore < /etc/iptables.rules
Способ 2. iptables-persistent (Debian/Ubuntu)
Ставим пакет iptables-persistent:
apt-get install iptables-persistent
Для сохранения правил вводим команду:
netfilter-persistent save
Способ 3. service iptables (CentOS)
Работает в старых версиях Linux и CentOS. Необходима установка пакета:
yum install iptables-services
apt-get install iptables-services
* первая команда для CentOS, вторая — для Ubuntu.
Сохраняем правила командой:
service iptables save
* правила будут сохранены в файл /etc/sysconfig/iptables.
Чтобы правила восстанавливались автоматически при старте компьютера, разрешаем автозапуск сервиса.
а) в более новых версиях Linux:
systemctl enable iptables
б) в версиях постарше:
chkconfig iptables on
update-rc.d iptables defaults
* первая команда для CentOS, вторая для Ubuntu.
Ассоциативные массивы
Старый инструмент IP set разрешал делать различные типы групп объектов, но не умел соотносить объекты с разрешениями — невозможно было в одном правиле допустить один объект, но запретить иной.
В правилах nftables можно ссылаться не на отдельный критерий и решение, а на ассоциативные массивы из них. Синтаксис таких ассоциативных массивов: vmap { объект : разрешение, …}. Здесь vmap — это опция, которая указывает, что последует именно массив из объектов и разрешений, а { ключ : значение, …} — общий синтаксис ассоциативных массивов.
Например, в одном правиле мы можем разрешить зашифрованные варианты SMTP (SMTPS и SMTP/STARTTLS), но запретить обычный на порте 25.
Мы также можем определить именованный ассоциативный массив (например, banlist) и сослаться на него в правиле с помощью опции vmap @banlist. Именованный массив может быть и пустым, с расчетом на динамическое редактирование.
Это очень упрощает работу скриптов вроде fail2ban, поскольку массив можно динамически редактировать средствами nftables.
В IP set был встроенный набор типов, но не было возможности создать свои, поэтому разработчики добавили многочисленные варианты вроде hash:ip,port, пытаясь покрыть все возможные случаи. В nftables больше нет такой проблемы — элементы ассоциативных массивов могут быть произвольных типов.
Например, мы можем одним правилом NAT прокинуть порт 80 на адрес 10.0.0.10, а порт 25 — на адрес 10.0.0.20.
Даже если синтаксис nftables кажется тебе менее читаемым, в качестве компенсации он позволяет обойтись меньшим числом правил.
Перечисление правил по спецификации
Чтобы перечислить все действующие правила Iptables, запустите команду с опцией :
Как вы видите, вывод выглядит примерно так, как и команды, которые использовались для их создания, но не имеют команды в начале. Также вывод будет напоминать файлы конфигурации правил Iptables, если вы когда-либо использовали или .
Перечисление списка правил конкретной цепочки
Если вы хотите ограничить вывод конкретной цепочкой (, , и т. д.), вы можете указать название цепочки сразу после опции . Например, для отображения всех спецификаций правил в цепочке необходимо запустить следующую команду:
Теперь давайте рассмотрим альтернативный способ просмотра действующих правил Iptables в форме таблицы правил.