iptables - утилита командной строки для настройки брандмауэра ядра Linux, реализованная в рамках проекта Netfilter.
Термин iptables также обычно используется для обозначения этого брандмауэра на уровне ядра.
Примечание: iptables — это устаревшая платформа, nftables стремится предоставить современную замену, включая уровень совместимости.
Контактная информация:
Официальный сайт
Лицензия:
GPL2
Синтаксис:
iptables <опции> <таблица> <команда> <правила>
Использование:
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Команды:
Команда | Описание |
---|---|
--append -A chain | Добавить правило в цепочку |
--check -C chain | Проверить существование правила |
--delete -D chain | Удалить соответствующее правило из цепочки |
--delete -D chain rulenum | Удалить правило с номером rulenum (1 = первое) из цепочки |
--insert -I chain [rulenum] | Вставить в цепочку с номером rulenum (по умолчанию 1=первое) |
--replace -R chain rulenum | Заменить правило с номером rulenum (1 = первое) в цепочке |
--list -L [chain [rulenum]] | Вывести список правил в цепочке или во всех цепочках |
--list-rules -S [chain [rulenum]] | Вывести правила в цепочке или во всех цепочках |
--flush -F [chain] | Удалить все правила в цепочке или во всех цепочках |
--zero -Z [chain [rulenum]] | Сбросить счетчики в цепочке или во всех цепочках |
--new -N chain | Создать новую пользовательскую цепочку |
--delete-chain -X [chain] | Удалить пользовательскую цепочку |
--policy -P chain target | Изменить политику цепочки на цель |
--rename-chain -E old-chain new-chain | Изменить имя цепочки (перемещение всех ссылок) |
Опции:
Опция | Описание |
---|---|
--ipv4 -4 | Ничего (строка игнорируется ip6tables-restore) |
--ipv6 -6 | Ошибка (строка игнорируется iptables-restore) |
[!] --proto -p proto | протокол: по номеру или имени, например, tcp |
[!] --source -s address[/mask][...] | указание источника |
[!] --destination -d address[/mask][...] | указание назначения |
[!] --in-interface -i имя ввода[+] | имя сетевого интерфейса ([+] для подстановки) |
--jump -j target | цель для правила (может загружать расширение цели) |
--goto -g chain | переход к цепочке без возврата |
--match -m match | указание дополнительного модуля сопоставления (match module), который будет применяться к пакетам при проверке правил фильтрации (может загружать расширение) |
--numeric -n | числовой вывод адресов и портов |
[!] --out-interface -o | имя вывода[+] имя сетевого интерфейса ([+] для подстановки) |
--table -t table | таблица для изменения (по умолчанию: "filter") |
--verbose -v | режим подробного вывода |
--wait -w [секунды] | максимальное время ожидания блокировки xtables перед отказом |
--wait-interval -W [мксекунды] | время ожидания для попытки получения блокировки xtables, по умолчанию 1 секунда |
--line-numbers | выводить номера строк при перечислении |
--exact -x | развернуть числа (отображать точные значения) |
[!] --fragment -f | сопоставлять только вторые и последующие фрагменты |
--modprobe=<команда> | попытаться загрузить модули с помощью этой команды |
--set-counters PKTS BYTES | установить счетчик во время вставки/добавления |
[!] --version -V | вывести версию пакета. |
Все пакеты делятся на три типа: входящие, исходящие и проходящие.
Входящие
- это те, которые были отправлены на этот компьютер;Исходящие
- отправленные из этого компьютера в сеть;Проходящие
- это пакеты, которые просто должны быть пересланы дальше, например, если данный компьютер выступает в качестве маршрутизатора.В фильтре iptables все пакеты делятся на три аналогичные цепочки:
Input
- обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к компьютеру по ssh или любой веб-сайт отправит свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;Output
- эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping ya.ru или когда запускается браузер и пытается открыть любой сайт;Forward
- эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Такое наблюдается на маршрутизаторах или, например, если компьютер раздает wifi.При работе сети используются обе цепочки input и output. Например, при попытке выполнить ping, данные отправятся через output, но ответ придет через input. То же самое происходит при просмотре сайтов и других действиях. А цепочка forward может вообще не использоваться, если компьютер не является маршрутизатором.
Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
PREROUTING
- в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;POSTROUTING
- сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил
.
Действий может быть несколько:
ACCEPT
- разрешить прохождение пакета дальше по цепочке правил;DROP
- удалить пакет;REJECT
- отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;LOG
- сделать запись о пакете в лог файл;QUEUE
- отправить пакет пользовательскому приложению.Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации:
raw
- предназначена для обработки пакетов прежде, чем они будут переданы системе conntrack, которая занимается отслеживанием состояния соединений и принадлежностью пакетов этим соединениям. Содержит встроенные цепочки PREROUTING и OUTPUT;mangle
- используется для модификации некоторых заголовков (TTL, TOS) и маркировке пакетов и соединений, содержит цепочки PREROUTING, INPUT, FORWARD, OUTPUT и POSTROUTING;nat
- предназначен для преобразования адресов и портов источника и назначения пакетов, встроенные цепочки: PREROUTING, OUTPUT, POSTROUTING;filter
- применяется, собственно, для фильтрации пакетов, является таблицей по умолчанию, т.е. если таблица не указана явно, то используется filter, имеет цепочки INPUT, FORWARD и OUTPUT;security
- используется для работы совместно с системами принудительного контроля доступа, такими как SELinux. Встроенные цепочки INPUT, FORWARD, OUTPUT.Следует обратить внимание, что названия таблиц всегда пишутся в нижнем регистре, а цепочек - в ВЕРХНЕМ.
Для просмотра правил iptables необходимо ввести команду с опцией -L:
sudo iptables -L
Для просмотра нужной цепочки необходимо ввести команду с опцией -L и наименование цепочки:
sudo iptables -L INPUT
Отключить iptables остановив сервис обновления правил iptables через systemd или даже удалив набор утилит для настройки невозможно. Подсистема работает на уровне ядра и не зависит от того, что установлено. Поэтому, если сделано что-то не так, то нужно будет очистить правила. Для этого необходимо выполнить:
sudo iptables -F
Или только для определенной цепочки:
sudo iptables -F Input
Если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:
#В этом примере разрешены цепочки INPUT и OUTPUT, но запрещена FORWARD.
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
Проверить:
sudo iptables -L
Для блокировки пакетов можно использовать действие DROP. Фильтровать пакеты, которые нужно заблокировать можно по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.
Команда, которая позволяет добавить правило iptables для блокировки всех входящих и исходящих пакетов от 10.10.10.10:
sudo iptables -A INPUT -s 10.10.10.10 -j DROP
sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP
Блокировка диапазона ip выполняется подобным образом. Для этого нужно использовать маску сети 10.10.10.0/24. Это будут все адреса начиная от 10.10.10.0 до 10.10.10.255:
sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP
Расширенный вариант маски:
sudo iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Можно заблокировать все входящие соединения ssh:
sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Удаление правил iptables выполняется с опцией D. Например:
sudo iptables -D INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Полностью очистить iptables выполнив команду с опцией -F:
sudo iptables -F
Все настройки iptables, которые указаны с помощью этих команд сохранятся только до перезагрузки. После перезагрузки компьютера все изменения будут стерты. Поэтому, чтобы сохранить правила iptables, нужно выполнить специальную команду:
iptables-save -f /etc/iptables/iptables.rules
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Где:
-A
означает добавление нового правила в список.INPUT
значит, что изменения касаются цепочки INPUT.-P
– указывает на протокол. В этом случае на TCP.–dport
– порт назначения. По умолчанию любой веб-сервер запущен на 80-ом порте.ICMP (Internet Control Message Protocol)
— протокол, который входит в состав TCP/IP и задействован для передачи сообщений об ошибках и экстренных ситуациях при работе с трафиком. Например, когда запрашиваемый сервер недоступен, именно этот инструмент выполняет сервисные функции. Утилита iptables позволяет заблокировать его через брандмауэр, а сделать это можно командой:
sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
Она произведет блокировку запросов от вашего и к вашему серверу.
Входящие запросы блокируются немного иначе. Тогда нужно ввести:
sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP
После активации данных правил сервер не будет отвечать на ping-запросы.
Серверы иногда подвергаются DDoS атакам или другим несанкционированным действиям со стороны злоумышленников. Правильная настройка межсетевого экрана позволит обезопаситься от подобного рода взломов. Для начала рекомендовано задать правила:
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
--limit 20/minute
— ограничение на частоту положительных результатов. Единицу измерения можно указать самостоятельно, например, /second, /minute, /hour, /day.--limit-burst number
— ограничение на число пропускаемых пакетов.Далее можно запретить сканирование открытых портов, чтобы убрать одну из возможных причин взлома.
sudo iptables -N block-scan
sudo iptables -A block-scan -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j RETURN
sudo iptables -A block-scan -j DROP
Выражение block-scan в данных случаях — название используемой цепи.
Для того чтобы новые правила вступили в силу, необходимо перезапустить службу iptables:
sudo systemctl restart iptables
В сетях передачи данных присутствует различный тип трафика, нуждающийся в определенном качестве обслуживания. Есть приложения, критичные к задержкам при передаче данных. Например, голосовая передача данных или управление устройствами в промышленных сетях. Для других приложений важно отсутствие потерь, при этом время передачи данных не влияет на работу. Например, сбор данных с устройств учета.
Основные параметрами определения качества связи:
Задержка
– время, за которое данные доходят от отправителя до получателя.Джиттер «дрожание»
- разница задержек при передаче данных.Потери
– количество пакетов, потерянных во время передачи данных по сети.Полоса пропускания
– количество пакетов, проходящие по сети за определенный период времениiptables -A PREROUTING -t mangle -p tcp --sport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport 1025:65535 -j TOS --set-tos Maximize-Throughput
iptables -A OUTPUT -t mangle -p tcp --dport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A OUTPUT -t mangle -p tcp --dport 1025:65535 -j TOS --set-tos Maximize-Throughput
Для проверки необходимо ввести в терминале:
iptables -t mangle -L
Правила маршрутизации определяют, куда отправлять IP-пакеты. Данные маршрутизации хранятся в одной из таблиц ядра. Вести таблицы маршрутизации можно статически или динамически.
Статический маршрут - это маршрут, который задается явно с помощью команды route.
Динамическая маршрутизация выполняется процессом-демоном (routed или gated), который ведет и модифицирует таблицу маршрутизации на основе сообщений от других компьютеров сети.
Для выполнения динамической маршрутизации разработаны специальные протоколы: RIP, OSPF, IGRP, EGP, BGP и т. д.
Динамическая маршрутизация необходима в том случае, если присутствует сложная, постоянно меняющаяся структура сети и одна и та же машина может быть доступна по различным интерфейсам (например, через разные Ethernet или SLIP интерфейсы). Маршруты, заданные статически, обычно не меняются, даже если используется динамическая маршрутизация.
Для персонального компьютера, подключаемого к локальной сети, в большинстве ситуаций бывает достаточно статической маршрутизации командой route. Прежде чем пытаться настраивать маршруты, необходимо просмотреть таблицу маршрутизации ядра с помощью команды:
netstat -n -r
Если таблица пуста, то вы увидите только заголовки столбцов. Тогда надо использовать route. С помощью команды route можно добавить или удалить один (за один раз) статический маршрут.
route -f операция -тип адресат шлюз интерфейс
Здесь аргумент операция может принимать одно из двух значений: add (маршрут добавляется) или delete (маршрут удаляется).
Команда route -f удаляет из таблицы данные обо всех шлюзах.
Аргумент адресат
может быть IP-адресом машины, IP-адресом сети или ключевым словом default.
Аргумент шлюз
- это IP-адрес компьютера, на который следует пересылать пакет (этот компьютер должен иметь прямую связь с вашим компьютером).
Необязательный аргумент тип
принимает значения net или host . В первом случае в поле адресата указывается адрес сети, а во втором - адрес конкретного компьютера (хоста).
Как правило, бывает необходимо настроить маршрутизацию по упоминавшимся выше трем интерфейсам:
Локальный интерфейс поддерживает сеть с IP-номером 127.0.0.1. Поэтому для маршрутизации пакетов с адресом 127.... используется команда:
route add -net 127.0.0.1 lo
Если для связи с локальной сетью используется одна плата Ethernet, и все машины находятся в этой сети (сетевая маска 255.255.255.0), то для настройки маршрутизации достаточно вызвать:
route add -net 192.168.36.0 netmask 255.255.255.0 eth0
Если же имеется насколько интерфейсов, то необходимо определиться с сетевой маской и вызвать команду route для каждого интерфейса.
Поскольку очень часто IP-пакеты с компьютера могут отправляться не в одну единственную сеть, а в разные сети (например, при просмотре разных сайтов в Интернете), то в теории надо было бы задать очень много маршрутов. Очевидно, что сделать это было бы очень сложно, точнее просто невозможно. Поэтому решение проблемы маршрутизации пакетов перекладывают на плечи специальных компьютеров - маршрутизаторов, а на обычных компьютерах задают маршрут по умолчанию, который используется для отправки всех пакетов, не указанных явно в таблице маршрутизации. С помощью маршрута по умолчанию ядру сказано "а все остальное отправляй туда". Маршрут по умолчанию настраивается следующей командой:
route add default gw 192.168.1.1 eth0
Опция gw указывает программе route, что следующий аргумент - это IP-адрес или имя маршрутизатора, на который надо отправлять все пакеты, соответствующие этой строке таблицы маршрутизации.
Цель LOG может использоваться для журналирования пакетов, попадающих под правило. В отличие от других целей, таких как ACCEPT или DROP, пакет продолжает движение через цепочку после попадания в цель LOG. Это означает, что для включения журналирования для всех отброшенных пакетов необходимо добавить дублирующее правило LOG перед каждым правилом DROP. Поскольку это ухудшает эффективность и усложняет структуру, вместо этого можно создать цепочку logdrop.
Создать цепочку:
iptables -N logdrop
Добавить следующие правила в только что созданную цепочку:
iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
iptables -A logdrop -j DROP
Теперь, когда необходимо отбросить пакет и зарегистрировать это событие, следует просто переходим на цепочку logdrop, например:
iptables -A INPUT -m conntrack --ctstate INVALID -j logdrop
Вышеуказанная цепочка logdrop использует модуль limit для предотвращения разрастания журнала iptables и избыточных записей на жесткий диск. Без ограничения ошибочно настроенной службы или атакующего могут заполнить диск (или по крайней мере раздел /var), вызывая записи в журнал iptables.
Модуль limit вызывается с помощью -m limit. Затем вы можете использовать --limit, чтобы задать среднюю скорость, и --limit-burst, чтобы задать начальную скорость всплеска. В приведенном выше примере с logdrop:
iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
добавляет правило, которое будет регистрировать все пакеты, проходящие через него. Первые 10 последовательных пакетов будут зарегистрированы, а затем будет регистрироваться только 5 пакетов в минуту. Счетчик "limit burst" сбрасывается каждый раз, когда "limit rate" не нарушается, то есть регистрационная активность автоматически возвращается к нормальному состоянию.
Установить можно отдельным модулем или пакетом:
Для установки следует воспользоваться утилитой "Установка и удаление программ".
Модуль, необходимый для установки:
Для установки следует воспользоваться утилитой "Установка и удаление программ".
Пакет, необходимый для установки:
Внимание! Если система загружена в режиме полного сохранения, то внесенные изменения в систему будут сохранены. Если режим загрузки другой, то рекомендуется воспользоваться "Сохранением изменений".