Безопасность серверов

Настройка iptables: открыть порт, ограничить доступ и сохранить правила

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

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

Не меняйте firewall без аварийного канала

Для удалённого сервера подготовьте консоль через BMC, гипервизор или другой независимый канал управления; не полагайтесь только на текущую SSH-сессию. Откройте вторую SSH-сессию и не закрывайте её до проверки нового подключения. Не применяйте в рабочей удалённой сессии iptables -F, iptables -X и не меняйте политику INPUT на DROP как универсальный первый шаг: такие команды могут немедленно лишить сервер управления.

До изменений: определить стек, доступ и точку отката

  • Зафиксируйте порт SSH, например 22, и исходный IP-адрес, который сервер действительно видит для текущего административного соединения. Это может быть адрес выхода NAT, VPN или самого клиента. Не подставляйте в правило адрес из документации 192.0.2.0/24 — замените его своим; IPv6 учитывайте отдельно.
  • Оставьте работающую SSH-сессию и откройте вторую. После каждого изменения проверяйте новое подключение именно во второй или третьей сессии.
  • Убедитесь, что сервис действительно слушает нужный порт: firewall не сделает приложение доступным, если оно не запущено или слушает только 127.0.0.1.
  • Выясните, не управляет ли правилами UFW, firewalld, система автоматизации или нативный nftables. Один хост должен иметь понятный источник управления правилами.
Показывает версию и часто используемый backend. Суффикс `nf_tables` означает, что команда iptables работает как совместимый интерфейс к nftables; `legacy` — legacy-реализация xtables.
sudo iptables -V
Вывод:
iptables v1.x.x (nf_tables)
Проверяет активность распространённых менеджеров и выводит ruleset nftables, если утилита nft установлена. Статус `active` у UFW или firewalld — повод не добавлять параллельную независимую политику прямыми командами iptables.
sudo systemctl is-active ufw firewalld 2>/dev/null; sudo nft list ruleset

Backend и менеджер правил

На современных системах iptables может быть frontend к nftables (iptables-nft) либо legacy backend. Не смешивайте без проверки прямые команды iptables, nft, UFW и firewalld: итоговый набор может быть перезаписан менеджером при reload, перезагрузке или обновлении интерфейса. В Debian и Ubuntu вариант iptables обычно можно посмотреть, а при наличии альтернатив — выбрать через update-alternatives; в RHEL-совместимых системах способ выбора зависит от версии и пакетов. Всегда сверяйтесь с документацией своего выпуска ОС. Настройка UFW и firewalld разобрана отдельно в статье «UFW и firewalld: настройка firewall в Ubuntu и RHEL», а нативный nftables — в «Настройка nftables».

Сохранить снимок действующих правил

Экспорт нужен для сравнения, отката и расследования. Он не включает автоматическое восстановление после перезагрузки.

  1. 1
    Создайте каталог для снимка с ограниченным доступом
    Создайте каталог, доступный root, и сохраните IPv4-правила. Каталог можно выбрать по локальной политике хранения конфигураций.
  2. 2
    Экспортируйте IPv4 и IPv6 отдельно
    Команды iptables-save и ip6tables-save выводят текущие правила в формате, пригодном для iptables-restore и ip6tables-restore.
  3. 3
    Проверьте, что файлы не пусты
    В файле должны быть таблицы, цепочки и правила. Если экспорт завершается ошибкой Permission denied, выполните его от root через sudo.
Сохраняет снимки IPv4 и IPv6. Перенаправление выполняется внутри `sudo sh -c`, поэтому файл создаёт root, а не обычная оболочка пользователя.
sudo install -d -m 0700 /root/firewall-backup && sudo sh -c 'iptables-save > /root/firewall-backup/iptables.v4.before' && sudo sh -c 'ip6tables-save > /root/firewall-backup/ip6tables.v6.before'
Проверяет начало сохранённого IPv4-набора. Для IPv6 используйте аналогичную команду с файлом `ip6tables.v6.before`.
sudo sed -n '1,80p' /root/firewall-backup/iptables.v4.before

Восстановление снимка заменяет текущий набор

Команда iptables-restore < файл восстанавливает IPv4-набор из файла и может заменить сделанные после снимка изменения. Используйте её только с консоли или при проверенном аварийном доступе. Поскольку снимок находится в каталоге /root с ограниченным доступом, выполните и чтение файла, и восстановление от root: sudo sh -c 'iptables-restore < /root/firewall-backup/iptables.v4.before'. IPv6 восстанавливают отдельно через sudo sh -c 'ip6tables-restore < /root/firewall-backup/ip6tables.v6.before'.

Как посмотреть правила, политики, номера и счётчики iptables

iptables управляет правилами межсетевого экрана подсистемы Netfilter. В таблице filter входящие пакеты обычно проходят цепочку INPUT. Правила внутри цепочки iptables проверяются последовательно: первое совпавшее правило с завершающим вердиктом ACCEPT, DROP или REJECT прекращает обработку в этой цепочке. Если пакет дошёл до конца встроенной цепочки, применяется её policy. Поэтому позднее разрешение может быть недостижимо из-за более раннего запрета.

Выводит правила таблицы `filter` с политиками встроенных цепочек, номерами, счётчиками пакетов и байтов. `-n` не выполняет DNS- и service-name lookup, `-v` показывает счётчики.
sudo iptables -L -n -v --line-numbers
Выводит policy и правила в синтаксисе команд iptables. Этот вид удобен, когда нужно точно сопоставить правило перед удалением или сохранить его описание.
sudo iptables -S
Показывает отдельный набор правил IPv6. IPv4-правило iptables не фильтрует IPv6-трафик.
sudo ip6tables -L -n -v --line-numbers

DROP и REJECT

DROP обычно молча отбрасывает пакет, а REJECT отправляет ответ об отказе, подходящий для протокола. Оба вердикта завершают обработку текущей цепочки. Выбор зависит от роли сервиса и политики, а не от универсального правила безопасности; подробнее — в статье «Firewall сервера: default deny, порядок правил и политика доступа».

Сначала разрешите ESTABLISHED,RELATED и SSH

Модуль conntrack использует отслеживание соединений. Состояние ESTABLISHED соответствует пакетам уже установленного соединения, а RELATED — пакету нового соединения, связанного с существующим. Правило для этих состояний обычно располагают в начале INPUT: оно разрешает ответный трафик и не заменяет правило для новых SSH-подключений. Современный синтаксис — -m conntrack --ctstate; старый модуль state с --state сохранён для совместимости, но считается устаревшим интерфейсом.

Сохранить административный доступ при удалённой настройке

Пример ниже рассчитан на SSH по TCP/22 с одного доверенного IPv4-адреса. Замените адрес и порт на фактические значения до запуска.

  1. 1
    Вставьте разрешение ответного трафика первым
    Правило ставится в позицию 1, чтобы ранний DROP не заблокировал пакеты действующей SSH-сессии.
  2. 2
    Добавьте правило для новых SSH-подключений
    Ограничьте источник одним адресом, если это соответствует вашему маршруту администрирования. Если адрес меняется через VPN или NAT, сначала убедитесь, какой адрес сервер действительно видит.
  3. 3
    Проверьте правило и новую сессию
    Проверьте номера и счётчики, затем подключитесь в новой SSH-сессии. При неудаче не закрывайте работающую сессию: проверьте порядок правил и исходный адрес.
Вставляет разрешение для установленных и связанных соединений в начало INPUT.
sudo iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Разрешает новые SSH-подключения только с примера адреса `192.0.2.10`. Замените адрес и при необходимости порт `22` до применения.
sudo iptables -I INPUT 2 -p tcp -s 192.0.2.10 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
Ожидаемый результат: правила conntrack и SSH находятся выше общего DROP или REJECT. После тестового подключения счётчики соответствующих правил должны увеличиваться.
sudo iptables -L INPUT -n -v --line-numbers

Не открывайте SSH шире без необходимости

Правило без -s, например -p tcp --dport 22 ... -j ACCEPT, разрешит SSH с любых IPv4-адресов. Это может быть необходимо для публичного доступа, но не равно ограничению через allowlist. Настройка ключей, root-доступа и параметров sshd описана в статье «Безопасная настройка SSH: ключи, root и ограничение доступа».

Открыть TCP-порт iptables только нужным источникам

Минимальное входящее правило задаёт направление через цепочку INPUT, протокол, порт назначения и, когда возможно, доверенный источник. Для сервиса на TCP/8443 не следует заменять такое правило общим -j ACCEPT для всего входящего трафика. Условие --ctstate NEW отделяет новые подключения от ответных пакетов, которые уже пропускает правило ESTABLISHED,RELATED. Из следующих трёх примеров выберите только один: публичный доступ, один доверенный адрес или подсеть. Если публичное правило уже добавлено, удалите его перед заменой ограниченным — дополнительное узкое правило не отменяет более широкое разрешение.

Открывает TCP/8443 для всех IPv4-источников. Используйте только если сервис действительно должен быть публичным; правило помещается после conntrack и SSH из предыдущего примера.
sudo iptables -I INPUT 3 -p tcp --dport 8443 -m conntrack --ctstate NEW -j ACCEPT
Ограничивает TCP/8443 одним IPv4-адресом. Замените `192.0.2.10` на доверенный адрес.
sudo iptables -I INPUT 3 -p tcp -s 192.0.2.10 --dport 8443 -m conntrack --ctstate NEW -j ACCEPT
Ограничивает TCP/8443 подсетью. Замените документационную сеть `192.0.2.0/24` на свою и убедитесь, что маска не шире необходимой.
sudo iptables -I INPUT 3 -p tcp -s 192.0.2.0/24 --dport 8443 -m conntrack --ctstate NEW -j ACCEPT
Проверяет, что процесс слушает TCP/8443, а правило присутствует в ожидаемой позиции. Затем проверьте доступ с разрешённого адреса и, если возможно, отказ с неразрешённого.
sudo ss -lntp '( sport = :8443 )'; sudo iptables -L INPUT -n -v --line-numbers

Как закрыть порт и безопасно удалить правило iptables

Удаление разрешающего правила отменяет только это разрешение. Порт станет недоступен через INPUT, только если трафик не принимает другое правило или пользовательская цепочка, а оставшийся путь завершается DROP, REJECT либо запрещающей policy. При policy ACCEPT одного удаления недостаточно: потребуется правильно расположенный запрет или пересмотр политики, описанный в статье «Firewall сервера: default deny, порядок правил и политика доступа». Не удаляйте правило по старому номеру из заметки: номер меняется после каждой вставки и удаления. Сначала получите актуальный список, найдите правило по полному набору признаков — протоколу, источнику, порту, состоянию и цели — затем удалите конкретную строку и сразу повторите проверку с разрешённого и неразрешённого источника. Если есть дубли, удаление по точному описанию удаляет первое совпадение, поэтому для дублей безопаснее использовать актуальный номер.

Удалить ранее открытый порт

  1. 1
    Получите текущие номера
    Просмотрите только цепочку INPUT с номерами, счётчиками и числовыми адресами. Сопоставьте номер с выводом iptables -S INPUT, чтобы не удалить похожее правило.
  2. 2
    Удалите выбранное вхождение по номеру
    Подставьте фактический номер. После удаления номера следующих правил сдвигаются.
  3. 3
    Проверьте цепочку и доступность
    Убедитесь, что удалено именно нужное правило, а SSH и другие требуемые сервисы продолжают работать. Если доступ к сервису остаётся, ищите дублирующее разрешение в INPUT или переход в пользовательскую цепочку.
Показывает актуальные номера и точное описание правил перед удалением.
sudo iptables -L INPUT -n -v --line-numbers && sudo iptables -S INPUT
Удаляет правило с текущим номером 3 только как пример. Перед запуском замените `3` на номер, полученный непосредственно перед операцией.
sudo iptables -D INPUT 3
Подтверждает, что правило исчезло и порядок оставшихся правил ожидаем.
sudo iptables -L INPUT -n -v --line-numbers
Удаляет первое правило, полностью совпадающее с описанием. Не используйте этот вариант, если одинаковых правил несколько и нужно удалить не первое из них.
sudo iptables -D INPUT -p tcp -s 192.0.2.10 --dport 8443 -m conntrack --ctstate NEW -j ACCEPT

Блокировка IP в iptables и набор адресов ipset

Точечная блокировка одного адреса полезна как временная мера для очевидно нежелательного источника. Вставляйте её выше разрешений, если блокировка должна иметь приоритет. Но не блокируйте адрес, с которого работает ваш текущий административный канал, и не считайте правило расследованием инцидента: при признаках компрометации следуйте процедуре реагирования на взлом сервера.

Временно блокирует весь входящий IPv4-трафик с адреса-примера `192.0.2.55`. Перед применением замените адрес и проверьте, что это не адрес администратора, мониторинга или разрешённого прокси.
sudo iptables -I INPUT 1 -s 192.0.2.55 -j DROP
Проверяет, что блокирующее правило находится выше правил, которые оно должно перекрывать. Рост счётчиков означает совпадение пакетов с правилом.
sudo iptables -L INPUT -n -v --line-numbers | sed -n '1,12p'

Для часто меняющегося списка блокировки удобнее ipset: правило iptables остаётся одним, а адреса добавляются и удаляются в наборе. Доступность ipset и его совместимость зависят от ядра, пакетов и backend; сначала убедитесь, что команда ipset установлена и поддерживается выбранным стеком.

Создаёт IPv4-набор, добавляет адрес-пример и только после успешного выполнения этих операций проверяет правило iptables. Если правила ещё нет, оно добавляется в начало INPUT. `-exist` упрощает повторный запуск для уже существующего совместимого набора или адреса.
sudo ipset create blocked-v4 hash:ip family inet -exist && sudo ipset add blocked-v4 192.0.2.55 -exist && { sudo iptables -C INPUT -m set --match-set blocked-v4 src -j DROP 2>/dev/null || sudo iptables -I INPUT 1 -m set --match-set blocked-v4 src -j DROP; }
Показывает содержимое набора и правило, которое его использует. Для удаления адреса используйте `sudo ipset del blocked-v4 192.0.2.55`.
sudo ipset list blocked-v4; sudo iptables -L INPUT -n -v --line-numbers

Срок жизни и сохранение ipset

Обычный ipset, как и правила iptables, не становится постоянным автоматически. iptables-save сохраняет правило с --match-set, но не содержимое самого набора. В Debian и Ubuntu, где этот способ поддерживается выпуском, для интеграции с netfilter-persistent обычно используют отдельный пакет ipset-persistent; проверьте по документации выпуска его файлы и порядок загрузки. Набор должен быть восстановлен раньше правила iptables, которое на него ссылается. В других дистрибутивах используйте их штатный механизм и проверьте результат после контролируемой перезагрузки. Для временной блокировки можно создать набор с поддерживаемым вашей версией параметром timeout, но срок и поведение при сохранении нужно проверить на конкретной системе.

Логирование и ограничение новых подключений

Ограничение частоты запросов на хосте может сократить шум от перебора и ограничить отдельные сценарии злоупотребления. Модуль limit ограничивает совпадения правила в целом, а hashlimit умеет вести отдельный лимит, например по IP-источнику. Поддерживаемые параметры и модули зависят от версии iptables и ядра: перед внедрением проверьте iptables -m limit -h и iptables -m hashlimit -h на целевой системе.

Для порядка правил из предыдущих примеров добавляет ограниченное журналирование перед разрешением новых SSH-подключений: начальный burst составляет 10 совпадений, затем жетоны пополняются со скоростью пять в минуту. LOG не является завершающим действием, поэтому пакет продолжит обработку следующими правилами. Если ваша цепочка отличается, определите позицию непосредственно перед нужным разрешением или запретом по актуальному выводу `iptables -L INPUT --line-numbers`.
sudo iptables -I INPUT 2 -p tcp --dport 22 -m conntrack --ctstate NEW -m limit --limit 5/min --limit-burst 10 -j LOG --log-prefix "iptables-ssh-new " --log-level 4
При выполнении после предыдущей команды вставляет ограничение между правилом LOG и разрешением SSH. Оно отбрасывает пакеты новых SSH-соединений, когда один источник превышает указанный порог. Это не универсальное значение: порог может затронуть пользователей за NAT, мониторинг или автоматизацию. Если правило LOG не добавлялось или порядок цепочки отличается, выберите по актуальным номерам позицию выше разрешения SSH.
sudo iptables -I INPUT 3 -p tcp --dport 22 -m conntrack --ctstate NEW -m hashlimit --hashlimit-above 20/min --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-name ssh_new_per_ip -j DROP
Проверяет сообщения ядра с заданным префиксом и счётчики правил. На системах с другим журналированием kernel-сообщения могут находиться в другом журнале.
sudo journalctl -k -g 'iptables-ssh-new' --since '10 minutes ago'; sudo iptables -L INPUT -n -v --line-numbers

Локальный rate limit не является защитой от объёмной DDoS

Правила iptables обрабатывают пакет только после его прихода к серверу. Если уже перегружен сетевой интерфейс, канал или инфраструктура провайдера, DROP и hashlimit на хосте не вернут пропускную способность легитимным клиентам. Границы локальной фильтрации и действия при перегрузке описаны в статье «Защита сервера от DDoS».

IPv6: ip6tables настраивается отдельно

IPv4 и IPv6 — разные пути доступа. Если у сервера есть IPv6-адрес и сервис слушает его, правило iptables для IPv4 не ограничит подключение по IPv6. При выбранном интерфейсе iptables используйте для IPv6 команду ip6tables; как и iptables, она может работать через legacy backend или совместимый backend nftables. В примерах применена документационная сеть 2001:db8::/32. Не копируйте в IPv6 политику без учёта необходимого ICMPv6: от него зависят, в частности, Neighbor Discovery и Path MTU Discovery.

Разрешает ответный IPv6-трафик и SSH только с IPv6-адреса-примера. Замените адрес и порт на фактические значения, затем проверьте `sudo ip6tables -L INPUT -n -v --line-numbers` и подключение по IPv6.
sudo ip6tables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT && sudo ip6tables -I INPUT 2 -p tcp -s 2001:db8::10 --dport 22 -m conntrack --ctstate NEW -j ACCEPT

Сохранить и восстановить правила после перезагрузки

iptables-save и iptables-restore — утилиты экспорта и импорта, но сами по себе они не включают автозагрузку. Механизм постоянного хранения зависит от семейства, версии ОС и выбранного firewall-стека. Не сохраняйте правила одновременно несколькими независимыми механизмами: это создаёт непредсказуемый результат после reboot или reload.

Типичные штатные варианты для систем, где iptables является выбранным интерфейсом

Семейство и условиеПакеты или службаЧто проверить
Debian/Ubuntu при использовании iptables-persistentnetfilter-persistent и плагин iptables-persistent обычно сохраняют IPv4 и IPv6 в /etc/iptables/rules.v4 и /etc/iptables/rules.v6.Проверьте состояние netfilter-persistent, содержимое файлов и правила после контролируемой перезагрузки.
RHEL-совместимые системы, где поддерживается legacy-службаПакет iptables-services предоставляет службу iptables и обычно использует файл /etc/sysconfig/iptables; для IPv6 применяется отдельная конфигурация и служба, если они установлены и включены.Проверьте наличие пакета, unit-файлов, конфигурационных файлов и статус службы. В современных выпусках этот путь может быть заменён nftables или firewalld.
UFW, firewalld или нативный nftablesПостоянство обеспечивает соответствующий менеджер, а не ручной iptables-save как самостоятельная схема.Меняйте правила через активный менеджер; не добавляйте параллельный набор прямыми командами iptables.

Настроить постоянное хранение в Debian или Ubuntu с iptables-persistent

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

  1. 1
    Установите штатные пакеты
    Установка пакета может предложить сохранить текущие IPv4- и IPv6-правила. Перед подтверждением сверьте их с экспортом, сделанным до изменений.
  2. 2
    Сохраните действующий набор через службу
    Команда сохранения записывает текущие правила в файлы механизма netfilter-persistent. Убедитесь, что файлы содержат ожидаемые правила, включая IPv6 при его использовании.
  3. 3
    Проверьте автозапуск и загрузку
    Проверьте статус службы. Перезагрузку проводите только в согласованное окно при наличии консольного доступа; после неё проверьте оба набора правил и SSH.
Типичная последовательность Debian/Ubuntu. Перед установкой и применением проверьте документацию именно своего выпуска и отсутствие активного UFW.
sudo apt install netfilter-persistent iptables-persistent && sudo netfilter-persistent save && sudo systemctl status netfilter-persistent --no-pager

Проверить постоянство в RHEL-совместимой системе с iptables-services

Этот путь применим только там, где пакет iptables-services доступен, установлен и выбран вместо firewalld/nftables.

  1. 1
    Проверьте, что служба и пакет существуют
    Не устанавливайте и не включайте legacy-службу поверх работающего firewalld без оценки миграции: оба компонента могут управлять тем же firewall-слоем.
  2. 2
    Сохраните правила штатной командой службы
    Если служба поддерживает сохранение в вашем выпуске, команда запишет текущую IPv4-конфигурацию в её штатный файл. IPv6 проверяйте отдельно.
  3. 3
    Подтвердите загрузку после рестарта
    Проверьте состояние unit и содержимое конфигурационного файла. Результат подтверждается только фактическим наличием правил после контролируемой перезагрузки.
Типичная проверка и сохранение для RHEL-совместимых систем с установленным `iptables-services`. Если пакет или unit отсутствует, не заменяйте их самодельным автозапуском: определите штатный firewall-стек вашего выпуска.
rpm -q iptables-services; sudo systemctl status iptables --no-pager; sudo service iptables save
Для Debian/Ubuntu с iptables-persistent сравнивает текущие IPv4-правила с постоянным файлом. Отсутствие вывода означает совпадение; путь применим именно к этому механизму.
sudo iptables-save | sudo diff -u /etc/iptables/rules.v4 -
Показывает, какие типичные firewall-службы активны. Несколько `active` не всегда означают конфликт, но требуют выяснить владельца правил до следующего изменения или перезагрузки.
sudo systemctl is-active ufw firewalld netfilter-persistent iptables nftables 2>/dev/null

Проверка после каждого изменения и типичные отклонения

  • Проверьте порядок и счётчики: sudo iptables -L INPUT -n -v --line-numbers. Счётчик нужного правила должен расти при тестовом трафике.
  • Проверьте правило в машинно-читаемом виде: sudo iptables -S INPUT. Это помогает обнаружить не тот протокол, адрес, порт или дубликат.
  • Проверьте сервис локально и с разрешённого внешнего адреса. Успешный ss -lntp доказывает только прослушивание порта, а не прохождение пакетов через firewall.
  • Если доступ должен быть ограничен, выполните отдельную проверку с неразрешённого адреса. Не считайте правило рабочим только потому, что команда iptables завершилась без ошибки.
  • После сохранения проверьте постоянный файл или службу и только затем планируйте перезагрузку.

Проблема

iptables сообщает Permission denied или Operation not permitted

Возможные причины

  • Команда запущена не от root и без достаточных прав sudo.
  • Процесс находится в контейнере или ограниченном окружении без capability `CAP_NET_ADMIN`.
  • Политика sudo или средство управления конфигурацией запрещает прямые изменения.

Решение

Сначала повторите безопасную команду просмотра через sudo iptables -L -n -v. Если она работает, выполняйте изменения через sudo. В контейнере проверяйте права и модель управления на уровне хоста; не добавляйте привилегии контейнеру без оценки риска.

Как избежать

Используйте отдельную привилегированную учётную запись и минимальные правила sudo. Ошибка относится к правам управления Netfilter, а не обязательно к SSH-аутентификации.

Проблема

Правило добавлено, но порт по-прежнему недоступен

Возможные причины

  • Трафик не приходит к серверу: неверный адрес, маршрут, внешний firewall, балансировщик или политика провайдера.
  • Сервис не слушает нужный адрес или порт.
  • Более раннее правило, переход в пользовательскую цепочку либо другой firewall-менеджер меняет результат.
  • Проверка идёт по IPv6, а разрешение добавлено только через iptables для IPv4.

Решение

Сверьте адресное семейство, ss -lntp, порядок INPUT и счётчики. Проверьте активность UFW, firewalld и nftables. Не расширяйте правило до ACCEPT all как способ диагностики.

Как избежать

Документируйте назначение, источник, порт и владельца каждого правила; после изменения тестируйте доступ с нужного и ненужного источника.

Термины в статье

Allowlist — перечень разрешающих записей или правил: система допускает только те субъекты, объекты, действия или значения, которые им соответствуют.
Netfilter — подсистема ядра Linux для перехвата и обработки сетевых пакетов в контрольных точках стека; правила iptables и nftables используют её механизмы.
UFW — утилита упрощённого управления правилами межсетевого экрана в Linux, создающая правила Netfilter по командам высокого уровня.
firewalld — служба управления межсетевым экраном в Linux, применяющая правила через зоны, сервисы и политики без прямого редактирования полного набора правил.
iptables — утилита Linux для управления правилами пакетной фильтрации Netfilter через таблицы, цепочки и цели; это не самостоятельный межсетевой экран.
nftables — подсистема Linux и интерфейс управления правилами Netfilter, использующие единый набор правил, выражения, множества и атомарное обновление конфигурации.
Запрет по умолчанию — политика контроля доступа, при которой разрешаются только явно разрешённые правилами обращения или действия, а всё остальное блокируется.
Межсетевой экран — средство контроля сетевого трафика, разрешающее или блокирующее его по правилам на границе или между сегментами сети.
Межсетевой экран с отслеживанием состояния — межсетевой экран, который сопоставляет пакеты с состоянием отслеживаемых соединений и потоков и применяет правила с учётом их контекста.
Ограничение частоты запросов — механизм контроля нагрузки, ограничивающий число запросов от клиента или другого субъекта за заданный интервал.
Отслеживание соединений в Linux — механизм Netfilter, ведущий записи о потоках и их состояниях для фильтрации с учётом состояния, NAT и правил, зависящих от направления трафика.
Порядок обработки правил — механизм определения последовательности проверки правил политики, от которой зависит, какое совпавшее правило применит система безопасности.
Правило межсетевого экрана — элемент политики фильтрации, задающий условия сопоставления трафика и действие над пакетами или соединениями.
Состояние соединения — классификация пакета подсистемой отслеживания соединений: NEW, ESTABLISHED, RELATED, INVALID или UNTRACKED.
Список блокировки — набор идентификаторов, адресов или признаков, для которых политика явно запрещает действие, например подключение, доставку сообщения или доступ к ресурсу.
Таблица iptables — логическая группа цепочек правил с общей задачей обработки пакетов, например фильтрацией, NAT или изменением служебных параметров пакета.
Фильтрация исходящего трафика — контроль соединений из защищаемой сети наружу, ограничивающий разрешённые назначения, протоколы, сервисы и источники исходящих пакетов.
Фильтрация пакетов — способ контроля сетевого трафика по полям пакета и правилам, при необходимости дополненный отслеживанием состояния соединений.
Цепочка iptables — упорядоченный набор правил в одной из таблиц iptables, которые Netfilter последовательно проверяет при обработке пакета.

Вопросы по теме

Все вопросы и ответы

Почему правила iptables пропадают после перезагрузки?

Потому что правила, добавленные командой iptables, обычно существуют только в памяти. Для их восстановления после перезагрузки нужно настроить постоянное хранение штатным способом для своего дистрибутива и используемого firewall-стека. Не смешивайте прямые команды iptables с UFW, firewalld или нативным nftables без проверки: менеджер может перезаписать правила.

Можно ли удалить правило iptables по старому номеру?

Нет, номер нужно получать непосредственно перед удалением. После каждой вставки или удаления номера последующих правил сдвигаются, поэтому старый номер может указывать уже на другое правило. Сначала проверьте iptables -L INPUT -n -v --line-numbers и iptables -S INPUT, сопоставьте правило по протоколу, источнику, порту, состоянию и цели.

Нужно ли разрешать ESTABLISHED,RELATED для SSH?

Да, при удалённой настройке это правило обычно ставят в начало INPUT. Оно пропускает ответный трафик уже установленных и связанных соединений, включая текущую SSH-сессию. Однако оно не заменяет отдельное разрешение для новых SSH-подключений: для них нужно правило с --ctstate NEW, при необходимости ограниченное доверенным IP-адресом.

Нужно ли отдельно открывать порт в ip6tables?

Да, если сервис доступен по IPv6 и этот трафик требуется разрешить. Правила iptables фильтруют только IPv4 и не применяются к IPv6. Для IPv6 используется отдельный набор ip6tables, который также нужно проверять, сохранять и при необходимости восстанавливать отдельно от IPv4-правил.

Чем DROP отличается от REJECT в iptables?

DROP молча отбрасывает пакет, а REJECT отправляет ответ об отказе, подходящий для протокола. Оба действия завершают обработку текущей цепочки и не дают пакету перейти к более поздним правилам. Выбирать между ними следует по роли сервиса и принятой политике доступа, а не как универсальную меру безопасности.

Почему iptables-save выдаёт Permission denied?

Обычно перенаправление вывода выполняет обычная оболочка пользователя, даже если сама команда запущена через sudo. Создавайте резервный файл от root, например через sudo sh -c 'iptables-save > /root/firewall-backup/iptables.v4.before'. Каталог для снимков должен быть доступен root; аналогично отдельно сохраняйте IPv6 через ip6tables-save.