Вопрос или проблема
Я использую AlmaLinux 9, я понимаю, что есть новая служба бэкенда nftables, которая может управляться командой iptables-nft, поэтому я установил несколько правил, и мой набор правил выглядит следующим образом:
# Внимание: таблица ip nat управляется iptables-nft, не трогайте!
table ip nat {
chain DOCKER {
iifname "docker0" counter packets 0 bytes 0 return
iifname != "docker0" tcp dport 8080 counter packets 3 bytes 180 dnat to 172.17.0.2:80
iifname != "docker0" tcp dport 9001 counter packets 4 bytes 240 dnat to 172.17.0.3:9001
}
chain POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 172.17.0.0/16 oifname != "docker0" counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.0/16 oifname != "docker0" counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.0/16 oifname != "docker0" counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 9001 counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 9001 counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 80 counter packets 0 bytes 0 masquerade
ip saddr 172.17.0.3 ip daddr 172.17.0.3 tcp dport 9001 counter packets 0 bytes 0 masquerade
}
chain PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
fib daddr type local counter packets 236 bytes 12653 jump DOCKER
fib daddr type local counter packets 39 bytes 1732 jump DOCKER
fib daddr type local counter packets 39 bytes 1732 jump DOCKER
fib daddr type local counter packets 23 bytes 1056 jump DOCKER
fib daddr type local counter packets 23 bytes 1056 jump DOCKER
}
chain OUTPUT {
type nat hook output priority dstnat; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
}
}
# Внимание: таблица ip filter управляется iptables-nft, не трогайте!
table ip filter {
chain FORWARD {
type filter hook forward priority filter; policy drop;
counter packets 178 bytes 55546 jump DOCKER-USER
counter packets 178 bytes 55546 jump DOCKER-ISOLATION-STAGE-1
oifname "docker0" ct state related,established counter packets 84 bytes 11338 accept
oifname "docker0" counter packets 7 bytes 420 jump DOCKER
iifname "docker0" oifname != "docker0" counter packets 87 bytes 43788 accept
iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
}
chain DOCKER-USER {
counter packets 178 bytes 55546 return
}
chain INPUT {
type filter hook input priority filter; policy drop;
ct state established,related counter packets 195 bytes 18089 accept
tcp dport 22 counter packets 2 bytes 120 accept
tcp dport 443 counter packets 0 bytes 0 accept
}
chain DOCKER {
ip daddr 172.17.0.2 iifname != "docker0" oifname "docker0" tcp dport 80 counter packets 3 bytes 180 accept
ip daddr 172.17.0.3 iifname != "docker0" oifname "docker0" tcp dport 9001 counter packets 4 bytes 240 accept
}
chain DOCKER-ISOLATION-STAGE-1 {
iifname "docker0" oifname != "docker0" counter packets 87 bytes 43788 jump DOCKER-ISOLATION-STAGE-2
counter packets 178 bytes 55546 return
}
chain DOCKER-ISOLATION-STAGE-2 {
oifname "docker0" counter packets 0 bytes 0 drop
counter packets 87 bytes 43788 return
}
}
Этот набор правил сохраняется в /etc/sysconfig/nftables.conf
, поэтому он загружается каждый раз при перезагрузке сервера. Как вы можете видеть в цепи INPUT, все должно быть заблокировано, кроме портов 22 и 443, так что я попытался запустить тестовый сервер nginx на порту 8080, и я все еще могу получить к нему доступ, мой файрвол не блокирует ничего… почему? Даже когда политика INPUT установлена как drop.
ИЗМЕНЕНИЕ:
Я вручную добавил “tcp dport 8080 drop” на первой строке в цепь FORWARD, а затем сохранил это в /etc/sysconfig/nftables.conf, и после перезагрузки сервера оно вернулось к последнему правилу.
chain FORWARD {
type filter hook forward priority filter; policy drop;
counter packets 0 bytes 0 jump DOCKER-USER
counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1
oifname "docker0" ct state related,established counter packets 0 bytes 0 accept
oifname "docker0" counter packets 0 bytes 0 jump DOCKER
iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept
iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
tcp dport 8080 drop
}
Я запустил это так: docker run -d –restart always -p 8080:80 nginx
Таким образом, трафик не ‘входящий’ с точки зрения ОС хоста – он может выглядеть так, но у вас есть nat/prerouting
правила, которые переписывают пакеты, чтобы вместо этого они шли на другой IP-адрес (адрес контейнера), заставляя хоста действовать как маршрутизатор перед контейнерами и делая его фактически перенаправленным трафиком (т.е. маршрутизированным), который затем попадает под hook forward
.
(Другими словами: шаг ‘маршрутизации’ – это место, где принимается решение между входящими и перенаправленными, следовательно, это зависит от результата цепочек ‘prerouting’.)
Ответ или решение
Когда дело касается настройки брандмауэра на AlmaLinux 9 с использованием nftables, важно понимать, как работают цепочки и правила, которые обеспечивают фильтрацию трафика. В вашем вопросе отмечается, что, несмотря на установленную политику "drop" в цепочке INPUT, трафик на порт 8080 не блокируется, что очевидно вызывает неразбериху. Давайте разберемся в этом подробнее.
Причины, по которым firewall не блокирует трафик
-
Тип трафика: INPUT vs FORWARD
- Когда вы запускаете контейнер Docker с заданием маршрутизации через
-p 8080:80
, трафик на порт 8080 не попадает в цепочку INPUT на хосте. Вместо этого он обрабатывается как маршрутизируемый трафик и перенаправляется в цепочку FORWARD. Это связано с тем, что хост обрабатывает поток как трафик, который он передает дальше, а не как входящий.
- Когда вы запускаете контейнер Docker с заданием маршрутизации через
-
Обработка правил NAT
- Ваша конфигурация
nftables
содержит правила NAT в цепочке PREROUTING, где пакеты, приходящие на локальный интерфейс, перенаправляются на IP-адреса контейнеров. Это также влияет на то, как будет обрабатываться этот трафик. Трафик, перенаправленный через правила DNAT, фактически отправляется в цепь FORWARD.
- Ваша конфигурация
-
Политики и положения в цепочках
- Ваша политика в цепочке FORWARD установлена на "drop", но если есть правила, которые принимают пакеты, такие как
oifname "docker0" ct state related, established
, это может повлиять на общее поведение. Правило, принимающее трафик из состояния, установленного после NAT, будет проходить дальше.
- Ваша политика в цепочке FORWARD установлена на "drop", но если есть правила, которые принимают пакеты, такие как
Рекомендации по исправлению ситуации
-
Добавление правил в FORWARD
- Поскольку трафик на порт 8080 обрабатывается в цепочке FORWARD, добавьте правило для блокировки трафика на этот порт непосредственно в эту цепочку. Например, добавьте
tcp dport 8080 drop
после указания политики"drop"
.
- Поскольку трафик на порт 8080 обрабатывается в цепочке FORWARD, добавьте правило для блокировки трафика на этот порт непосредственно в эту цепочку. Например, добавьте
-
Изменение конфигурации правила NAT
- При необходимости пересмотрите правила NAT и убедитесь, что они не противоречат политике фильтрации. Например, возможно, имеет смысл сначала остановить перенаправление или отрегулировать его, чтобы обеспечить правильное вскрытие трафика.
-
Перезапись конфигурации
- Убедитесь, что вы правильно сохраняете изменения в
/etc/sysconfig/nftables.conf
. Уточните, правильно ли вы выполняете команду сохранения после внесения изменений. Чтобы новые правила применялись после перезагрузки, используйтеnft list ruleset > /etc/sysconfig/nftables.conf
после добавления правил.
- Убедитесь, что вы правильно сохраняете изменения в
-
Тестирование и отладка
- После внесения изменений выполните тестирование, например, попробуйте использовать
curl
или аналогичный инструмент для проверки доступности порта, чтобы убедиться, что брандмауэр работает как ожидается.
- После внесения изменений выполните тестирование, например, попробуйте использовать
Заключение
Ваша проблема с блокировкой трафика на порту 8080 в AlmaLinux 9, скорее всего, связана с маршрутизацией контейнеров Docker и правилами фильтрации в цепочке FORWARD. Понимание сетевых путей и состояния пакетов в вашей конфигурации поможет вам правильно настроить систему безопасности. Применение этих рекомендаций поможет вернуть контроль в руки вашей системе безопасности, обеспечивая необходимый уровень защиты от нежелательного трафика.