Как настраивал фаервол (брандмауэр) на Linux-серверах

«Как настраивал фаервол (брандмауэр) на Linux-серверах» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps использую фаервол в двух плоскостях: на уровне ОС (host-based) и на уровне сети. На самих серверах предпочитаю nftables как современную замену iptables.

Базовая политика на сервере с помощью nftables: Создаю конфигурационный файл /etc/nftables.conf:

#!/usr/sbin/nft -f
flush ruleset

define PRIVATE_NETS = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # Разрешаем established/related соединения
        ct state established,related accept

        # Разрешаем loopback
        iif lo accept

        # Разрешаем ICMP (ping)
        ip protocol icmp accept

        # Разрешаем входящий SSH только из внутренних сетей
        tcp dport 22 ip saddr $PRIVATE_NETS accept

        # Разрешаем входящие HTTP/HTTPS для веб-сервера
        tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Активирую и добавляю в автозагрузку: sudo systemctl enable --now nftables.

Для управления в масштабе инфраструктуры:

  • Использовал Ansible для распространения единых правил nftables на группы серверов (например, все web-серверы получают правило на порт 80/443, а базы данных — только на 5432 из определенной подсети).
  • На облачных серверах (AWS EC2, GCP Compute) правила фаервола на уровне инстансов дублировал Security Groups, что создает два уровня защиты.
  • Важно: Всегда сначала добавлял правило для текущей SSH-сессии, чтобы не заблокировать себя, и использовал nft --check для валидации конфига перед применением.