Найти в Дзене
Евгений Лощаков

Настройка брандмауэра на платформе Debian

Брандмауэр (Firewall) — это система сетевой безопасности, которая контролирует и фильтрует входящий и исходящий сетевой трафик на основе предопределенных правил безопасности. Таблицы и цепочки в nftables: Основные типы цепочек: Серверная защита: Сетевые шлюзы: Контейнеры и виртуализация: Упрощенный синтаксис: Производительность: Функциональность: Проверка и установка: # nftables обычно предустановлен в Debian
sudo nft --version # Проверка поддержки ядром sudo modprobe nf_tables lsmod | grep nf_tables # Установка nftables (если не установлен) sudo apt update sudo apt install -y nftables # Отключение iptables (если используется) sudo systemctl stop iptables sudo systemctl disable iptables # Запуск nftables sudo systemctl enable nftables sudo systemctl start nftables Миграция с iptables: # Экспорт правил iptables и конвертация sudo iptables-save > iptables-backup.txt sudo iptables-restore-translate -f iptables-backup.txt > nftables-rules.txt # Применение сконвертированных правил sudo
Оглавление

🔹 Теоретическая часть: Основы сетевой безопасности

1.1. Что такое брандмауэр?

Брандмауэр (Firewall) — это система сетевой безопасности, которая контролирует и фильтрует входящий и исходящий сетевой трафик на основе предопределенных правил безопасности.

Эволюция брандмауэров в Linux:

  • ipchains — в ядрах 2.2.x (устарел)
  • iptables — стандарт с ядер 2.4.x
  • nftables — современная замена iptables (с 2014)
  • UFW — упрощенная надстройка над iptables
  • FirewallD — динамический брандмауэр с поддержкой зон

1.2. Принципы работы брандмауэра

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

  • table — контейнер для цепочек
  • chain — набор правил для обработки пакетов
  • rule — конкретное правило фильтрации
  • set — набор элементов для групповых операций

Основные типы цепочек:

  • input — входящие пакеты к локальным процессам
  • output — исходящие пакеты от локальных процессов
  • forward — пакеты, проходящие через систему
  • prerouting/postrouting — для NAT операций

1.3. Области применения брандмауэров

Серверная защита:

  • Ограничение доступа к сервисам по портам
  • Защита от сетевых атак и сканирования
  • Контроль исходящих соединений
  • Логирование подозрительной активности

Сетевые шлюзы:

  • NAT и маскарадинг для внутренней сети
  • Межсетевой экранирование
  • Проброс портов (Port Forwarding)
  • Балансировка нагрузки

Контейнеры и виртуализация:

  • Изоляция сетевых пространств
  • Защита хоста от контейнеров
  • Управление межконтейнерным трафиком

1.4. Преимущества nftables над iptables

Упрощенный синтаксис:

  • Единая команда для всех протоколов
  • Улучшенная читаемость правил
  • Меньше boilerplate кода

Производительность:

  • Более эффективная обработка правил
  • Поддержка массовых операций
  • Улучшенная масштабируемость

Функциональность:

  • Встроенные структуры данных (set, map)
  • Лучшая поддержка IPv6
  • Расширенные возможности сопоставления

🔹 Практическая часть: Настройка брандмауэров в Debian

🔹 2. Встроенный брандмауэр: nftables

2.1. Установка и переход с iptables

Проверка и установка:

# nftables обычно предустановлен в Debian
sudo nft --version

# Проверка поддержки ядром

sudo modprobe nf_tables

lsmod | grep nf_tables

# Установка nftables (если не установлен)

sudo apt update

sudo apt install -y nftables

# Отключение iptables (если используется)

sudo systemctl stop iptables

sudo systemctl disable iptables

# Запуск nftables

sudo systemctl enable nftables

sudo systemctl start nftables

Миграция с iptables:

# Экспорт правил iptables и конвертация

sudo iptables-save > iptables-backup.txt

sudo iptables-restore-translate -f iptables-backup.txt > nftables-rules.txt

# Применение сконвертированных правил

sudo nft -f nftables-rules.txt

2.2. Базовая конфигурация nftables

Просмотр текущих правил:

# Просмотр всех таблиц и правил

sudo nft list ruleset

-2

# Просмотр конкретной таблицы

sudo nft list table inet filter

-3

# Просмотр с форматированием

sudo nft -s list ruleset

-4

Создание базовой конфигурации:

sudo nano /etc/nftables.conf

-5

#!/usr/sbin/nft -f

# Очистка существующих правил

flush ruleset

# Таблица для IPv4/IPv6

table inet filter {

# Набор для доверенных сетей

set trusted_networks {

type ipv4_addr

flags interval

elements = { 192.168.1.0/24, 10.0.0.0/8 }

}

# Набор для разрешенных портов

set allowed_tcp_ports {

type inet_service

elements = { ssh, http, https, 8080, 9090 }

}

# Цепочка для входящих пакетов

chain input {

type filter hook input priority 0; policy drop;

# Разрешение loopback

iifname "lo" accept

# Разрешение установленных и связанных соединений

ct state established,related accept

# Разрешение ICMP (ping)

ip protocol icmp accept

ip6 nexthdr icmpv6 accept

# Разрешение SSH только из доверенных сетей

tcp dport ssh ip saddr @trusted_networks accept

# Разрешение HTTP/HTTPS для всех

tcp dport { http, https } accept

# Разрешение дополнительных портов из набора

tcp dport @allowed_tcp_ports accept

# Логирование отклоненных пакетов

log prefix "nftables_denied: " group 0

}

# Цепочка для исходящих пакетов

chain output {

type filter hook output priority 0; policy accept;

# Разрешение всего исходящего трафика

ct state established,related,new accept

}

# Цепочка для пересылки пакетов

chain forward {

type filter hook forward priority 0; policy drop;

# Логирование пересылаемых пакетов

log prefix "nftables_forward: " group 0

}

}

-6

2.3. Применение и тестирование конфигурации

# Проверка синтаксиса конфигурации

sudo nft -c -f /etc/nftables.conf

# Применение конфигурации

sudo nft -f /etc/nftables.conf

# Сохранение правил для автозагрузки

sudo nft list ruleset > /etc/nftables.conf

# Проверка активных правил

sudo nft list ruleset

-7

2.4. Пояснение параметров nftables

-8

🔹 3. UFW (Uncomplicated Firewall)

3.1. Установка и настройка с nftables

# Установка UFW

sudo apt update

sudo apt install -y ufw

# Настройка UFW для использования nftables

sudo nano /etc/default/ufw

-9

Установить бэкенд:

IPT_SYSCTL=/etc/ufw/sysctl.conf

IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns"

# Бэкенд для правил

BACKEND="nftables"

-10

Базовая настройка UFW:

# Сброс всех правил

sudo ufw --force reset

# Установка политик по умолчанию

sudo ufw default deny incoming

sudo ufw default allow outgoing

# Разрешение SSH (обязательно!)

sudo ufw allow ssh

sudo ufw allow 22/tcp

# Разрешение веб-сервисов

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

# Разрешение по имени службы

sudo ufw allow ftp

sudo ufw allow dns

# Включение UFW

sudo ufw enable

3.2. Расширенные правила UFW

# Разрешение с указанием источника

sudo ufw allow from 192.168.1.0/24 to any port 22

sudo ufw allow from 203.0.113.50 to any port 80

# Разрешение для конкретного интерфейса

sudo ufw allow in on eth0 to any port 443

sudo ufw allow in on eth1 to any port 9090

# Запрет с логированием

sudo ufw deny log from 10.0.0.0/8 to any port 23

# Ограничение скорости соединений

sudo ufw limit 22/tcp

# Правила для приложений

sudo ufw app list

-11

sudo ufw allow 'Apache Full'

sudo ufw allow 'Nginx HTTPS'

3.3. Управление UFW

# Просмотр правил с номерами

sudo ufw status numbered

-12

# Удаление правила по номеру

sudo ufw delete 3

# Отключение UFW

sudo ufw disable

# Просмотр логов

sudo tail -f /var/log/ufw.log

# Статистика

sudo ufw show added

-13

sudo ufw show listening

-14

🔹 4. FirewallD

4.1. Установка и настройка в Debian

# Установка FirewallD

sudo apt update

sudo apt install -y firewalld

# Запуск и включение

sudo systemctl start firewalld

sudo systemctl enable firewalld

# Проверка статуса

sudo firewall-cmd --state

sudo firewall-cmd --list-all-zones

-15

4.2. Работа с зонами и службами

# Просмотр активных зон

sudo firewall-cmd --get-active-zones

-16

# Настройка зон для интерфейсов

sudo firewall-cmd --zone=public --add-interface=eth0

sudo firewall-cmd --zone=internal --add-interface=eth1

# Добавление служб в зоны

sudo firewall-cmd --zone=public --add-service=ssh

sudo firewall-cmd --zone=public --add-service=http

sudo firewall-cmd --zone=public --add-service=https

sudo firewall-cmd --zone=internal --add-service=ssh

sudo firewall-cmd --zone=internal --add-service=dns

# Добавление портов

sudo firewall-cmd --zone=public --add-port=8080/tcp

sudo firewall-cmd --zone=internal --add-port=9000-9010/tcp

# Сохранение изменений

sudo firewall-cmd --runtime-to-permanent

# Применение изменений

sudo firewall-cmd --reload

4.3. Расширенные настройки FirewallD

# Прямые правила (direct rules) для сложных сценариев

sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT

# Богатые правила (rich rules)

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" reject'

# Временные правила

sudo firewall-cmd --zone=public --add-port=9999/tcp --timeout=300s

# Применение изменений

sudo firewall-cmd --reload

🔹 5. Настройка NAT на двух сетевых интерфейсах

5.1. Сценарий настройки

Конфигурация сети:

  • eth0 — внешний интерфейс (интернет) - DHCP или статический IP
  • eth1 — внутренний интерфейс - 192.168.100.1/24
  • Внутренняя сеть — 192.168.100.0/24

5.2. Настройка NAT с nftables

sudo nano /etc/nftables.conf

Добавить NAT таблицу:

table ip nat {

chain prerouting {

type nat hook prerouting priority -100; policy accept;

# Проброс портов (DNAT)

iifname "eth0" tcp dport 80 dnat to 192.168.100.10:80

iifname "eth0" tcp dport 443 dnat to 192.168.100.10:443

iifname "eth0" tcp dport 2222 dnat to 192.168.100.20:22

}

chain postrouting {

type nat hook postrouting priority 100; policy accept;

# Маскарадинг для внутренней сети (SNAT)

oifname "eth0" ip saddr 192.168.100.0/24 masquerade

}

}

Обновить forward цепочку:

chain forward {

type filter hook forward priority 0; policy drop;

# Разрешение форвардинга для внутренней сети

iifname "eth1" oifname "eth0" ip saddr 192.168.100.0/24 accept

iifname "eth0" oifname "eth1" ip daddr 192.168.100.0/24 ct state established,related accept

# Разрешение для проброшенных портов

iifname "eth0" oifname "eth1" ip daddr 192.168.100.10 tcp dport {80, 443} accept

iifname "eth0" oifname "eth1" ip daddr 192.168.100.20 tcp dport 22 accept

}

5.3. Настройка NAT с FirewallD

# Включение маскарадинга

sudo firewall-cmd --permanent --zone=public --add-masquerade

# Проброс портов

sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.100.10

sudo firewall-cmd --permanent --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.100.10

sudo firewall-cmd --permanent --zone=public --add-forward-port=port=2222:proto=tcp:toport=22:toaddr=192.168.100.20

# Прямые правила для форвардинга

sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth1 -o eth0 -j ACCEPT

sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Применение изменений

sudo firewall-cmd --reload

5.4. Настройка маршрутизации

# Включение форвардинга пакетов

echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

sudo sysctl -p

# Настройка DHCP сервера для внутренней сети (опционально)

sudo apt install -y isc-dhcp-server

# Конфигурация /etc/dhcp/dhcpd.conf

subnet 192.168.100.0 netmask 255.255.255.0 {

range 192.168.100.100 192.168.100.200;

option routers 192.168.100.1;

option domain-name-servers 8.8.8.8, 1.1.1.1;

}

6. Часто используемые правила и сценарии

6.1. Защита веб-сервера

nftables:

table inet web_server {

chain input {

type filter hook input priority 0; policy drop;

# Базовые правила

iifname "lo" accept

ct state established,related accept

ip protocol icmp accept

# Веб-сервисы

tcp dport { http, https } accept

# SSH только из доверенных сетей

tcp dport ssh ip saddr { 192.168.1.0/24, 10.0.0.0/8 } accept

# База данных только с localhost

tcp dport 3306 ip saddr 127.0.0.1 accept

tcp dport 3306 drop

# Защита от флуда

tcp dport http limit rate 100/second burst 200 accept

tcp dport https limit rate 50/second burst 100 accept

}

}

UFW:

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw allow from 192.168.1.0/24 to any port 22

sudo ufw limit 80/tcp

sudo ufw limit 443/tcp

sudo ufw deny 3306/tcp

6.2. Защита от DDoS и сканирования

nftables правила защиты:

table inet protection {

set scanners {

type ipv4_addr

flags timeout

timeout 1h

}

chain input {

# Блокировка сканеров

ip saddr @scanners drop

# Защита от SYN флуда

tcp flags syn limit rate 50/s burst 100 packets accept

tcp flags syn drop

# Защита от UDP флуда

udp limit rate 1000/minute burst 5000 accept

# Блокировка invalid пакетов

ct state invalid drop

}

chain prerouting {

type filter hook prerouting priority -150; policy accept;

# Обнаружение сканеров

tcp flags syn tcp dport 0-1000 add @scanners { ip saddr }

}

}

6.3. Политика для рабочей станции

nftables:

table inet workstation {

chain input {

type filter hook input priority 0; policy drop;

iifname "lo" accept

ct state established,related accept

ip protocol icmp accept

# SSH только из локальной сети

tcp dport ssh ip saddr 192.168.1.0/24 accept

# Разрешение mDNS для обнаружения устройств

udp dport 5353 accept

}

chain output {

type filter hook output priority 0; policy accept;

# Блокировка нежелательных исходящих соединений

tcp dport { 25, 135, 139, 445 } reject

}

}

🔹 7. Мониторинг и отладка

7.1. Мониторинг nftables

# Просмотр счетчиков пакетов и байтов

sudo nft list ruleset -a

# Мониторинг в реальном времени

sudo watch -n 1 'nft list ruleset'

# Статистика по цепочкам

sudo nft list chain inet filter input

# Сброс счетчиков

sudo nft reset ruleset

7.2. Мониторинг UFW

# Подробный статус

sudo ufw status verbose

# Просмотр добавленных правил

sudo ufw show added

# Логирование

sudo journalctl -u ufw -f

sudo tail -f /var/log/ufw.log

7.3. Мониторинг FirewallD

# Полная информация

sudo firewall-cmd --list-all-zones

# Активные подключения

sudo firewall-cmd --get-active-zones

# Логи

sudo journalctl -u firewalld -f

# Статистика

sudo firewall-cmd --direct --get-all-rules

sudo firewall-cmd --direct --get-all-chains

7.4. Утилиты для отладки

# Проверка открытых портов

sudo netstat -tulpn

sudo ss -tulpn

# Проверка подключений

sudo conntrack -L

# Тестирование правил

sudo nft --debug all -f /etc/nftables.conf

🔹 8. Автоматизация и управление

8.1. Скрипт для управления nftables

#!/bin/bash

# firewall-manager.sh

RULES_FILE="/etc/nftables.conf"

BACKUP_DIR="/root/firewall-backups"

case "$1" in

start)

echo "Запуск брандмауэра..."

sudo nft -f $RULES_FILE

;;

stop)

echo "Остановка брандмауэра..."

sudo nft flush ruleset

;;

restart)

echo "Перезапуск брандмауэра..."

sudo nft -f $RULES_FILE

;;

status)

echo "Статус брандмауэра:"

sudo nft list ruleset

;;

backup)

mkdir -p $BACKUP_DIR

BACKUP_FILE="$BACKUP_DIR/nftables-$(date +%Y%m%d-%H%M%S).conf"

sudo nft list ruleset > $BACKUP_FILE

echo "Резервная копия создана: $BACKUP_FILE"

;;

*)

echo "Использование: $0 {start|stop|restart|status|backup}"

exit 1

;;

esac

8.2. Интеграция с системными службами

Создание systemd сервиса для кастомных правил:

sudo nano /etc/systemd/system/custom-firewall.service

В файле прописываем следующее:

[Unit]

Description=Custom Firewall Rules

After=network.target nftables.service

Wants=network.target

[Service]

Type=oneshot

RemainAfterExit=yes

ExecStart=/usr/sbin/nft -f /etc/nftables-custom.conf

ExecReload=/usr/sbin/nft -f /etc/nftables-custom.conf

ExecStop=/usr/sbin/nft delete table inet custom

[Install]

WantedBy=multi-user.target

🔹 Заключение

Сравнение брандмауэров для Debian:

-17

Рекомендации по выбору:

  • Серверы и шлюзы — nftables для максимальной производительности
  • Рабочие станции — UFW для простоты использования
  • Системы с частыми изменениями — FirewallD для динамического управления
  • Высоконагруженные системы — nftables с оптимизированными правилами

Ключевые принципы безопасности:

  1. Минимальные привилегии — разрешайте только необходимые порты
  2. Логирование — ведите журнал подозрительной активности
  3. Регулярный аудит — пересматривайте правила безопасности
  4. Резервное копирование — сохраняйте рабочие конфигурации
  5. Тестирование — проверяйте правила в тестовой среде

Дальнейшие шаги:

  1. Настройка fail2ban для автоматической блокировки атакующих
  2. Внедрение IDS/IPS систем для обнаружения вторжений
  3. Настройка VPN для безопасного удаленного доступа
  4. Реализация сегментации сети для изоляции критичных систем

Команда для быстрой проверки безопасности:

#!/bin/bash

echo "=== Security Check ==="

echo "Open ports:"

ss -tulpn | grep LISTEN

echo -e "\nFirewall status:"

sudo nft list ruleset 2>/dev/null | grep -c "hook input" || ufw status 2>/dev/null || firewall-cmd --state 2>/dev/null

echo -e "\nRecent connections:"

conntrack -L 2>/dev/null | head -10

Теперь ваш Debian защищен современным брандмауэром, соответствующим требованиям безопасности вашей сети!