Руководство по Iptables: как это работает (понятное объяснение с примерами)

iptables - это относительно низкоуровневое решение межсетевого экрана Linux и служебная программа командной строки, которая использует цепочки netfilter для управления сетевым трафиком. iptables работает с правилами, связанными с цепочками . Правило определяет критерии для сопоставления пакетов, проходящих через определенную цепочку. iptables использует таблицы для организации правил на основе критериев или типа решения. iptables определяет следующие таблицы:

  • filter : таблица по умолчанию, которая используется, когда мы решаем, следует ли разрешить пакетам проходить определенные цепочки ( INPUT , FORWARD, OUTPUT ).
  • nat : используется с пакетами, для которых требуется преобразование адреса / порта источника или получателя. Таблица работает со следующими цепочками: PREROUTING , INPUT , OUTPUT и POSTROUTING .
  • mangle : используется со специализированными изменениями пакетов, включающими заголовки IP (например, MSS = максимальный размер сегмента или TTL = время жизни). Таблица поддерживает следующие цепочки: PREROUTING , INPUT , FORWARD , OUTPUT и POSTROUTING .
  • raw : используется, когда мы отключаем отслеживание соединений ( NOTRACK ) для определенных пакетов, в основном для обработки без сохранения состояния и в целях оптимизации производительности. Таблица относится к цепочкам PREROUTING и OUTPUT .
  • security : используется для MAC, когда пакеты подчиняются ограничениям политики SELinux. Таблица взаимодействует с цепочками INPUT , FORWARD и OUTPUT .

На следующей диаграмме приведены таблицы с соответствующими цепочками, поддерживаемыми в iptables :

 Таблицы и цепочки в iptables

Рисунок 1 - Таблицы и цепочки в iptables

Порядок прохождения цепочки пакетов в сетевом стеке ядра следующий:

  • Входящие пакеты с адресом localhost:  PREROUTING  | INPUT
  • Входящие пакеты с адресом удаленного хоста:  PREROUTING | FORWARD | POSTROUTING
  • Пакеты, генерируемые локально (процессами приложений):  OUTPUT | POSTROUTING

Теперь, когда мы знакомы с некоторыми вводными концепциями, мы можем рассмотреть несколько практических примеров, чтобы понять, как работает iptables .

В следующих примерах используется система RHEL / CentOS 8, но они должны работать во всех основных дистрибутивах Linux. Обратите внимание, что начиная с RHEL / CentOS 7 приложением управления брандмауэром по умолчанию является firewalld (обсуждается далее в  следующей статье ). Если вы хотите использовать iptables , сначала вам нужно отключить firewalld :

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask firewalld

Затем установите пакет iptables-services (в CentOS):

sudo yum install iptables-services

(В Ubuntu вы должны установить iptables с помощью sudo apt-get install iptables ).

Теперь приступим к настройке iptables .

Настройка iptables

Команда iptables требует прав суперпользователя. Сначала проверим текущую конфигурацию iptables . Общий синтаксис для получения правил в цепочке для конкретной таблицы следующий:

sudo iptables -L [CHAIN] [-t TABLE]

 Параметр -L ( --list ) перечисляет правила в цепочке . Параметр -t ( --table ) указывает таблицу . Параметры CHAIN и TABLE необязательны. Если опция CHAIN опущена, все цепочки и связанные с ними правила рассматриваются в таблице. Если опция TABLE не указана, предполагается таблица фильтров . Таким образом, следующая команда перечисляет все цепочки и правила для таблицы фильтров :

sudo iptables -L

В системе с конфигурацией брандмауэра по умолчанию вывод будет следующим:

 Вывод текущей конфигурации в iptables

Рисунок 2 - Вывод текущей конфигурации в iptables

Мы можем быть более конкретными, например, перечислив все правила INPUT для таблицы nat с помощью следующей команды:

sudo iptables -L INPUT -t nat

Параметр опции -t ( --table ) требуется только в том случае, если операции iptables нацелены на что-то иное, чем таблица фильтров по умолчанию .

Важная заметка

Если только -t ( --table не указан) параметр опции Iptables принимает фильтр таблицу по умолчанию.

Когда вы разрабатываете правила брандмауэра с чистого листа, обычно рекомендуются следующие шаги:

  1. Удалите все остатки текущей конфигурации брандмауэра.
  2. Настройте политику брандмауэра по умолчанию.
  3. Создайте правила брандмауэра, убедившись, что сначала размещаются более конкретные (или ограничительные) правила.
  4. Сохраните конфигурацию.

Давайте кратко рассмотрим каждый из предыдущих шагов, создав образец конфигурации брандмауэра с использованием таблицы фильтров .

Шаг 1 - Очистка существующей конфигурации

Следующие команды удаляют правила из цепочек таблицы фильтров ( INPUT , FORWARD и OUTPUT ):

sudo iptables -F INPUT
sudo iptables -F FORWARD
sudo iptables -F OUTPUT

Предыдущие команды не выводят никаких результатов, если нет ошибки или вы не вызываете команду iptables с параметром -v ( --verbose ); Например:

sudo iptables -v -F INPUT

Результат выглядит следующим образом:

 Очистка цепочки INPUT в iptables

Рисунок 3 - Очистка цепочки INPUT в iptables

Далее мы настроим политику брандмауэра по умолчанию.

Шаг 2 - Настройка политики брандмауэра по умолчанию

По умолчанию iptables позволяет всем пакетам проходить через сетевую цепочку (брандмауэр). Конфигурация безопасного брандмауэра должна использовать DROP в качестве цели по умолчанию для соответствующих цепочек:

sudo iptables -P INPUT DROP

sudo iptables -P FORWARD DROP

sudo iptables -P OUTPUT DROP

Параметр опции -P ( --policy ) устанавливает политику для конкретной цепочки (такой как INPUT ) для данной цели (например, DROP ). Цель DROP заставляет систему корректно игнорировать все пакеты.

На этом этапе, если мы сохраним конфигурацию брандмауэра, система не будет принимать ни входящие, ни исходящие пакеты. Итак, мы должны быть осторожны, чтобы случайно не потерять доступ к системе, если мы использовали SSH или не имеем прямого доступа к консоли.

Далее мы настроим правила брандмауэра.

Шаг 3 - Создание правил брандмауэра

Давайте создадим несколько примеров правил брандмауэра, таких как прием соединений SSH, DNS и HTTPS.

Следующие команды разрешают доступ по SSH из локальной сети ( 192.168.0.0/24 ):

sudo iptables -A INPUT -p tcp --dport 22 -m state \
--state NEW,ESTABLISHED -s 192.168.0.0/24 -j ACCEPT

sudo iptables -A INPUT -p tcp --sport 22 -m state \
--state ESTABLISHED -s 192.168.0.0/24 -j ACCEPT

Поясним параметры, которые использовались в предыдущем блоке кода:

  • -A INPUT : указывает цепочку (например, INPUT ) для добавления правила к
  • -p tcp : сетевой протокол (например, tcp или udp ), передающий пакеты.
  • --dport 22 : порт назначения пакетов
  • --sport 22 : порт источника пакетов
  • -m state : свойство пакета, которое мы хотим сопоставить (например, state )
  • --state NEW, ESTABLISHED : состояние (я) пакета для соответствия
  • -s 192.168.0.0/24 : IP-адрес / маска источника, из которого исходят пакеты.
  • -j ACCEPT : цель или что делать с пакетами (например, ACCEPT , DROP , REJECT и т. д.)

Мы использовали две команды для включения доступа по SSH. Первый разрешает входящий трафик SSH ( --dport 22 ) для новых и существующих подключений ( -m state --state NEW, ESTABLISHED ). Вторая команда включает ответный трафик SSH ( --sport 22 ) для существующих соединений ( -m state –state ESTABLISHED ).

Точно так же следующие команды включают HTTPS-трафик:

sudo iptables -A INPUT -p tcp --dport 443 -m state \
--state NEW,ESTABLISHED -j ACCEPT

sudo iptables -A INPUT -p tcp --sport 443 -m state \
--state ESTABLISHED,RELATED -j ACCEPT

Чтобы включить DNS-трафик, нам нужно использовать следующие команды:

sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT

Для получения дополнительной информации о параметрах опции iptables , пожалуйста, обратитесь к следующим системным справочным руководствам:

  • iptables ( man iptables )
  • iptables-extensions ( man iptables-extensions ).

Теперь мы готовы сохранить конфигурацию iptables .

Шаг 4 - Сохранение конфигурации

Чтобы сохранить текущую конфигурацию iptables , мы должны выполнить следующую команду:

sudo service iptables save

Результат выглядит следующим образом:

Сохранение конфигурации iptables

Рисунок 4 - Сохранение конфигурации iptables

Мы также можем выгрузить текущую конфигурацию в файл (например, iptables.config ) для дальнейшего использования с помощью следующей команды:

sudo iptables-save -f iptables.config

Параметр -f ( --file ) указывает файл для сохранения (резервного копирования) конфигурации iptables . Мы можем восстановить сохраненную конфигурацию iptables позже с помощью следующей команды:

sudo iptables-restore ./iptables.config

Здесь мы можем указать произвольный путь к нашему файлу конфигурации резервной копии iptables .

Изучение более сложных правил и тем с помощью iptables выходит за рамки этой главы. Примеры, которые мы представили до сих пор, вместе с теоретическим введением iptables , должны стать хорошим началом для всех, кто хочет изучить более сложные конфигурации.

С другой стороны, использование iptables обычно не рекомендуется, особенно с недавно появившимися инструментами и фреймворками управления межсетевым экраном, которые поставляются с последними дистрибутивами Linux, такими как nftables , firewalld и ufw . Также считается, что iptables имеет проблемы с производительностью и масштабируемостью.

Далее мы рассмотрим nftables , относительно новый фреймворк, который был спроектирован и разработан проектом Netfilter Project , чтобы заменить iptables .

Вас заинтересует / Intresting for you:

10 команд Linux для мониторинг...
10 команд Linux для мониторинг... 4494 просмотров Андрей Васенин Mon, 31 May 2021, 14:21:55
Приложения  реального масштаба...
Приложения реального масштаба... 1513 просмотров Fortan Fri, 22 Feb 2019, 06:01:08
Файловая система /proc в Linux
Файловая система /proc в Linux 1636 просмотров Fortan Fri, 22 Feb 2019, 06:05:18
Специальные символы в командах...
Специальные символы в командах... 5525 просмотров Андрей Волков Thu, 11 Jul 2019, 17:47:17
Войдите чтобы комментировать

VaaPa аватар
VaaPa ответил в теме #10331 2 года 3 мес. назад
Толковое руководство. Благодарю!
admin аватар
admin ответил в теме #10270 2 года 5 мес. назад
Крутая статья! Спасибо.
apv аватар
apv ответил в теме #10138 2 года 7 мес. назад
Благодарю за прекрасную статью!
OraDevel аватар
OraDevel ответил в теме #10121 2 года 8 мес. назад
Отличный материал. Обычно про IpTables пишут нудно и запутанно. Тут всё изложено доступно и четко. За это большое спасибо!
П.С. Ну и ждем статью про nftables!