Вопрос или проблема
Я настроил Keepalived как балансировщик нагрузки, но не использую конфигурацию Master/Standby — только один сервер.
Проблема возникает, когда включен firewalld. Без firewalld всё работает нормально. Однако, когда firewalld запущен, пакеты, возвращающиеся с реального сервера, блокируются правилом STATE_INVALID_DROP.
Настройка включает два интерфейса: enp2s0 (зона клиентов) и enp3s0 (зона серверов). Трафик, flowing с enp2s0 на enp3s0, работает корректно, но проблема возникает с возвратным трафиком с enp3s0 на enp2s0.
Интересно, что если я использую только firewalld с настроенным маршрутом для достижения реального сервера и убираю Keepalived, трафик проходит без проблем. Проблема появляется только тогда, когда оба firewalld и Keepalived используются вместе.
Вот моя конфигурация зон:
router1@router1:~$ sudo firewall-cmd --zone clients --list-all
clients (active)
target: DROP
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: enp2s0
sources:
services: http
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
router1@router1:~$ sudo firewall-cmd --zone servers --list-all
servers (active)
target: DROP
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: enp3s0
sources:
services: http
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
А вот моя конфигурация политик:
router1@router1:~$ sudo firewall-cmd --policy fromCliToSrv --list-all
fromCliToSrv (active)
priority: -1
target: DROP
ingress-zones: clients
egress-zones: servers
services: http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
router1@router1:~$ sudo firewall-cmd --policy fromSrvToCli --list-all
fromSrvToCli (active)
priority: -1
target: DROP
ingress-zones: servers
egress-zones: clients
services: http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
А вот моя конфигурация keepalived:
router1@router1:~$ sudo cat /etc/keepalived/keepalived.conf
! Файл конфигурации для keepalived
virtual_server 172.20.241.20 80 {
lb_algo wrr
lb_kind NAT
protocol TCP
persistence_timeout 600
persistence_granularity 255.255.255.0
real_server 10.0.1.5 {
weight 1
}
real_server 10.0.1.6 {
weight 2
}
real_server 10.0.1.7 {
weight 3
}
}
Я попробовал добавить форвардинг портов в зону клиентов вот так:
router1@router1:~$ sudo firewall-cmd --permanent --zone clients --add-forward-port=port=80:proto=tcp:toaddr=10.0.1.5:toport=80
success
router1@router1:~$ sudo firewall-cmd --permanent --zone clients --add-forward-port=port=80:proto=tcp:toaddr=10.0.1.6:toport=80
success
router1@router1:~$ sudo firewall-cmd --permanent --zone clients --add-forward-port=port=80:proto=tcp:toaddr=10.0.1.7:toport=80
success
router1@router1:~$ sudo firewall-cmd --reload
success
Но эта конфигурация перенаправляет все запросы на 10.0.1.5, потому что это первое правило, которое было добавлено.
Ответ или решение
Решение проблемы с Keepalived NAT и firewalld: STATE_INVALID_DROP блокирует возвратные пакеты от реальных серверов
Введение
Ваша задача – настроить Keepalived как балансировщик нагрузки с использованием NAT на одном сервере, но столкнулись с вопросом, связанным с блокировкой возвратных пакетов от реальных серверов во время работы firewalld. Проблема заключается в том, что при включенном firewalld пакеты, возвращающиеся от реальных серверов на интерфейс клиента, блокируются правилом STATE_INVALID_DROP.
Обзор конфигурации
Из предоставленной вами информации известно, что у вас есть два сетевых интерфейса: enp2s0
(зона клиентов) и enp3s0
(зона серверов), причем обе зоны имеют установленную стратегию DROP. Ваша конфигурация Keepalived выглядит следующим образом:
virtual_server 172.20.241.20 80 {
lb_algo wrr
lb_kind NAT
protocol TCP
persistence_timeout 600
persistence_granularity 255.255.255.0
real_server 10.0.1.5 {
weight 1
}
real_server 10.0.1.6 {
weight 2
}
real_server 10.0.1.7 {
weight 3
}
}
Ваши политики также определены таким образом, что трафик, поступающий из зоны клиентов в зону серверов, и обратно не разрешается, так как у обоих установлено целевое значение DROP.
Решение проблемы
Чтобы решить проблему с блокировкой возвратных пакетов, необходимо выполнить несколько действий:
-
Изменение политики firewalld:
Вместо того чтобы использовать правила DROP для зон, вас следует настроить разрешение для возвратного трафика. Мы можем изменить настройки таким образом, чтобы они разрешали возвращение пакетов, сформированных в ходе соединения.Пример команды для добавления необходимых правил:
sudo firewall-cmd --zone=clients --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" accept' sudo firewall-cmd --zone=servers --add-rich-rule='rule family="ipv4" source address="172.20.241.20" accept'
-
Проверка и изменение State Tracking:
Убедитесь в том, что firewalld правильно отслеживает состояние соединений. В некоторых случаях, если вы настроили неправильные правила, это может привести к блокировке допустимого трафика. -
Настройка NAT:
Убедитесь, что NAT для интерфейсаenp3s0
правильно настроен и что вы используетеmasquerade
в зоне серверов:sudo firewall-cmd --zone=servers --set-target=ACCEPT --permanent sudo firewall-cmd --zone=servers --add-masquerade --permanent
-
Перезагрузка firewalld:
После внесения изменений в конфигурацию firewalld, не забудьте перезагрузить службу:sudo firewall-cmd --reload
Заключение
Следуя вышеописанным шагам, вы сможете разрешить возвратные пакеты, которые блокируются firewalld, благодаря корректной конфигурации NAT и наличию правил, позволяющих установление соединений между зонами.
Теперь вы сможете использовать Keepalived с firewalld для балансировки нагрузки, не испытывая проблем с сертификацией и блокировкой пакетов. Обязательно протестируйте свою конфигурацию после всех изменений, чтобы убедиться в правильности работы системы.