Por que o firewall parece funcionar de forma intermitente?

Por que o firewall parece funcionar de forma intermitente?

Eu tenho essas regras de iptables no primeiro servidor que tem a função de um cliente conectando-se a um segundo servidor mysql através do adaptador LAN.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT

O que está acontecendo é que assim que eu fizer isso:

service iptables restart

parece que todas as conexões MYSQL com um segundo servidor funcionam corretamente, mas apenas por um pequeno período de tempo, geralmente de 1 a 2 minutos, mas nesses 1 a 2 minutos as conexões com o nginx (servidor web, porta 80) não funcionam. Após 1-2 minutos, acontece que o servidor web funciona e o MYSQL não funciona. Tentei o comando iptables-save também até agora, mas nada mudou.

Esta é a configuração do firewall do segundo servidor mysql:

    *filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Responder1

Você deve definir a política padrão para DROPo caso de sua última regra abrangente ser removida acidentalmente; assim :

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]

Agora, no segundo servidor.

-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Esta regra casa conexões cujo destino é 192.168.1.1, porta de origem de 1024 a 65535, porta de destino 3306 e estado novo ou estabelecido. Você está pensando demais nisso; se você quiser permitir conexões MySQL, basta combinar a porta de destino e, opcionalmente, adicionar um parâmetro de origem e/ou interface se quiser bloqueá-lo para um IP ou interface de origem específico.

-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT

lojá tem acesso porque sua primeira -A INPUT -i lo -j ACCEPTregra corresponderá a qualquer coisa vinda do loopback.

-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Ok, agora você está permitindo toda a sub-rede, mas isso já está melhor e deve funcionar.

-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT

Assim como acima, o loopback já é permitido de qualquer maneira.

-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT

Agora você está permitindo tudo que vem da eth1 com uma porta de destino 3306.

-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

Sua política OUTPUT é ACCEPT tudo de qualquer maneira, essas regras são inúteis.

Tenho certeza de que seu problema é porque omódulo de estado foi descontinuadoe possivelmente removido, então você deve usar o conntrack.

Recapitulando:

Primeiro servidor:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT

Segundo servidor:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT

Isso permitirá todas as conexões SSH e MySQL originadas de eth1, 192.168.1.0/24. Sinta-se à vontade para mudar isso.

informação relacionada