AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1168619
Accepted
Bartosz Podemski
Bartosz Podemski
Asked: 2024-12-07 20:52:54 +0800 CST2024-12-07 20:52:54 +0800 CST 2024-12-07 20:52:54 +0800 CST

Keepalived NAT com firewalld: STATE_INVALID_DROP bloqueando pacotes de retorno de servidores reais

  • 772

Configurei o Keepalived como um balanceador de carga, mas não estou usando uma configuração Mestre/Standby, apenas um único servidor.

O problema surge quando o firewalld está habilitado. Sem o firewalld, tudo funciona bem. No entanto, quando o firewalld está em execução, os pacotes que retornam do servidor real são bloqueados com a regra STATE_INVALID_DROP.

A configuração envolve duas interfaces: enp2s0 (zona de clientes) e enp3s0 (zona de servidores). O tráfego fluindo de enp2s0 para enp3s0 funciona corretamente, mas o problema ocorre com o tráfego retornando de enp3s0 para enp2s0.

Curiosamente, se eu usar apenas firewalld com uma rota configurada para alcançar o servidor real e remover Keepalived, o tráfego flui sem problemas. O problema só aparece quando firewalld e Keepalived estão em uso juntos.

Esta é a minha configuração de zonas:

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:

E esta é minha configuração política:

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:

E esta é minha configuração keepalived:

router1@router1:~$ sudo cat /etc/keepalived/keepalived.conf
! Configuration File for 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
        }
}

Tentei adicionar portas de encaminhamento à zona do cliente assim:

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

Mas esta configuração encaminha todas as solicitações para 10.0.1.5 porque é a primeira regra que foi adicionada

linux
  • 1 1 respostas
  • 69 Views

1 respostas

  • Voted
  1. Best Answer
    Matthew Ife
    2024-12-08T16:09:50+08:002024-12-08T16:09:50+08:00

    Isso ocorre devido ao modo como o keepalived funciona no modo NAT.

    Ao usar NAT no keepalived, você está contando com regras do netfilter (iptables) para manipular os pacotes e fazer o balanceamento de carga (isso é efetivamente balanceamento de carga da camada 4).

    O FirewallD também dita a política de tráfego usando netfilter (iptables) para bloquear partes específicas do tráfego.

    Minha aposta é que ou o FirewallD destrói a configuração do netfilter keepalived ou vice-versa, ou a ordem e a prioridade das regras do netfilter tanto no keepalived quanto no FirewallD se somam de uma maneira que não faz sentido.

    Em qualquer caso, sua solução mais pragmática aqui é não usar o FirewallD e criar diretamente quaisquer políticas de filtragem de rede usando nftou iptablesdiretamente com um conjunto de regras que não interfira no keepalived.

    Ou use um software balanceador de carga que apenas recria as conexões no próprio sistema, como o haproxy.

    Eu também gostaria de ressaltar que os antigos módulos de balanceamento de carga do servidor virtual usados ​​para keepalived (aquela ipvsadmcoisa) não são compatíveis com o netfilter moderno ( nftbaseado), pelo menos da última vez que tentei.

    Acabei relegando keepalivedna minha mente como uma boa implementação de VRRP (failover), mas uma solução de balanceamento de carga ruim.

    Uma configuração comum é usar keepalived para failover e haproxy para balanceamento de carga. Essa configuração permite que você tenha seu bolo e ele também, deve haver bastante material online sobre como fazer isso manualmente, até mesmo imagens docker e outras opções de refeições prontas pré-assadas se você estiver com pressa.

    • 0

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve