====== IPTABLES ====== ===== Принцип настройки ===== Общий синтаксис использования iptables: iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие> ==== Таблица ==== Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter. ==== Команда ==== Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило. ==== Цепочка ==== В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные). ==== Номер ==== Некоторые команды требуют указания номера правила, например, на удаление или редактирование. ==== Условие ==== Условие описывает критерии отработки того или иного правила. ==== Действие ==== Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия. Справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил. ===== Ключи 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**. |**Таблица**|**Действие**|**Описание**| | |**ACCEPT**|Разрешает пакет.| |**filter**|**DROP**|Запрещает пакет.| | |**REJECT**|Запрещает с отправкой сообщения источнику.| ===== Добавление правил ===== Добавить правило в произвольное место таблицы: iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT Данная команда добавит правило, разрешающее трафик с любого IP-адреса и для любого интерфейса по протоколу **TCP** b порту 80 на цепочку **INPUT**. Добавление правила с комментариями: iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 80 -m comment --comment "allow_http" -j ACCEPT Добавление правила для нескольких портов: iptables -I INPUT 4 -s 192.168.2.0/24 -p tcp --match multiport --dports 80,443 -m comment --comment "allow_http_https_from_LAN" -j ACCEPT Данная команда добавит правило, разрешающее трафик на цепочке **INPUT** для протокола **TCP** по портам **80** и **443** с комментарием. ===== Изменение политики на цепочке ===== iptables -P INPUT DROP Команда указывает политику **DROP** для цепочки **INPUT**, которая по умолчанию запрещает любой трафик, который явно не разрешен.