Eu tenho um servidor que está agregando logs de vários outros servidores. Ele funciona muito bem, no entanto, de tempos em tempos (logo após a reinicialização, mas não todas as reinicializações), ele decide que várias "conexões" UDP estão em algum estado estranho e rejeitam pacotes de entrada.
A coisa é, isso não faz sentido, porque não há "conexões" quando se lida com o UDP!
Veja um exemplo do que aparece nos meus logs do firewall:
Shorewall:loc2fw:REJECT:IN=eth0 OUT= MAC=/*snip*/ SRC=10.x.x.4 DST=10.y.y.14 LEN=159 TOS=0x00 PREC=0x00 TTL=254 ID=37407 PROTO=UDP SPT=514 DPT=514 LEN=139
Depois de executar o comando sudo conntrack -D -p udp
para limpar todas as "conexões" UDP da conntrack, aqui está um log mostrando uma mensagem recebida do mesmo host:
Shorewall:loc_dnat:REDIRECT:IN=eth0 OUT= MAC=/*snip*/ SRC=10.x.x.4 DST=10.y.y.14 LEN=201 TOS=0x00 PREC=0x00 TTL=254 ID=50542 PROTO=UDP SPT=514 DPT=514 LEN=181
E aqui está o que aparece em conntrack para este host antes de executar o comando -D
:
udp 17 29 src=10.x.x.4 dst=10.y.y.14 sport=514 dport=514 [UNREPLIED] src=10.y.y.14 dst=10.x.x.4 sport=514 dport=514 mark=0 use=1
Aqui estão os bits relevantes da minha configuração Shorewall para esta porta:
#ACTION SOURCE DEST PROTO DPT
SECTION NEW
REDIRECT:info loc 5000 tcp,udp 514
ACCEPT:info loc $FW tcp,udp 5000
E por questões de integridade, aqui está a cadeia resultante no iptables (isto é, depois que o comando conntrack -D -p udp
foi executado e o firewall estava aceitando os pacotes por um tempo):
Chain loc2fw (1 references)
pkts bytes target prot opt in out source destination
16328 1648K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6428 386K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 /* Ping */
1 64 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 /* SSH */
18 1080 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 /* HTTP */
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000 ctorigdstport 514
12M 6677M ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5000 ctorigdstport 514
0 0 ~log0 tcp -- * * 0.0.0.0/0 0.0.0.0/0 [goto] tcp dpt:5000
0 0 ~log0 udp -- * * 0.0.0.0/0 0.0.0.0/0 [goto] udp dpt:5000
52 3088 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9200
126M 32G Reject all -- * * 0.0.0.0/0 0.0.0.0/0
126M 32G LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "Shorewall:loc2fw:REJECT:"
126M 32G reject all -- * * 0.0.0.0/0 0.0.0.0/0 [goto]
Como você pode ver, estou usando uma regra REDIRECT para aceitar as conexões que chegam na porta 514 e enviá-las para a porta 5000, onde meu agregador de logs escuta (foi mais fácil fazer isso no firewall do que saltar pela porta). aros para permitir que um usuário não privilegiado abra uma porta privilegiada).
Não consigo entender por que as "conexões" do UDP parecem entrar nesse estado estranho onde são rejeitadas pela política padrão. Digo isso porque eles aparecem claramente em conntrack, e excluí-los parece "redefinir" tudo e deixar as mensagens fluírem para meu agregador de registros novamente. Neste ponto, a única alternativa que vejo é configurar o cron para executar o comando conntrack
logo após a reinicialização, mas eu prefiro entender por que isso está acontecendo e corrigir a causa em vez de apenas implementar isso solução alternativa.