Firewall
Firewall — межсетевой экран, который контролирует сетевой трафик по заданным правилам.
Firewall может разрешать или блокировать соединения на основе:
- IP-адреса источника и назначения;
- сетевого интерфейса;
- протокола;
- порта;
- состояния соединения;
- направления трафика;
- зоны безопасности;
- дополнительных признаков пакета.
Простейшее правило можно описать так:
Разрешить входящие TCP-соединения на порт 443.Или:
Запретить входящие соединения с IP-адреса 203.0.113.50.Firewall обычно работает на уровне сетевого и транспортного протоколов:
- IP;
- TCP;
- UDP;
- ICMP;
- IPv6.
Firewall не заменяет:
- аутентификацию;
- HTTPS;
- антивирус;
- обновление операционной системы;
- защиту приложения;
- контроль доступа пользователей.
Он ограничивает сетевую доступность, но не устраняет уязвимости уже разрешённого сервиса.
Stateful и stateless firewall
Stateless firewall
Stateless firewall рассматривает каждый пакет независимо.
Для каждого пакета проверяются:
- IP-адрес;
- протокол;
- порт;
- интерфейс;
- направление.
Такой firewall не помнит, является ли пакет частью уже установленного соединения.
Stateful firewall
Stateful firewall отслеживает состояние соединений.
Например, если сервер разрешил исходящее TCP-соединение к внешнему серверу, ответные пакеты могут быть разрешены автоматически как часть уже существующего соединения.
Для TCP firewall может отслеживать состояния:
NEW
ESTABLISHED
RELATED
INVALIDНа Linux состояние соединений отслеживается подсистемой conntrack.
Типичное правило:
Разрешить уже установленные и связанные соединения.Это позволяет не описывать отдельное правило для каждого ответного пакета.
Основные действия правил
Правило firewall обычно заканчивается действием.
ACCEPT
Разрешает пакет или соединение:
ACCEPTПример:
Разрешить TCP-порт 443.DROP
Молча отбрасывает пакет:
DROPОтправитель обычно не получает ответа. Это увеличивает время ожидания соединения.
REJECT
Отклоняет пакет и обычно отправляет сообщение об ошибке:
REJECTКлиент быстрее узнаёт, что соединение запрещено.
Разница:
DROP — не отвечать;
REJECT — явно отказать.Для внешних нежелательных соединений часто используют DROP, а для внутренних сетей и диагностики может быть удобнее REJECT.
LOG
Записывает информацию о пакете в журнал:
LOGЛогирование следует использовать осторожно. Если правило вызывается для большого количества пакетов, журналы могут быстро заполнить диск.
RETURN
Возвращает обработку из пользовательской цепочки в вызывающую цепочку:
RETURNПринцип обработки правил
Правила обычно проверяются сверху вниз.
Если пакет совпал с правилом, выполняется его действие:
1. Разрешить TCP 22 с доверенного IP
2. Запретить TCP 22 от остальныхПакет от доверенного IP совпадёт с первым правилом и будет разрешён.
Если поменять порядок:
1. Запретить TCP 22 от всех
2. Разрешить TCP 22 с доверенного IPвторое правило может никогда не сработать.
Поэтому порядок правил имеет значение.
Типичная последовательность:
- разрешить loopback;
- разрешить уже установленные соединения;
- разрешить явно нужные сервисы;
- добавить специальные исключения;
- запретить остальной трафик.
iptables
iptables — классический инструмент настройки firewall в Linux.
В современных системах команда iptables может работать поверх совместимого backend на базе nftables, но синтаксис при этом остаётся старым.
Проверить версию:
iptables --versionПример возможного вывода:
iptables v1.8.x (nf_tables)Это означает, что команда iptables использует backend nftables.
На новых системах предпочтительнее использовать непосредственно nftables или управляющий инструмент дистрибутива.
Таблицы iptables
iptables разделяет правила по таблицам.
filter
Основная таблица фильтрации пакетов.
Используется для:
- разрешения;
- блокировки;
- фильтрации входящего трафика;
- фильтрации исходящего трафика;
- маршрутизируемого трафика.
nat
Таблица трансляции адресов и портов.
Используется для:
- DNAT;
- SNAT;
- MASQUERADE;
- перенаправления портов.
mangle
Используется для специальных изменений и маркировки пакетов.
raw
Используется для обработки пакетов до некоторых этапов conntrack.
В обычной настройке веб-сервера чаще всего работают с таблицей:
filterа при публикации сервисов через NAT — дополнительно с:
natЦепочки iptables
В таблице filter есть стандартные цепочки:
INPUT
OUTPUT
FORWARDINPUT
Обрабатывает пакеты, предназначенные для текущего хоста:
Интернет → серверНапример, входящее подключение к порту 443.
OUTPUT
Обрабатывает пакеты, созданные текущим хостом:
Сервер → ИнтернетНапример, запрос сервера к DNS или внешнему API.
FORWARD
Обрабатывает пакеты, которые проходят через хост, но предназначены не ему.
Цепочка используется, если Linux работает как:
- маршрутизатор;
- шлюз;
- VPN-сервер;
- NAT-шлюз;
- сетевой мост с фильтрацией.
Пользовательские цепочки
Можно создавать собственные цепочки:
iptables -N WEB_RULESПереход в пользовательскую цепочку:
iptables -A INPUT -p tcp --dport 443 -j WEB_RULESПользовательские цепочки позволяют разделять большие наборы правил по назначению.
Просмотр правил iptables
sudo iptables -LБолее подробный вывод:
sudo iptables -L -n -vПараметры:
-L— вывести правила;-n— не выполнять обратное DNS-разрешение;-v— показать подробную информацию и счётчики пакетов.
С номерами правил:
sudo iptables -L --line-numbers -n -vПросмотр правил в формате команд:
sudo iptables-saveДля IPv6:
sudo ip6tables -L -n -vУстановка политик по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPTЗдесь:
- входящие соединения запрещены по умолчанию;
- маршрутизируемый трафик запрещён;
- исходящий трафик разрешён.
Перед установкой политики DROP необходимо добавить правила для управления сервером. Иначе можно потерять SSH-доступ.
Loopback-интерфейс
Локальные программы используют интерфейс:
loРазрешение loopback-трафика:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPTБез этого могут перестать работать сервисы, которые общаются друг с другом через локальный интерфейс.
Уже установленные соединения
Разрешение существующих и связанных соединений:
sudo iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED \
-j ACCEPTДля исходящего трафика:
sudo iptables -A OUTPUT -m conntrack \
--ctstate ESTABLISHED,RELATED \
-j ACCEPTСмысл правила:
Если соединение уже разрешено или связано с разрешённым соединением, пропустить пакет.Разрешение TCP-порта
Разрешить SSH:
sudo iptables -A INPUT \
-p tcp \
--dport 22 \
-m conntrack --ctstate NEW \
-j ACCEPTРазрешить HTTP:
sudo iptables -A INPUT \
-p tcp \
--dport 80 \
-m conntrack --ctstate NEW \
-j ACCEPTРазрешить HTTPS:
sudo iptables -A INPUT \
-p tcp \
--dport 443 \
-m conntrack --ctstate NEW \
-j ACCEPTМожно использовать короткую форму без проверки состояния:
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPTОднако явное указание состояния делает назначение правила понятнее.
Разрешение UDP-порта
Разрешить DNS-запросы к серверу:
sudo iptables -A INPUT \
-p udp \
--dport 53 \
-m conntrack --ctstate NEW \
-j ACCEPTЕсли DNS-сервер также принимает TCP-запросы:
sudo iptables -A INPUT \
-p tcp \
--dport 53 \
-m conntrack --ctstate NEW \
-j ACCEPTНе следует открывать UDP-порт только потому, что сервис обычно работает поверх UDP. Нужно учитывать фактический протокол и документацию сервиса.
Ограничение по IP-адресу
Разрешить SSH только с доверенного адреса:
sudo iptables -A INPUT \
-p tcp \
-s 198.51.100.25 \
--dport 22 \
-j ACCEPTЗапретить соединения с адреса:
sudo iptables -A INPUT \
-s 203.0.113.50 \
-j DROPРазрешить доступ к веб-серверу только из подсети:
sudo iptables -A INPUT \
-p tcp \
-s 198.51.100.0/24 \
--dport 443 \
-j ACCEPTОграничение по интерфейсу
Разрешить трафик на конкретном интерфейсе:
sudo iptables -A INPUT \
-i eth0 \
-p tcp \
--dport 443 \
-j ACCEPTДля VPN-интерфейса:
sudo iptables -A INPUT \
-i wg0 \
-p tcp \
--dport 8080 \
-j ACCEPTICMP
ICMP используется для диагностических и служебных сообщений.
Разрешение входящих ICMP-пакетов:
sudo iptables -A INPUT -p icmp -j ACCEPTБолее строгие правила могут разрешать только определённые типы ICMP.
Для IPv4 можно, например, разрешить echo request:
sudo iptables -A INPUT \
-p icmp \
--icmp-type echo-request \
-j ACCEPTДля IPv6 ICMPv6 особенно важен. Он используется не только для ping, но и для:
- Neighbor Discovery;
- Router Discovery;
- Path MTU Discovery;
- служебной работы IPv6.
Полная блокировка ICMPv6 может нарушить IPv6-соединения.
Политика по умолчанию и явный запрет
Вариант с политикой по умолчанию:
sudo iptables -P INPUT DROPОстальной неподходящий трафик будет запрещён автоматически.
Можно добавить явное правило:
sudo iptables -A INPUT -j DROPОбычно достаточно одного подхода. Явный финальный DROP может быть удобен, если в конце цепочки нужно добавить логирование:
sudo iptables -A INPUT \
-m limit --limit 5/min \
-j LOG --log-prefix "iptables-input-drop: "
sudo iptables -A INPUT -j DROPОграничение --limit предотвращает чрезмерное количество записей в журнале.
nftables
nftables — современная подсистема фильтрации и трансляции сетевого трафика в Linux.
Преимущества nftables:
- единый инструмент для IPv4 и IPv6;
- более компактный синтаксис;
- наборы адресов и портов;
- атомарная загрузка конфигурации;
- более удобное управление большими правилами;
- возможность использовать семейство
inetдля IPv4 и IPv6 одновременно.
Основная команда:
sudo nftПроверить версию:
nft --versionСемейства nftables
nftables группирует правила по семействам.
ip
Только IPv4:
ipip6
Только IPv6:
ip6inet
IPv4 и IPv6:
inetДля обычного firewall сервера часто удобно использовать:
table inet filterbridge
Фильтрация bridge-трафика.
netdev
Фильтрация на уровне сетевого устройства.
Просмотр текущей конфигурации
sudo nft list rulesetСчётчики и подробная информация:
sudo nft -a list rulesetТаблица и цепочки nftables
Создание таблицы:
sudo nft add table inet filterСоздание цепочки для входящего трафика:
sudo nft add chain inet filter input \
'{ type filter hook input priority 0; policy drop; }'Создание цепочки для исходящего трафика:
sudo nft add chain inet filter output \
'{ type filter hook output priority 0; policy accept; }'Создание цепочки для маршрутизируемого трафика:
sudo nft add chain inet filter forward \
'{ type filter hook forward priority 0; policy drop; }'Loopback в nftables
sudo nft add rule inet filter input iifname "lo" acceptУже установленные соединения
sudo nft add rule inet filter input \
ct state established,related acceptНевалидные пакеты можно явно отклонять:
sudo nft add rule inet filter input \
ct state invalid dropРазрешение TCP-портов
Разрешить SSH:
sudo nft add rule inet filter input \
tcp dport 22 \
ct state new acceptРазрешить HTTP и HTTPS:
sudo nft add rule inet filter input \
tcp dport { 80, 443 } \
ct state new acceptВ nftables фигурные скобки задают набор значений.
Разрешение UDP-портов
sudo nft add rule inet filter input \
udp dport 53 \
ct state new acceptНесколько UDP-портов:
sudo nft add rule inet filter input \
udp dport { 53, 51820 } \
ct state new acceptОграничение по IP-адресу
sudo nft add rule inet filter input \
ip saddr 198.51.100.25 \
tcp dport 22 \
acceptДля IPv6:
sudo nft add rule inet filter input \
ip6 saddr 2001:db8:1234::/48 \
tcp dport 22 \
acceptСемейство inet позволяет использовать IPv4- и IPv6-правила в одной таблице.
Разрешение ICMP и ICMPv6
sudo nft add rule inet filter input \
meta l4proto icmp accept
sudo nft add rule inet filter input \
meta l4proto icmpv6 acceptДля рабочего сервера правила ICMP и ICMPv6 лучше адаптировать под конкретную сетевую политику, а не бездумно разрешать или запрещать весь протокол.
Пример базовой конфигурации nftables
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
policy drop;
# Локальный трафик
iifname "lo" accept
# Уже установленные соединения
ct state established,related accept
# Некорректные пакеты
ct state invalid drop
# ICMP и ICMPv6
meta l4proto icmp accept
meta l4proto icmpv6 accept
# SSH
tcp dport 22 ct state new accept
# HTTP и HTTPS
tcp dport { 80, 443 } ct state new accept
}
chain forward {
type filter hook forward priority 0;
policy drop;
}
chain output {
type filter hook output priority 0;
policy accept;
}
}В конфигурации с политикой drop для входящих соединений нужно заранее убедиться, что административный доступ разрешён.
Сохранение конфигурации nftables
Расположение файла зависит от дистрибутива. Часто используется:
/etc/nftables.confПроверить конфигурацию без применения:
sudo nft -c -f /etc/nftables.confЗагрузить конфигурацию:
sudo nft -f /etc/nftables.confВключить запуск при загрузке:
sudo systemctl enable nftables
sudo systemctl start nftablesПеред перезапуском полезно проверить:
sudo nft -c -f /etc/nftables.confСинтаксическая ошибка в конфигурации может привести к тому, что firewall не загрузится после перезагрузки.
iptables и nftables
iptables и nftables могут сосуществовать, но одновременное управление одним и тем же трафиком разными инструментами усложняет диагностику.
Нужно определить, какой механизм используется:
iptables --version
sudo nft list rulesetЕсли iptables показывает:
(nf_tables)команда, вероятно, работает через совместимый слой nftables.
Рекомендуется:
- выбрать один основной способ управления;
- не редактировать правила вручную одновременно через несколько менеджеров;
- документировать, какой сервис загружает конфигурацию;
- проверять правила после перезагрузки;
- учитывать правила, добавленные Docker, Kubernetes, VPN и другими службами.
UFW
UFW (Uncomplicated Firewall) — упрощённый интерфейс для настройки firewall в Debian- и Ubuntu-подобных системах.
UFW скрывает детали iptables/nftables и позволяет описывать правила в более простом виде.
Проверить статус:
sudo ufw statusПодробный статус:
sudo ufw status verboseВключить UFW:
sudo ufw enableОтключить:
sudo ufw disableПеред включением на удалённом сервере необходимо разрешить SSH.
Политики UFW
Запретить входящие соединения по умолчанию:
sudo ufw default deny incomingРазрешить исходящие соединения:
sudo ufw default allow outgoingЗапретить маршрутизацию:
sudo ufw default deny routedДля обычного веб-сервера типичный вариант:
sudo ufw default deny incoming
sudo ufw default allow outgoingРазрешение портов в UFW
Разрешить SSH:
sudo ufw allow 22/tcpРазрешить HTTP:
sudo ufw allow 80/tcpРазрешить HTTPS:
sudo ufw allow 443/tcpРазрешить оба веб-порта:
sudo ufw allow 80,443/tcpРазрешить UDP-порт:
sudo ufw allow 51820/udpРазрешение по имени профиля
UFW может использовать профили приложений:
sudo ufw app listПример:
Nginx Full
OpenSSH
ApacheРазрешить OpenSSH:
sudo ufw allow OpenSSHРазрешить Nginx с HTTP и HTTPS:
sudo ufw allow "Nginx Full"Список правил:
sudo ufw status numberedОграничение доступа по IP
Разрешить SSH только из подсети:
sudo ufw allow from 198.51.100.0/24 to any port 22 proto tcpРазрешить HTTPS только конкретному адресу:
sudo ufw allow from 198.51.100.25 to any port 443 proto tcpЗапретить адрес:
sudo ufw deny from 203.0.113.50Ограничить частоту SSH-подключений:
sudo ufw limit 22/tcpЭто может помочь против простых переборов, но не заменяет:
- ключевую аутентификацию;
- отключение входа по паролю;
- fail2ban;
- многофакторную аутентификацию.
Удаление правила UFW
По номеру:
sudo ufw status numbered
sudo ufw delete 3Повторить исходное правило:
sudo ufw delete allow 80/tcpЛогирование UFW
Включить обычное логирование:
sudo ufw logging onБолее подробные уровни:
sudo ufw logging low
sudo ufw logging medium
sudo ufw logging highНа серверах с большим количеством трафика чрезмерное логирование может создать много записей.
firewalld
firewalld — динамический менеджер firewall, распространённый в Fedora, RHEL, CentOS Stream, Rocky Linux и AlmaLinux.
В основе современных конфигураций firewalld может использовать nftables.
Основные понятия:
- зоны;
- сервисы;
- порты;
- источники;
- runtime-конфигурация;
- permanent-конфигурация.
Зоны firewalld
Зона описывает уровень доверия к сетевому подключению.
Посмотреть активные зоны:
sudo firewall-cmd --get-active-zonesПолучить список всех зон:
sudo firewall-cmd --get-zonesПосмотреть текущую зону по умолчанию:
sudo firewall-cmd --get-default-zoneПример активной зоны:
public
interfaces: eth0Runtime и permanent
firewalld разделяет настройки на:
- runtime — действуют сейчас;
- permanent — сохраняются после перезагрузки.
Добавить порт только временно:
sudo firewall-cmd --zone=public \
--add-port=443/tcpДобавить порт постоянно:
sudo firewall-cmd --zone=public \
--permanent \
--add-port=443/tcpПосле постоянного изменения применить конфигурацию:
sudo firewall-cmd --reloadЕсли добавить правило только с --permanent, оно не всегда начинает действовать немедленно до перезагрузки или reload.
Разрешение сервисов
Список доступных сервисов:
sudo firewall-cmd --get-servicesРазрешить SSH:
sudo firewall-cmd --zone=public \
--permanent \
--add-service=sshРазрешить HTTP:
sudo firewall-cmd --zone=public \
--permanent \
--add-service=httpРазрешить HTTPS:
sudo firewall-cmd --zone=public \
--permanent \
--add-service=httpsПрименить изменения:
sudo firewall-cmd --reloadРазрешение портов
sudo firewall-cmd --zone=public \
--permanent \
--add-port=8080/tcpРазрешить диапазон:
sudo firewall-cmd --zone=public \
--permanent \
--add-port=6000-6010/tcpУдалить порт:
sudo firewall-cmd --zone=public \
--permanent \
--remove-port=8080/tcpПросмотр настроек
sudo firewall-cmd --zone=public --list-allВсе зоны:
sudo firewall-cmd --list-all-zonesПроверить, разрешён ли порт:
sudo firewall-cmd --zone=public \
--query-port=443/tcpПроверить, разрешён ли сервис:
sudo firewall-cmd --zone=public \
--query-service=httpsОграничение по источнику
Создать правило для подсети с использованием rich rule:
sudo firewall-cmd --zone=public \
--permanent \
--add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" port port="22" protocol="tcp" accept'Применить:
sudo firewall-cmd --reloadЗапретить адрес:
sudo firewall-cmd --zone=public \
--permanent \
--add-rich-rule='rule family="ipv4" source address="203.0.113.50" drop'Цепочки правил
Цепочка — последовательность правил, через которую проходит пакет.
В разных инструментах терминология отличается, но логика похожа.
В iptables
Основные цепочки:
INPUT
OUTPUT
FORWARDДополнительные цепочки можно создавать самостоятельно.
В nftables
Цепочка привязывается к сетевому hook:
input
output
forwardОна может иметь политику:
accept
dropВ firewalld
Пользователь обычно работает не с цепочками напрямую, а с:
- зонами;
- сервисами;
- портами;
- rich rules;
- direct rules.
В UFW
Пользователь задаёт простые правила, а UFW самостоятельно преобразует их в правила нижнего уровня.
Основные направления трафика
Входящий трафик
Соединение направлено к текущему серверу:
Клиент → веб-серверОбычно управляется цепочкой:
INPUTДля веб-сервера разрешаются порты:
80/tcp
443/tcpИсходящий трафик
Соединение инициируется самим сервером:
Веб-сервер → DNS-сервер
Веб-сервер → база данных
Веб-сервер → внешний APIУправляется цепочкой:
OUTPUTЧастая базовая политика:
INPUT DROP
OUTPUT ACCEPTВ более защищённых системах исходящий трафик также ограничивают, но это требует полного списка зависимостей приложения.
Пересылаемый трафик
Пакет проходит через сервер:
Клиент → Linux-шлюз → другой серверУправляется цепочкой:
FORWARDЭто важно для:
- маршрутизаторов;
- NAT-шлюзов;
- VPN-серверов;
- контейнерных сетей.
Настройка firewall для веб-сервера
Предположим, сервер предоставляет:
- SSH для администрирования;
- HTTP для перенаправления на HTTPS;
- HTTPS для основного сайта.
Нужно разрешить:
TCP 22
TCP 80
TCP 443Остальные входящие соединения следует запретить.
Подготовка
Перед изменением firewall нужно определить:
- имя сетевого интерфейса;
- текущий IP-адрес;
- SSH-порт;
- используется ли IPv4;
- используется ли IPv6;
- какие сервисы должны быть доступны извне;
- есть ли консольный доступ через панель провайдера.
Проверить адреса:
ip addrПроверить слушающие порты:
sudo ss -tulpenПроверить текущий SSH-сеанс:
echo "$SSH_CONNECTION"Не следует закрывать текущую SSH-сессию сразу после изменения правил. Сначала нужно открыть вторую сессию и проверить подключение.
Вариант с UFW
Установить политику по умолчанию:
sudo ufw default deny incoming
sudo ufw default allow outgoingРазрешить SSH:
sudo ufw allow 22/tcpРазрешить веб-трафик:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpВключить firewall:
sudo ufw enableПроверить:
sudo ufw status verboseОжидаемая логика:
Входящие: запрещены по умолчанию
SSH: разрешён
HTTP: разрешён
HTTPS: разрешён
Исходящие: разрешеныЕсли SSH работает на нестандартном порту, например 2222:
sudo ufw allow 2222/tcpПосле проверки можно удалить правило для старого порта 22, если оно больше не нужно:
sudo ufw delete allow 22/tcpВариант с firewalld
Установить постоянную политику для зоны:
sudo firewall-cmd --zone=public \
--permanent \
--add-service=ssh
sudo firewall-cmd --zone=public \
--permanent \
--add-service=http
sudo firewall-cmd --zone=public \
--permanent \
--add-service=httpsПрименить:
sudo firewall-cmd --reloadПроверить:
sudo firewall-cmd --zone=public --list-allЕсли SSH использует порт 2222:
sudo firewall-cmd --zone=public \
--permanent \
--add-port=2222/tcpПосле проверки старое разрешение SSH можно удалить:
sudo firewall-cmd --zone=public \
--permanent \
--remove-service=sshЗатем:
sudo firewall-cmd --reloadВариант с nftables
Пример базовой конфигурации:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
policy drop;
# Локальные соединения
iifname "lo" accept
# Ответы на уже разрешённые соединения
ct state established,related accept
# Отбрасывать некорректные пакеты
ct state invalid drop
# Диагностический и служебный трафик
meta l4proto icmp accept
meta l4proto icmpv6 accept
# SSH
tcp dport 22 ct state new accept
# HTTP и HTTPS
tcp dport { 80, 443 } ct state new accept
}
chain forward {
type filter hook forward priority 0;
policy drop;
}
chain output {
type filter hook output priority 0;
policy accept;
}
}Проверить синтаксис:
sudo nft -c -f /etc/nftables.confЗагрузить:
sudo nft -f /etc/nftables.confПроверить правила:
sudo nft list rulesetВариант с iptables
Пример порядка правил:
# Разрешить loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные соединения
sudo iptables -A INPUT \
-m conntrack \
--ctstate ESTABLISHED,RELATED \
-j ACCEPT
# Разрешить SSH
sudo iptables -A INPUT \
-p tcp \
--dport 22 \
-m conntrack --ctstate NEW \
-j ACCEPT
# Разрешить HTTP
sudo iptables -A INPUT \
-p tcp \
--dport 80 \
-m conntrack --ctstate NEW \
-j ACCEPT
# Разрешить HTTPS
sudo iptables -A INPUT \
-p tcp \
--dport 443 \
-m conntrack --ctstate NEW \
-j ACCEPT
# Политики
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPTПроверить:
sudo iptables -L -n -vПравила iptables могут исчезнуть после перезагрузки, если не настроить сохранение.
В Debian/Ubuntu часто используют пакет:
iptables-persistentСохранение правил:
sudo netfilter-persistent saveВ других системах способ сохранения может отличаться.
Безопасная последовательность настройки
На удалённом сервере рекомендуется соблюдать порядок:
- Открыть дополнительную SSH-сессию.
- Узнать текущий SSH-порт.
- Разрешить SSH в firewall.
- Разрешить необходимые веб-порты.
- Проверить конфигурацию.
- Открыть ещё одну SSH-сессию.
- Проверить доступность HTTP и HTTPS.
- Только после этого включить строгую политику.
- Сохранить конфигурацию.
- Проверить правила после перезагрузки или reload.
Не следует начинать с команды:
sudo iptables -P INPUT DROPесли правило для SSH ещё не добавлено.
Проверка доступности портов
На сервере:
sudo ss -lntup