В предыдущем уроке мы освоили ufw - удобный инструмент для быстрого старта. Теперь мы перейдем на следующий уровень и научимся работать напрямую с "двигателем" файервола в Linux - iptables. Это откроет нам возможности для создания гораздо более гибких, производительных и сложных правил защиты. Освоение iptables требует особого, методичного подхода, чтобы избежать распространенных ловушек, главная из которых - случайная блокировка собственного доступа.

Часть 1: Теория. Новая ментальная модель: Таблицы, Цепочки, Правила

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

  1. Таблицы (Tables): Это большие "справочники" правил для разных типов задач. Основные таблицы, которые нужно знать:

    • filterСамая главная для нас таблица. Она отвечает за фильтрацию, то есть решает: пропустить пакет (ACCEPT) или отбросить (DROP). 99% задач по базовой защите решаются здесь.

    • nat (Network Address Translation): Отвечает за преобразование IP-адресов. Используется для маршрутизации и проброса портов.

    • По умолчанию, если таблица не указана, iptables работает с таблицей filter.

  2. Цепочки (Chains): Внутри каждой таблицы есть "конвейеры", по которым движутся пакеты. Это и есть цепочки. Три самые важные цепочки в таблице filter:

    • INPUT: Для всех пакетов, которые предназначены для самого сервера. Входящие SSH-соединения, запросы к вашему веб-серверу - всё это проходит через цепочку INPUT.

    • OUTPUT: Для всех пакетов, которые генерируются самим сервером. Когда вы делаете apt update, пакеты уходят наружу через цепочку OUTPUT.

    • FORWARD: Для пакетов, которые проходят через ваш сервер транзитом. Для одиночного VDS эта цепочка обычно не используется.

  3. Правила (Rules): Каждая цепочка - это упорядоченный список правил. Пакет проверяется по каждому правилу сверху вниз. Как только находится подходящее правило, его действие (ACCEPTDROP) выполняется, и проверка по этой цепочке прекращается. Если пакет прошел все правила и не нашел подходящего, к нему применяется политика по умолчанию для этой цепочки.

  4. Действия (Targets): Что делать с пакетом, если он подошел под правило.

    • ACCEPT: Пропустить.

    • DROP: Молча отбросить. Пакет просто исчезает. Отправитель не получает никакого ответа и ждет таймаута. Это лучший способ "спрятаться" от сканеров.

    • REJECT: Отбросить, но вежливо сообщить отправителю "Отказано в доступе".

Часть 2: Принцип "Сначала ворота, потом стена" - Безопасная настройка

При работе с iptables существует единственно верная и безопасная последовательность действий, которая гарантирует, что вы не заблокируете себе доступ. Мы будем следовать именно ей.

  1. Начинаем с открытой политики: Убеждаемся, что политика по умолчанию - ACCEPT (пропускать всё). Это наша страховка.

  2. Строим "ворота" (добавляем разрешающие правила): Мы по одному добавляем все необходимые ACCEPT правила.

  3. Проводим тест: Открываем второе, новое SSH-соединение, чтобы убедиться, что наши правила для доступа работают.

  4. Возводим "стену" (меняем политику на DROP): Только после успешного теста мы запрещаем весь остальной трафик.

  5. Сохраняем правила: Делаем нашу безопасную конфигурацию постоянной.

Часть 3: Практический сценарий. Безопасная настройка iptables

Давайте реализуем эту методику шаг за шагом.

Шаг 0: Подготовка.
Убедитесь, что ufw отключен, так как он будет конфликтовать с нашими ручными правилами.

ufw disable

Шаг 1: Устанавливаем полностью открытую политику (наша страховка).
Сбросим все старые правила и установим политику ACCEPT для всех цепочек.

# Очищаем все существующие правила
iptables -F
iptables -X

# Устанавливаем политику "пропускать всё"
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Пояснения:

iptables -P INPUT ACCEPT

  • Дословный перевод: "Установить Политику по умолчанию для цепочки Входящего трафика на 'Принимать'".

  • Что это говорит серверу: "Для любого входящего сетевого пакета, который дошел до конца списка правил в цепочке INPUT и не нашел для себя подходящего правила, финальным вердиктом будет пропустить (ACCEPT) его".

  • Аналогия: Охранник на входе в клуб получил инструкцию: "Если человека нет в гостевом списке, всё равно впускай. Двери открыты для всех по умолчанию".

  • Когда и почему мы это используем (в Шаге 1): Мы используем эту политику в самом начале настройки как страховочную сетку. Пока мы добавляем наши разрешающие правила (-A ... -j ACCEPT), мы можем ошибиться, опечататься. Если бы политика сразу была DROP, любая ошибка в правиле для SSH привела бы к немедленной блокировке. С политикой ACCEPT мы можем спокойно добавлять правила, зная, что даже если они не сработают, наше соединение не оборвется, потому что "по умолчанию" всё разрешено.

iptables -P FORWARD ACCEPT/DROP

  • Что такое цепочка FORWARD? Она обрабатывает трафик, который не предназначен для самого сервера, а должен пройти сквозь него к другой сети. Это нужно, когда сервер работает как маршрутизатор (роутер).

  • Для нашего VDS: В 99% случаев ваш одиночный VDS-сервер не является маршрутизатором. Через него не ходит транзитный трафик.

  • Почему мы устанавливаем политику? Это хорошая практика безопасности. Устанавливая iptables -P FORWARD DROP, мы явно говорим: "Я не роутер, и никакой трафик не должен проходить сквозь меня". Это предотвращает случайное или злонамеренное использование вашего сервера в качестве промежуточного узла для атак.

iptables -P OUTPUT ACCEPT

  • Что такое цепочка OUTPUT? Она обрабатывает весь трафик, который создается самим сервером и уходит наружу. Например:

    • Когда вы запускаете apt update, ваш сервер обращается к репозиториям Ubuntu.

    • Когда ваш веб-сервер отвечает посетителю сайта.

    • Когда вы делаете ping google.com.

  • Почему политика ACCEPT? Серверу почти всегда нужно иметь возможность свободно общаться с внешним миром для выполнения своих функций. Блокировка исходящего трафика по умолчанию (-P OUTPUT DROP) - это очень продвинутая и сложная в настройке конфигурация, которая нужна для систем с параноидальным уровнем безопасности. Для 99.9% задач политика "разрешать все исходящие" (ACCEPT) является нормой.

Шаг 2: Строим "ворота" - добавляем жизненно важные разрешающие правила.
Теперь, на "открытом" файерволе, мы строим наш белый список.

# Правило №1: Разрешить трафик для уже установленных соединений.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Правило №2: Разрешить весь трафик на loopback-интерфейсе (lo).
iptables -A INPUT -i lo -j ACCEPT

# Правило №3 (Золотое правило): Разрешить НОВЫЕ входящие SSH-соединения.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# (Опционально) Правило №4: Если это веб-сервер, сразу разрешим HTTP и HTTPS.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • -A: Append (добавить правило в конец цепочки).

  • -m conntrack --ctstate...: Использовать модуль отслеживания соединений.

  • -i lo: Для интерфейса lo.

  • -p tcp --dport 22: Для протокола TCP и порта назначения 22.

Шаг 3: Ключевой тест на доступность!
Не закрывая текущее окно терминала, откройте НОВОЕ окно и попробуйте подключиться к вашему серверу по SSH. Если новое соединение прошло успешно, ваши "ворота" построены правильно, и можно переходить к следующему шагу.

Шаг 4: Возводим "стену" - меняем политику на DROP.
Только после успешного теста из Шага 3 мы наконец-то закрываем доступ для всего, что не было явно разрешено.

iptables -P INPUT DROP
iptables -P FORWARD DROP
# Политику OUTPUT обычно оставляют ACCEPT

Пояснения:

iptables -P INPUT DROP

  • Дословный перевод: "Установить Политику по умолчанию для цепочки Входящего трафика на 'Отбрасывать'".

  • Что это говорит серверу: "Для любого входящего сетевого пакета, который дошел до конца списка правил в цепочке INPUT и не нашел для себя подходящего правила, финальным вердиктом будет молча отбросить (DROP) его". Пакет просто уничтожается. Отправитель не получает никакого ответа.

  • Аналогия: Охранник на входе в клуб получил инструкцию: "Если человека нет в гостевом списке, не просто не впускай его, а делай вид, что его не существует. Никаких ответов, полное игнорирование".

  • Когда и почему мы это используем (в Шаге 4): Это и есть финальное, боевое состояние нашего файервола. Мы применяем эту политику только после того, как:

    1. Добавили все необходимые разрешающие правила (для SSH, веб-сервера и т.д.).

    2. Проверили на практике (открыв новую SSH-сессию), что наши разрешающие правила работают.
      Этот шаг превращает наш "клуб с открытыми дверями" в неприступную крепость, куда можно попасть только по специальному приглашению. Это реализация принципа "запрещено всё, что не разрешено".

Теперь ваш файервол настроен безопасно и правильно.

Шаг 5: Сохранение правил.
Чтобы эта конфигурация не пропала после нового входа, делаем её постоянной. Если не сохранять правила, они сбросятся при перезагрузке сервера.

# Устанавливаем пакет, если его еще нет
apt update
apt install iptables-persistent

# Сохраняем текущие правила в файлы конфигурации
netfilter-persistent save

Часть 4: Продвинутые техники с ipset

Всё, что мы делали до этого (Шаги 1–5), остаётся тем же.
ipset просто улучшает Шаг 2, позволяя эффективно блокировать большие списки IP.

Установка ipset

apt install ipset

Создание черного списка.

Пример: создадим набор для временного бана IP на 1 час (3600 секунд).

ipset create blacklist_temp hash:ip timeout 3600

Интеграция с iptables

Теперь берём наш сценарий настройки (Шаги 1–5) и «встраиваем» ipset на Шаге 2.
Вот как выглядит полный сценарий с учётом ipset:

Шаг 1. Политика по умолчанию: всё разрешено

iptables -F
iptables -X

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Шаг 2. Строим «ворота»

Сначала - правило с ipset (чёрный список).
Затем - обычные разрешающие правила.

# 2.0 — Черный список через ipset (ставим первым!)
iptables -I INPUT 1 -m set --match-set blacklist_temp src -j DROP

# 2.1 — Разрешаем уже установленные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2.2 — Разрешаем loopback (localhost)
iptables -A INPUT -i lo -j ACCEPT

# 2.3 — Разрешаем SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 2.4 — (опционально) HTTP и HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Шаг 3. Тест доступа

Открываем новое SSH-соединение и проверяем, что всё работает.

Шаг 4. Возводим «стену» - политика DROP

iptables -P INPUT DROP
iptables -P FORWARD DROP
# OUTPUT обычно оставляем ACCEPT

Шаг 5. Сохраняем правила

apt update
apt install iptables-persistent

netfilter-persistent save

Как это работает теперь

Все пакеты сначала проверяются на вхождение в ipset (DROP чёрного списка).

Если IP не забанен, идут дальше и проверяются по обычным правилам (ACCEPT SSH, ACCEPT HTTP и т.д.).

Всё, что не попало в белый список - отбрасывается политикой по умолчанию (DROP).

Итого: с ipset сценарий не меняется, просто на Шаге 2 мы добавляем «первую линию обороны». Остальные шаги (включая iptables -P INPUT DROP) выполняем так же, как в базовом варианте.

На следующем уроке мы погрузимся в мир текстовых потоков и перенаправлений. Мы изучим, как связывать команды между собой (|), перенаправлять их вывод в файлы (> и >>) и использовать файлы как ввод. Это откроет нам дверь в автоматизацию и написание скриптов.

Перейти к просмотру - УРОК №11.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)