Как удалить правило iptables

В этой статье мы покажем, как управлять файерволом Linux с помощью классическгого iptables вместо firewalld в CentOS / RHEL 7 для фильтрации входящего и исходящего трафика. В этой статье рассмотрена настройка iptables на CentOS 7 для фильтрации входящего трафика, на примере развернутого с нуля облачного виртуального сервера myserver01, доступного из Интернета.

Что вы видите когда ваш компьютер грузится

iptables может быть модулем (называется «iptable_filter.o»), который должен быть автоматически загружен когда вы впервые запускаете iptables. Он может быть также встроен в ядро постоянно.

До того как будет выполнена любая команда iptables (будьте осторожны: некоторые дистрибьютивы выполняют iptables в инициализирующих систему скриптах), во встроенных цепочках не находиться ни одно правило (`INPUT’, `FORWARD’ и `OUTPUT’), все встроенные цепочки имеют policy по умолчанию ACCEPT. Вы можете изменить policy по умолчанию в цепочке FORWARD указав ключ «forward=0» для iptable_filter модуля.

Типы правил

В iptables существует 3 типа правил — input, forward, output.

Input — Данная цепочка правил используются для контроля входящих соединений. Например, если пользователь пытается подключиться к серверу, то iptables сравнит его IP-адрес со своим списком, затем разрешит или ограничит доступ.

Forward — Цепочка правил этого типа используются для обработки входящих tcp/udp пакетов, адрес назначения которых находится “за” сервером. В качестве примера можно рассмотреть случай, когда сервер используется в качестве маршрутизатора. Частный случай — NAT и Port-Forwarding.

Output — Эта цепочка правил полный аналог Input за исключением того, что они используются для контроля исходящих соединений.

Специалисты условно делят режим работы любого межсетевого экрана на 2 типа — белый и черный.

Белый — запрещается весь трафик, кроме разрешенного.

Черный — разрешается весь трафик, кроме запрещенного.

Данная политика относится не только к IP-адресам устройств, но и к портам служб, а также обращениям некоторых IP-адресов к некоторым портам.

Чтобы было понятнее, не очень хорошо, когда порт SSH-службы доступен из сети Интернет. Это повлечет постоянные попытки подбора логина и пароля. Однако, вы можете запретить любой трафик на порт этой службы (по умолчанию, tcp — 22) тем самым отрезав себя от административного входа на сервер. Компромиссное решение — добавить блок IP-адресов с которых можно обращаться к серверу по SSH-протоколу.

По умолчанию, дистрибутив Ubuntu с предустановленным iptables, разрешает всё. Проверить это можно командой:

Читайте также:  Apple выпустила iOS 14.5 beta 1 для разработчиков. Что нового.

iptables -L | grep policy

Скриншот №1. Команда iptables -L | grep policy

Типы правил

После проверки поведения цепочек соединений и общего поведения межсетевого экрана можно приступить и ограничительным мерам. Для начала рассмотрим три основных действия с пакетами:

Accept — разрешает соединение;

Drop — Запрещает соединение, отбрасывает пакеты. При этом создается впечатление, что данный порт и не был открыт вовсе.

Reject — также запрещает соединение, но явно дает понимание, что порт защищен межсетевым экраном.

Важно понимать, что правила вносятся в соответствующую цепочку с соответствующей политикой для пакетов. Рассмотрим пример:

sudo iptables -A INPUT -s -j DROP

Данное правило запрещает все входящие соединения с адреса

Блокировка диапазонов адресов происходит по маске:

sudo iptables -A INPUT -s -j DROP

Также блокировка диапазон адресов можно заблокировать по префиксу сети:

sudo iptables -A INPUT -s -j DROP

Сетевой префикс /24 равен

Допустим, что нет необходимости ограничивать все обращения с адреса , а нужно запретить только обращение к TCP-порту 22 (SSH). Правило будет выглядеть следующим образом:

iptables -A INPUT -p tcp —dport ssh -s -j DROP

Тоже самое и для подсети:

iptables -A INPUT -p tcp —dport ssh -s -j DROP

Стоит отметить, что параметр -p указывает тип протокола пакетов tcp или udp, следует указывать соответствующий.

Параметр —dport позволяет указывать не только имя службы слушающей порт, но и номер порта. Записи —dport ssh и —dport 22 будут эквивалентны, но только в том случае, если порт ssh-службы не был изменен в конфигурационном файле, в противном случае может быть заблокировано или не заблокировано “что-то”.

Следующее правило заблокирует доступ для подсети к 80 порту сервера (сайт):

sudo iptables -A INPUT -p tcp —dport 80 -s -j DROP

Важно помнить, что некоторые протоколы, тот же TCP, требуют двустороннего согласования, после чего соединение на порту изменяет свой статус ESTABLISHED, FIN_WAIT и т.п. Iptables позволяет выполнить настройку правил таким образом, что если соединение будет установлено, то и исходящий трафик будет разрешен:

sudo iptables -A INPUT -p tcp —dport 80 -s -m state —state NEW,ESTABLISHED -j ACCEPT

sudo iptables -A OUTPUT -p tcp —sport 80 -d -m state —state ESTABLISHED -j ACCEPT

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

Синтаксис и правила iptables в CentOS/Red Hat

Iptables – это утилита, с помощью которой настраиваются правила для файрвола в Linux.

Читайте также:  Основные команды Linux: (почти) полное руководство с примерами

Iptables группирует правила файрвола в таблицах, основные это:

  • Таблица filter – используется для фильтрации трафика, то есть разрешения и запрещения соединений
  • Таблица nat – используется для преобразования адресов (NAT)
  • Таблица mangle – прочие модификации заголовков ip пакетов.

Для начала проверим, что iptables установлен в системе(должен быть умолчанию):

Синтаксис и правила iptables в CentOS/Red Hat

rpm -q iptables

Вывод команды показывает, что текущая установленная версия iptables –

Работа с iptables в командной строке требует root привилегий, поэтому далее будем работать под пользователем root.

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

iptables [-t таблица] -L [цепочка] [параметры]

Примечание: если не указать название таблицы при вызове команды, по умолчанию используется таблица filter.

Например, результат команды iptables -L, когда в таблицах еще не создано правил:

Рассмотрим вывод команды подробнее.

Синтаксис и правила iptables в CentOS/Red Hat

Таблица filter содержит три типа правил, так называемые chain(цепочки):

  • INPUT – в этой цепочке обрабатываются входящие ip пакеты, предназначенные для самого хоста;
  • OUTPUT – в этой цепочке обрабатываются исходящие ip пакеты от самого хоста;
  • FORWARD – эта цепочка нужна для перенаправления ip пакетов. Используется, если вы хотите использовать сервер, как маршрутизатор.

Напротив каждой цепочки указана политика по умолчанию (policy), которая определяет, что нужно делать, в случае, если соединение не попало ни в одно из правил. Политика по умолчанию может принимать два значения и определяет сам подход к организации файрвола:

  • ACCEPT – по умолчанию все соединения разрешены, правилами блокируются нежелательные соединения;
  • DROP – по умолчанию все соединения запрещены, правилами разрешаются нужные соединения.

Вывод и удаление правил IPTables

IPTables – это фаервол (или брандмауэр), играющий очень важную роль в сетевой безопасности большинства дистрибутивов Linux. Данное руководство сфокусировано на различных аспектах управления фаерволом: выводе списка правил, удалении правил и т.п.

Это руководство охватывает следующие вопросы:

  • Вывод списка правил
  • Очистка счетчиков пакетов и байтов
  • Удаление правил
  • Сброс цепочек (удаление всех правил цепи)
  • Сброс всех цепочек и таблиц, удаление всех цепочек правил, разрешение всего трафика.
  • Требования

    Для начала нужно настроить сервер и создать не-root пользователя с расширенными правами. Подробнее об этом можно прочитать в руководствах:

    Настройка фаервола с помощью iptables за пять минут

    Я несколько раз сталкивался с тем, что даже неглупые в общем-то люди делают совершенно непростительные ошибки. Например, открывают всему интернету порт, на котором крутится база данных. Часто так бывает у начинающих DevOps, которые всю жизнь писали код, а теперь в их обязанности входит еще и настройка серверов. В сети есть хорошие туториалы по базовой настройке фаервола в Linux и других *nix, но часто это простыни на множество экранов. Так что, надеюсь, этот более лаконичный туториал кому-нибудь пригодится.

    Читайте также:  5 лучших недорогих SSD на начало 2020 года

    Важно! Очень легко по ошибке так зафаерволить машину, что вы на нее больше не зайдете. Особенно это касается облачных хостингов. Например, если в AWS вы закроете все порты с 1024 по 65536, у машины после ребута почему-то оказываются закрыты вообще все порты. Если вы хоститесь в облаках, настраивайте лучше фаервол через предоставляемый хостингом веб-интерфейс.

    Небольшое замечание по терминологии. Фаервол, встроенный в ядро Linux, называется Netfilter, а iptables — утилита для управления этим фаерволом. Многие ошибочно полагают, что фаервол называется iptables. Это не так. Говоря что-нибудь наподобие «я фильтрую пакеты с помощью iptables», вы показываете окружающим свою безграмотность.

    Вообще, какие примерно задачи можно решать с помощью Netfilter:

    • Разрешать/запрещать входящий трафик на определенные порты по определенным протоколам (IPv4/IPv6, TCP/UDP) с указанных адресов (IP, MAC) или подсетей;
    • Все то же самое в отношении исходящего трафика;
    • Можно, например, полностью игнорировать все ICMP пакеты;
    • Настройка NAT, см пост про установку и настройку OpenVPN;
    • Слышал, что настоящие гуру умеют настраивать защиту от DDoS и брутфорса, ограничивать доступ в сеть конкретным приложениям, пользователям или группам, и делать другие чумовые вещи;

    Отмечу, что утилита iptables мне лично первое время казалась исключительно неудобной по сравнению с ipfw во FreeBSD. К счастью, поработав с ней какое-то время, все это множество флагов вроде -A, -D, -j и прочих становятся привычны, так что, наберитесь терпения. Рассмотрим основные команды.

    Показать все правила:

    Вы можете заметить, что в Netfilter есть какие-то «цепочки» (chains) — как минимум INPUT, OUTPUT и FORWARD. У меня лично на машине есть еще и цепочка DOCKER. На первое время можно думать о первых двух, как обо всем входящем и исходящем трафике соответственно, а об остальных временно забыть. Велика вероятность, что они вообще никогда вам не понадобятся.

    Удалить все правила:

    Изменить политику (поведение по умолчанию) цепочки:

    Запретить доступ с хоста/подсети:

    Также можно использовать доменные имена:

    Запрет исходящих соединений:

    В правилах можно использовать отрицания:

    Удаление правила по его номеру в цепочке:

    Удаление правила на основе того, что оно делает:

    Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола из /etc/protocols. Флаг — -sport указывает порт, с которого был прислан пакет, а — -dport указывает порт назначения: