iptables — команда управления межсетевым экраном в linux. Является CLI для netfilter, для работы требует доступа уровня root. Состоит из пяти таблиц (filter, nat, mangle, raw, security), в каждой из которых от двух до пяти цепочек (prerouting, input, forward, output, postrouting). Наиболее востребованными являются таблицы filter и nat, поэтому примеры в этой заметке будут ориентированы именно на них.
Общая схема прохождения пакета через netfilter:
Синтаксис команды iptables
iptables <операция> <цепочка> <таблица> <фильтр> <действие> <опции>
Не все фрагменты синтаксиса (кроме операции) обязательны к использованию, набор зависит от цели выполнения команды, это будет наглядно показано далее в примерах.
Операция — основное действие, выполняемое командой. Примеры — добавление, удаление, модификация.
Операция | Описание |
-L | вывести список правил |
-A | добавить правило |
-I | вставить (добавить) правило по номеру |
-D | удалить правило |
-F | удалить все правила |
-N | создать новую цепочку |
-X | удалить цепочку |
Цепочка — одна из пяти цепочек (prerouting, input, forward, output, postrouting). Выбор цепочки зависит от того, на каком этапе прохождения пакета вы хотите применить правило.
Таблица — одна из пяти таблиц (filter, nat, mangle, raw, security). Без указания таблицы правило будет применено в таблице FILTER.
Фильтр — набор опций, по которым будет выбираться пакет, к которому применится правило. Может включать ip-адрес (src или dst), номер порта, состояние соединения и др.
Опция | Описание |
-i | входящий интерфейс пакета |
-o | исходящий интерфейс пакета |
-s | источник (ip или подсеть) пакета |
-d | получатель (ip или подсеть) пакета |
-p | протокол |
Действие — применяемое к выбранному пакету действие. Устанавливается с помощью ключа -j. Примеры — accept, drop, redirect, masquerade и др.
Опции — дополнительные опции вывода, не попавшие в предыдущие фрагменты. Примеры -v, —line-numbers
Примеры использования iptables
Вывести список правил iptables:
iptables -L
Вывести список правил с дополнительной информацией (-v) и номерами строк (—line-numbers):
iptables -L -v --line-numbers
Вывести список правил конкретной цепочки или таблицы:
## Вся таблица NAT
iptables -L -t nat
## Цепочка POSTROUTING таблицы NAT
iptables -L POSTROUTING -t nat
## Цепочка INPUT таблицы FILTER (т.к. таблица не указана)
iptables -L INPUT
Запретить (-j DROP) входящие соединения:
## Со всех источников на eth0 для HTTP (TCP/80)
iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP
## С определенного IP для HTTP (TCP/80)
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 80 -j DROP
## Из подсети для для HTTP (TCP/80)
iptables -A INPUT -s 1.2.3.0/24 -p tcp --dport 80 -j DROP
Запретить входящие SSH-соединения всем, кроме определенного IP (4.3.2.1):
## Запрещаем все входящие SSH соединения
iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
## Узнаем номер предыдущего правила
iptables -L INPUT --line-numbers
...
5 DROP tcp -- anywhere anywhere tcp dpt:22
...
## Вставляем разрешающее правило выше запрещающего (вместо -А используем -I)
iptables -I INPUT 4 -i eth0 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT
Удаляем правила iptables:
## по номеру в таблице INPUT
iptables -D INPUT 4
## по ip и действию
iptables -D INPUT -s 4.3.2.1 -j ACCEPT
## все правила в таблице OUTPUT
iptables -F OUTPUT
Настраиваем маскарадинг (если ОС выступает роутером или гипервизором):
## Разрешаем форвардинг пакетов и перезагружаемся
echo 1 > /proc/sys/net/ipv4/ip_forward && init 6
## Включаем маскарадинг для соединений из локалки наружу (внешний интерфейс - eth0)
iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o eth0 -j MASQUERADE
Пробрасываем порты снаружи через NAT:
## Все входящие на внешний интерфейс eth0
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -i vmbr1 -j DNAT --to-destination 10.0.0.10:22
## Все входящие на внешний ip 1.2.3.4
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 2222 -i vmbr1 -j DNAT --to-destination 10.0.0.10:22
Запрещаем обращение на определенные ресурсы:
## По ip-адресу
iptables -A OUTPUT -p tcp -d 4.3.2.1 -j DROP
## По dns-имени
iptables -A OUTPUT -p tcp -d www.abcdef.ru -j DROP
Разрешаем и запрещаем отдельные протоколы и порты:
## Разрешаем пинги на всех интерфейсах
iptables -A INPUT -p icmp -j ACCEPT
## Запрещаем FTP на внешнем интерфейсе
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
Сохранение правил производится разными способами на разных ОС и не описано в этой статье. Возможные варианты — iptables-save + скрипт загрузки, пакет iptables-persistent, добавление в конфиг-файл сетевого интерфейса и др.