REJECT vs DROP cuando se usa iptables

Respuestas:

79

Como regla general, use RECHAZAR cuando desee que el otro extremo sepa que el puerto es inalcanzable 'use DROP para conexiones a hosts que no desea que la gente vea.

Por lo general, todas las reglas para las conexiones dentro de su LAN deben usar RECHAZAR. Para Internet, con la excepción de ident en ciertos servidores, las conexiones de Internet generalmente se CAÍEN.

El uso de DROP hace que la conexión parezca estar en una dirección IP desocupada. Los escáneres pueden optar por no continuar escaneando las direcciones que parecen desocupadas. Dado que NAT se puede utilizar para redirigir una conexión en el firewall, la existencia de un servicio bien conocido no necesariamente indica la existencia de un servidor en una dirección.

Ident se debe pasar o rechazar en cualquier dirección que proporcione el servicio SMTP. Sin embargo, el uso de búsquedas de Ident por parte de SMTP sirve ha caído en desuso. Existen protocolos de chat que también se basan en un servicio de identificación en funcionamiento.

EDITAR: cuando se utilizan reglas DROP: - Los paquetes UDP se descartarán y el comportamiento será el mismo que el de conectarse a un puerto no controlado sin servicio. - Los paquetes TCP devolverán un ACK / RST que es la misma respuesta con la que responderá un puerto abierto sin servicio. Algunos enrutadores responderán con ACK / RST en nombre de los servidores que están inactivos.

Cuando se utilizan las reglas REJECT, se envía un paquete ICMP que indica que el puerto no está disponible.

BillThor
fuente
55
Esto no es verdad. Incluso cuando la regla dice "DROP", el sistema seguirá respondiendo al paquete entrante con un TCP SYN / ACK como si estuviera abierto. Para descartar verdaderamente un paquete, el sistema debe responder con un TCP RST / ACK, para el cual no existe una regla de firewall. Como tal, la mejor configuración de firewall es aquella en la que solo se reenvían los puertos seleccionados. Su regla DROP anunciará su cortafuegos y los escáneres de puertos sabrán que está cortando un cortafuegos y lo seguirán golpeando con la esperanza de atraparlo.
Dagelf
2
Mi punto es que es detectable desde el exterior si está cortando o no cortafuegos debido al simple hecho de que su pila TCP se comporta de manera diferente cuando se deja caer, que cuando no tiene un servicio ejecutándose en primer lugar.
Dagelf
2
No altera el hecho de que hay botnets que aprovechan la diferencia y, como consecuencia, supervisan sus puertos.
Dagelf
1
Hagas lo que hagas, sé constante. Si el atacante elige un número de puerto no utilizado e intenta conectarse, debería obtener la misma respuesta que si hubiera elegido uno que está bloqueando a propósito. dar una respuesta diferente le dice que hay algo allí. por ejemplo, si puede usar un número de respuesta que dé una respuesta diferente para determinar qué servidor de base de datos está utilizando, puede adaptar la inyección de SQL a ese servidor ...
user313114
55
@Dagelf, ¿de dónde sacas la información de que DROP envía una respuesta? Es una gran noticia y va en contra de todo lo que he observado y me han dicho. ¿Tiene un enlace a la documentación que describe este comportamiento?
Score_Under
27

La diferencia es que el objetivo REJECT envía una respuesta de rechazo a la fuente, mientras que el objetivo DROP no envía nada.

Esto puede ser útil, por ejemplo, para el servicio de identificación. Si usa REJECT, entonces los clientes no necesitan esperar el tiempo de espera.

Más sobre esto: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html

Zizzencs
fuente
2
El objetivo DROP no envía nada. ¡Revise mi comentario sobre la respuesta aceptada e investigue el tema usted mismo si está interesado en los detalles!
Dagelf
8

Por lo general, desea ignorar las sondas de los atacantes a ciertos puertos, con lo que quiero decir que no desea devolver la "conexión rechazada". 'Conexión rechazada' significa: 'hay un servidor aquí', y posiblemente regala más información, mientras que dejar caer un paquete no da pistas sobre versiones de software, posibles vulnerabilidades o incluso el hecho de que un servidor está escuchando su IP.

Lo anterior es una de las principales razones para usar DROP en lugar de RECHAZAR.

wzzrd
fuente
66
Sin las reglas de iptables, un puerto cerrado por defecto es RECHAZAR. Si DROP cada puerto es una buena alternativa (su host aparece inactivo) pero si DROP solo puertos específicos, en realidad les está dando más información que RECHAZAR. Si alguien usa una sonda general como nmap, los puertos específicos que descartan paquetes aparecerán como "filtrados", lo que significa que saben que tiene un servicio allí que está ocultando.
Raptor007
7

Veo muchas respuestas conflictivas aquí y dado que este es el primer artículo en Google con las palabras clave correctas; Aquí está la explicación correcta.
Es simple:

DROP no hace nada en absoluto con el paquete. No se reenvía a un host, no se responde. La página de manual de IPtables dice que deja caer el paquete al suelo, es decir, no hace nada con el paquete.

RECHAZAR difiere de DROP en que envía un paquete de vuelta, pero la respuesta es como si un servidor estuviera ubicado en la IP, pero no tuviera el puerto en estado de escucha. IPtables enviará un RST / ACK en caso de TCP o con UDP un puerto de destino ICMP inalcanzable.

Ecko
fuente
2
+1 de mi parte, pero las respuestas realmente no están en desacuerdo. Todos están de acuerdo, por lo que puedo ver, excepto Dagelf, quién está equivocado.
MadHatter
Bien, aquí hay un pequeño truco para ti: haz un "nmap localhost". Ahora elija cualquier puerto que no esté "abierto" ... y agregue una regla que "no haga nada", por ejemplo: "iptables -I INPUT -p tcp --dport 888 -j DROP". Ahora "nmap localhost" nuevamente. ¿Que ves? ...
Dagelf
4

Si está tratando de ocultar la existencia de su máquina por completo, -j DROPes apropiado. Por ejemplo, puede usar esto para implementar una lista negra.

Si está tratando de ocultar el hecho de que un puerto está abierto, debe imitar el comportamiento que ocurriría si el puerto no estuviera abierto:

  • TCP: -p tcp -j REJECT --reject-with tcp-reset
  • UDP: -p udp -j REJECT --reject-with icmp-port-unreachable

Si un escáner de puertos ve que algunos puertos descartan paquetes mientras que la mayoría los rechaza, puede suponer que los paquetes descartados están en puertos abiertos pero ocultos.

Raptor007
fuente
¿Qué sucede si abre algunos puertos (es decir, 22, 25, 53, 80, 443) y luego DEJA TODO lo demás? Ahora, si tengo MySQL, PostgreSQL, SQLite o Cassandra ejecutándose ... el escáner no puede decirlo, ¿verdad?
Alexis Wilke
@AlexisWilke En ese caso, la única información adicional que le está dando al escáner de puertos es que tiene algún tipo de firewall implementado con una política DROP predeterminada.
Raptor007
0

A pesar de muchas respuestas correctas, solo mis dos centavos:

Aquí hay un breve PoC FW.IDS-DROP-vs-RECHAZAR de mí al tema con respecto a las reglas para el sistema de prohibición (firewall, IDS, etc.).

Dentro de poco:

  • DROP puede usarse para intrusos reincidentes, si se prohíbe todos los puertos (por lo que parece que el servidor está inactivo en el lado del intruso)
  • REJECT --reject-with tcp-reset es la mejor opción para la prohibición de múltiples puertos, ya que parece comportarse como un verdadero puerto cerrado
  • si algunos puertos están respondiendo (el intruso sabe que el host está vivo) DROPy REJECT(sin tcp-reset) le dará al intruso una "señal" de que hay algo bloqueando (para que pueda estimularlo a continuar el "ataque" con la esperanza de proporcionar los datos requeridos en algún momento)
sebres
fuente
-5

Sí, usar DROP no tiene sentido. Use RECHAZAR.

Incluso cuando la regla dice "DROP", el sistema aún responde a un SYN entrante con un TCP RST / ACK, que es el comportamiento predeterminado para los puertos sin servicios en ejecución. (tcpdump et al no registran esto).

Si se está ejecutando un servicio, el SYN se cumple con TCP SYN / ACK.

Debido a que el DROP no responde de manera normal con un TCP SYN / ACK, sino con un RST / ACK, su regla DROP anunciará su firewall y los escáneres de puertos sabrán que está cortando un firewall y podrían seguir martillándolo con la esperanza de atrapar tu firewall

Esto es ahora nmap puede informar "filtrado" en lugar de "cerrado", por ejemplo:

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http
1111/tcp filtered lmsocialserver

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -D INPUT 1

Como tal, la única configuración de firewall "invisible" es aquella en la que un dispositivo dedicado se ubica entre sus dispositivos y solo reenvía puertos selectivamente.

Si realmente quiere meterse con los escáneres básicos, puede TARCP conexiones tcp, que establece la ventana TCP en 0 para que no se puedan transferir datos después de abrir la conexión, ignorando las solicitudes para cerrar la conexión, lo que significa que el escáner tiene que esperar para que ocurra el tiempo de espera de la conexión, si quiere estar seguro. Pero es trivial para un atacante detectar esto y hacer que su tiempo de espera sea muy corto.

A fin de cuentas, probablemente sea mejor usar REJECT o colocar un dispositivo de reenvío de puertos dedicado entre su servidor e Internet.

O simplemente ejecutando servicios en sus máquinas con conexión a Internet que no requieren firewall.

En general, RECHAZAR es el mejor para los servidores web, ya que cualquier servicio que intente acceder a él (probablemente la mayoría de las veces, usted) obtendrá rápidamente una respuesta y los usuarios u otros servicios no se quedarán esperando preguntándose si hay una interrupción de la red.

Dagelf
fuente
55
Esta respuesta es incorrecta. Se puede mostrar fácilmente con tcpdump que la regla DROP hará que el sistema no envíe NINGUNA respuesta, como cabría esperar. Y su afirmación "Para descartar verdaderamente un paquete, el sistema necesita responder con un TCP RST / ACK" no tiene sentido ya que responder algo obviamente no es "descartar verdaderamente un paquete". Si realmente "sueltas" un paquete, simplemente no contestas y esto es demostrablemente el efecto de la regla DROP.
Juliane Holzt
3
¿Podría proporcionar una fuente para la acusación que DROPemitirá un SYN/ACK? Nunca vi esto en mis máquinas.
motobói
2
@Dagelf Su artículo dice "DROP (también conocido como DENY, BLACKHOLE) Prohíbe que pase un paquete. No envíe ninguna respuesta".
JeanT
No envía la respuesta normal, pero envía una como se explica, independientemente.
Dagelf
3
El documento al que se enlaza dice " DROP ... Enviar ninguna respuesta " y, por lo que puedo ver, no respalda su reclamo que DROPdevuelve a SYN/ACK. Yo tampoco he visto este comportamiento bajo ninguna versión de iptables. Si tiene una fuente que respalde su reclamo, sería más útil verla; ciertamente, los volcados de paquetes que acabo de hacer no respaldan su reclamo.
MadHatter