====== 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**, которая по умолчанию запрещает любой трафик, который явно не разрешен.