🔹 Теоретическая часть: Основы сетевой безопасности
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
# Просмотр конкретной таблицы
sudo nft list table inet filter
# Просмотр с форматированием
sudo nft -s list ruleset
Создание базовой конфигурации:
sudo nano /etc/nftables.conf
#!/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
}
}
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
2.4. Пояснение параметров nftables
🔹 3. UFW (Uncomplicated Firewall)
3.1. Установка и настройка с nftables
# Установка UFW
sudo apt update
sudo apt install -y ufw
# Настройка UFW для использования nftables
sudo nano /etc/default/ufw
Установить бэкенд:
IPT_SYSCTL=/etc/ufw/sysctl.conf
IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns"
# Бэкенд для правил
BACKEND="nftables"
Базовая настройка 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
sudo ufw allow 'Apache Full'
sudo ufw allow 'Nginx HTTPS'
3.3. Управление UFW
# Просмотр правил с номерами
sudo ufw status numbered
# Удаление правила по номеру
sudo ufw delete 3
# Отключение UFW
sudo ufw disable
# Просмотр логов
sudo tail -f /var/log/ufw.log
# Статистика
sudo ufw show added
sudo ufw show listening
🔹 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
4.2. Работа с зонами и службами
# Просмотр активных зон
sudo firewall-cmd --get-active-zones
# Настройка зон для интерфейсов
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:
Рекомендации по выбору:
- Серверы и шлюзы — nftables для максимальной производительности
- Рабочие станции — UFW для простоты использования
- Системы с частыми изменениями — FirewallD для динамического управления
- Высоконагруженные системы — nftables с оптимизированными правилами
Ключевые принципы безопасности:
- Минимальные привилегии — разрешайте только необходимые порты
- Логирование — ведите журнал подозрительной активности
- Регулярный аудит — пересматривайте правила безопасности
- Резервное копирование — сохраняйте рабочие конфигурации
- Тестирование — проверяйте правила в тестовой среде
Дальнейшие шаги:
- Настройка fail2ban для автоматической блокировки атакующих
- Внедрение IDS/IPS систем для обнаружения вторжений
- Настройка VPN для безопасного удаленного доступа
- Реализация сегментации сети для изоляции критичных систем
Команда для быстрой проверки безопасности:
#!/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 защищен современным брандмауэром, соответствующим требованиям безопасности вашей сети!