É melhor definir -j REJECT ou -j DROP no iptables?

33

Há um exemplo de regras do iptables no wiki do archlinux:

# Generated by iptables-save v1.4.18 on Sun Mar 17 14:21:12 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Sun Mar 17 14:21:12 2013

Alguns dias atrás, meu amigo me perguntou por que há REJECTnas três últimas regras. Ele me disse que deveria haver DROP, e mencionou algo sobre melhor segurança no caso de DROP.

Então, eu tenho duas perguntas:

  1. O que as três regras fazem?

  2. Faz alguma diferença quando eu coloco lá DROPno lugar REJECT --reject-with? Se sim, qual a diferença?

Mikhail Morfikov
fonte

Respostas:

33

O que as três regras fazem?

Essas três regras parecem bastante auto-explicativas:

  1. Rejeitar pacotes UDP recebidos com uma mensagem ICMP "porta inacessível"
  2. Rejeitar pacotes TCP recebidos com "tcp reset"
  3. Rejeitar pacotes recebidos (de qualquer outro protocolo) com a mensagem ICMP "protocolo inacessível"

Se você está procurando mais detalhes (sobre pacotes UDP / TCP, ICMP), precisa pesquisar em documentos de rede e talvez man iptablestambém.

Faz alguma diferença quando eu coloco a DROP no lugar REJECT --reject-with? Se sim, alguém poderia me explicar a diferença, eu realmente aprecio isso.

Faz diferença. E, ao contrário da crença popular, DROPnão oferece melhor segurança do que REJECT. Incomoda usuários legítimos e, efetivamente, não oferece proteção contra usuários mal-intencionados. Este post explica o raciocínio em detalhes:

http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject

Um motivo comum para usar o DROP em vez de REJECT é evitar fornecer informações sobre quais portas estão abertas; no entanto, descartar pacotes fornece exatamente tanta informação quanto a rejeição.

Com REJECT, você faz sua verificação e categoriza os resultados em "conexão estabelecida" e "conexão rejeitada".

Com o DROP, você categoriza os resultados em "conexão estabelecida" e "conexão expirada".

O scanner mais trivial usará a chamada "conectar" do sistema operacional e aguardará até que uma tentativa de conexão seja concluída antes de iniciar a próxima. Esse tipo de scanner será consideravelmente mais lento ao soltar pacotes. No entanto, se o ataque definir um tempo limite de 5 segundos por tentativa de conexão, é possível verificar todas as portas reservadas (1..1023) em uma máquina em apenas 1,5 horas. As verificações são sempre automatizadas e o invasor não se importa com o resultado não imediato.

Um scanner mais sofisticado enviará pacotes em si, em vez de depender da implementação TCP do sistema operacional. Esses scanners são rápidos, eficientes e indiferentes à escolha de REJECT ou DROP.

CONCLUSÃO

O DROP não oferece barreira efetiva às forças hostis, mas pode diminuir drasticamente os aplicativos executados por usuários legítimos. DROP normalmente não deve ser usado.

Pare o dano contínuo a Monica
fonte
@janos - você poderia escrever um pouco mais sobre o que realmente acontece quando um pacote atinge cada uma das três regras?
Mikhail Morfikov
3
@ Kiwy - Leia o link e tente você mesmo. O DROP não oferece melhor segurança que o REJECT. Incomoda usuários legítimos e, efetivamente, não oferece proteção contra usuários mal-intencionados. Isso ocorre porque os usuários legítimos sofrem com uma conexão lenta enquanto aguardam o tempo limite da conexão e os crackers simplesmente configuram suas ferramentas para não esperar um tempo limite. o fato de a conexão estar lenta (devido à espera por um tempo limite) mostra que o servidor está lá e é protegido por firewall.
Pantera
2
Eu não vou com essa conclusão. Rejeitar gera uma resposta ICMP que pode ser analisada. Com base nessa análise, bons mecanismos de ataque podem derivar o SO que está sendo usado. Portanto, em um sistema em que todas as portas são conhecidas, o drop pode ser melhor. Isso se aplica aos servidores em um ambiente de produção.
Nils
1
Um firewall que encaminha apenas determinadas portas é ainda melhor. DROP e REJECT não são o mesmo que absolutamente nenhum serviço executando o primeiro lugar. Muitos scanners de portas marcam seu host como um alvo em potencial para futuras verificações, na esperança de desativar o firewall se encontrar REJECTS ou DROPS lá, pois ambos podem ser detectados externamente. chiark.greenend.org.uk/~peterb/network/drop-vs-reject
Dagelf
1
Observe que o texto citado possui mais um parágrafo, uma atualização, que diz que DROP é melhor se você tiver um ataque DDoS, o que é relativamente raro, mas quando isso acontece, provavelmente é bom tê-lo ... o que você acha?
Alexis Wilke