# iptables ## Таблицы - `filter` - основная таблица для фильтрации пакетов, используется по умолчанию; - `nat` - управление преобразованием сетевых адресов; - `mangle` - модификация и замена содержимого сетевых пакетов вне контекста NAT и фильтрации пакетов; - `raw` - предназначена для работы с сырыми пакетами, пока они еще не прошли обработку ## Цепочки Цепочки бывают базовые/встроенные и пользовательские (можно создать самому). В новую цепочку можно направлять пакеты чтобы подвергуть их анализу правил. Например для отладки правил или настройки особого движения пакетов как это сделано в Docker - `INPUT` - входящий трафик (адресованный локальному хосту); - `FORWARD` - транзитный трафик поступающий на локальную машину с целью передачи его на другую машину (трафик передаваемый в docker контейнер тоже будет считаться транзитным), при этом транзитный трафик проходит в обоих направлениях; - `OUTPUT` - исходящий из локального хоста трафик ## Правила - условия и действия Правило - состоит из условия/критерия (если нет значит применяется ко всему трафику) действия (может не быть) и счетчика (для учета пакетов попавших под правило). основные действия с правилами: - `-A` - добавить правило в цепочку; - `-С` - проверить все правила; - `-D` - удалить правило; - `-I` - вставить правило с нужным номером; - `-L` - вывести все правила в текущей цепочке; - `-S` - вывести все правила; - `-F` - очистить все правила; - `-N` - создать цепочку; - `-X` - удалить цепочку; - `-P` - установить действие по умолчанию. Условия: - `-p` - протокол (TCP, UDP, ICMP, ALL); - `-s` - ip адрес источника (можно с маской 10.0.0.0/24), допускается отрицание (т.е. все кроме) `-s ! 10.0.0.0/24`; - `-d` - ip адрес получателя (аналогично `-s`); - `-i` - интерфейс с которого пришел пакет (только для `INPUT`, `FORWARD`, `PREROUTING`), например `ens3`, допускается указать `ens+` что означает все имена интерфейсов начинающиеся с заданной строки, допускается отрицание `-i ! ens+`; - `-o` - интерфейс локального хоста, из которого выходит трафик (только для `OUTPUT`, `FORWARD`, `PREROUTING`); - `--sport` - порт с которого был отправлен TCP/UDP пакет (допускаются имена служб из `/etc/services`), поддерживаются диапазоны вида `20:80` что значит от 20 до 80 порта, так же можно опустить одно из значений `:80` (от 0 до 80) или `20:` (от 20 до 65535), отрицание поддерживается даже к диапазонам `--sport ! 20:80`; - `--dport` - аналогично `--sport` только речь идет про порт, которому адресован пакет; - `--icmp-type` - тип ICMP сообщения (номер или название), поддерживается отрицание. RFC 792 или `iptables --protocol icmp --help`; - `-m mac --mac-source` - MAC адрес устройства передавшего пакет, поддерживается отрицание; - `-m state --state` - состояние соединения: - `INVALID` - неизвестное соединение, возможно ошибочное; - `NEW` - новое соединение; - `ESTABLISHED` - уже установленное соединение; - `RELATED` - пакет принадлежит уже существующему соединению, но он отправляется по новому - `-m ttl` - Time To Live: - `--ttl-eq N` - TTL пакета равен N; - `--ttl-lt N` - TTL пакета меньше N; - `--ttl-gt N` - TTL пакета больше N Действия: - `ACCEPT` - пакет принят в текущей таблице; - `DROP` - пакет сбрасывается и перестает движение в системе; - `LOG` - пакет журналируется и продолжает дальнейшие движение по цепочке правил и таблицам (рассмотрим ниже) - `REJECT` - аналогично DROP только отдает сообщение об ошибке на хост отправителя (работает на всех цепочках таблицы filter): - `--reject-with` - тип ответа, RFC 793 или `iptables -j REJECT -h` - `RETURN` - возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию ## Примеры - Просмотр текущих правил ```bash iptables -L ``` более наглядно ```bash iptables -vnL --line-numbers ```