Keepalived NAT с firewalld: STATE_INVALID_DROP блокирует ответные пакеты от реальных серверов

Вопрос или проблема

Я настроил 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.

Решение проблемы

Чтобы решить проблему с блокировкой возвратных пакетов, необходимо выполнить несколько действий:

  1. Изменение политики 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'
  2. Проверка и изменение State Tracking:
    Убедитесь в том, что firewalld правильно отслеживает состояние соединений. В некоторых случаях, если вы настроили неправильные правила, это может привести к блокировке допустимого трафика.

  3. Настройка NAT:
    Убедитесь, что NAT для интерфейса enp3s0 правильно настроен и что вы используете masquerade в зоне серверов:

    sudo firewall-cmd --zone=servers --set-target=ACCEPT --permanent
    sudo firewall-cmd --zone=servers --add-masquerade --permanent
  4. Перезагрузка firewalld:
    После внесения изменений в конфигурацию firewalld, не забудьте перезагрузить службу:

    sudo firewall-cmd --reload

Заключение

Следуя вышеописанным шагам, вы сможете разрешить возвратные пакеты, которые блокируются firewalld, благодаря корректной конфигурации NAT и наличию правил, позволяющих установление соединений между зонами.

Теперь вы сможете использовать Keepalived с firewalld для балансировки нагрузки, не испытывая проблем с сертификацией и блокировкой пакетов. Обязательно протестируйте свою конфигурацию после всех изменений, чтобы убедиться в правильности работы системы.

Оцените материал
Добавить комментарий

Капча загружается...