Allied Modders en español

Versión completa: Netfilter/iptables (CentOS)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
No encontré donde colocarlo así que pienso que esta es la sección correcta, que algún moderador o admin lo mueva de no ser asi, en fin. En esta ocasión vengo a compartirles este tutorial de como manejar iptables, que sirve para mitigar uno que otros métodos de ataque (Ddos) mas que todo para aquellos que tienen vps/dedicado y sufren esos percances Roflmao

Iptables es un firewall incluido en el kernel de los servidores Linux. Su funcionamiento se basa en aplicar reglas que el mismo firewall ejecute.

El uso de IPtables puede resultar algo complejo, por lo que a continuación vamos a echar un vistazo general sobre sus opciones:

Para Iniciar/Parar/Reiniciar Iptables debemos ejecutar estos comandos:
Código PHP:
sudo service iptables start
sudo service iptables stop
sudo service iptables restart 

Los principales comandos de IPtables son los siguientes (argumentos de una orden):
Código PHP:
-A –append → agrega una regla a una cadena.
-
D –delete → borra una regla de una cadena especificada.
-
R –replace → reemplaza una regla.
-
I –insert → inserta una regla en lugar de una cadena.
-
L –list → muestra las reglas que le pasamos como argumento.
-
F –flush → borra todas las reglas de una cadena.
-
Z –zero → pone a cero todos los contadores de una cadena.
-
N –new-chain → permite al usuario crear su propia cadena.
-
X –delete-chain → borra la cadena especificada.
-
P –policy → explica al kernel qué hacer con los paquetes que no coincidan con ninguna regla.
-
E –rename-chain → cambia el orden de una cadena

Condiciones principales para Iptables:
Código PHP:
-p –protocol → la regla se aplica a un protocolo.
-
s –src –source → la regla se aplica a una IP de origen.
-
d –dst –destination → la regla se aplica a una Ip de destino.
-
i –in-interface → la regla de aplica a una interfaz de origencomo eth0.
-
o –out-interface → la regla se aplica a una interfaz de destino.
−m -match −−match → define que se aplica la regla si hay una coincidencia específica

Condiciones TCP/UDP

Código PHP:
-sport –source-port → selecciona o excluye puertos de un determinado puerto de origen.
-
dport –destination-port → selecciona o excluye puertos de un determinado puerto de destino

Existen muchas mas condiciones para una configuración avanzada del firewall, pero las elementales ya las tenemos listadas.

Configurar reglas por defecto

La configuración por defecto de un firewall debería ser, traducido al español, “bloquear todo excepto [reglas]“. Para configurar el firewall para que bloquee todas las conexiones debemos teclear:

Código PHP:
iptables -P INPUT DROP
iptables 
-P FORWARD DROP
iptables 
-P OUTPUT DROP 

Con esto nos quedaremos sin internet, por lo que a continuación debemos empezar a crear reglas permisivas.

Para aplicar una regla que filtre un determinado puerto, debemos ejecutar:
Código PHP:
iptables -A INPUT -p tcp –sport 22 22 → crea una regla para el puerto de origen tcp 2222 

Para bloquear el tráfico procedente de una determinada IP, debemos ejecutar:
Código PHP:
iptables -A INPUT -p tcp -m iprange –src-range 192.168.1.13-192.168.2.19 (ejemplo de IP

También podriamos bloquear por MAC con la condición –mac-source.
Código PHP:
iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01 

Una vez ejecutadas las reglas que queramos aplicar, debemos guardarlas tecleando sudo service iptables save

Ver el estado del firewall:
Código PHP:
iptables ---

El parámetro L muestra las líneas abiertas. V permite recibir más información sobre las conexiones y N nos devuelve las direcciones IP y sus correspondientes puertos sin pasar por un servidor DNS.

Eliminar las reglas existentes

Para borrar toda la configuración del firewall para volver a configurarlo de nuevo debemos teclear:
Código PHP:
iptables -

Permitir conexiones entrantes

Teclearemos los siguientes parámetros:

Código PHP:
iptables -A INPUT -[interface] -[protocolo–dport [puerto] -m state –state NEW,ESTABLISHED -j ACCEPT 

-i: debemos configurar la interfaz, por ejemplo, eth0. Esto es útil en caso de tener varias tarjetas de red, si tenemos sólo una, no tenemos por qué especificar este parámetro.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–dport: el puerto que queremos permitir, por ejemplo, en caso de HTTP sería el 80.

state –state: verifica estados de conexión: (INVALID, ESTABLISHED, NEW, RELATED).

Código:
#NEW
NEW o en español (NUEVO) se refiere a los paquetes entrantes, está creando una nueva conexión o bien forma parte de una.

#ESTABLISHED
Una conexión ESTABLISHED en español (ESTABLECIDA) es una conexión que el firewall conoce y rastrea. El estado ESTABLISHED ha visto el tráfico en ambas direcciones y, luego, combinará continuamente esos paquetes. El único requisito para entrar en un estado ESTABLISHED es que un host envía un paquete y luego recibe una respuesta del otro host. Los mensajes de respuesta de ICMP también se pueden considerar como ESTABLISHED.

#RELATED
Una conexión se considera RELATED en español (RELACIONADA) cuando está relacionada con otra conexión ya ESTABLISHED. Para que una conexión se considere como RELATED, primero debemos tener una conexión que se considera ESTABLISHED. La conexión ESTABLISHED generará una conexión fuera de la conexión principal. La conexión recién generada se considerará RELATED, si el módulo conntrack puede entender que está RELATED. Un ejemplo son las conexiones de datos FTP que se consideran RELATED con el puerto de control de FTP.

La mayoría de los protocolos TCP y algunos protocolos UDP que dependen de este mecanismo son bastante complejos y envían información de conexión dentro de la carga útil de los segmentos de datos TCP o UDP, y por lo tanto requieren módulos auxiliares especiales para ser entendidos correctamente.

#INVALID
significa que el paquete no puede identificarse o que no tiene ningun estado. Esto puede deberse a varias razones, como el sistema que se queda sin memoria o mensajes de error ICMP que no responden a ninguna conexión conocida.

Estos estados de conexión se pueden utilizar en combinación con otros separandolos mediante comas como en -m state --state INVALID, NEW.

Un ejemplo para permitir las conexiones entrantes desde páginas web:
Código PHP:
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT 

Permitir las conexiones salientes
Código PHP:
iptables -A OUTPUT -[interfaz] -[protocolo–sport [puerto] -m state –state ESTABLISHED -j ACCEPT 

-o: debemos configurar la interfaz, por ejemplo, eth0, al igual que en el caso anterior.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–sport: el puerto que queremos permitir, por ejemplo, en caso de HTTPS sería el 443.

state –state: verifica estados de conexión: (INVALID, ESTABLISHED, NEW, RELATED).

Un ejemplo para permitir el tráfico saliente hacia páginas web:
Código PHP:
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT 

Permitir los paquetes ICMP

Por defecto, el ping está deshabilitado. Debemos habilitarlo manualmente añadiendo las correspondientes entradas en iptables. Para ello teclearemos:

Para poder hacer ping a otros servidores:

Código PHP:
iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT 

Para permitir recibir solicitudes de ping de otros equipos:
Código PHP:
iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT 

Permitir que el tráfico interno salga a internet

En el caso de tener 2 tarjetas de red (eth0 en local y eth1 conectada a internet) podemos configurar el firewall para que reenvíe el tráfico de la red local a través de internet. Para ello escribiremos:
Código PHP:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT 

Bloquear y prevenir ataques DDoS

Código PHP:
iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/minute –limit-burst 100 -j ACCEPT 

Consultar los paquetes rechazados por iptables

Para saber los paquetes que iptables ha rechazado debemos teclear:
Código PHP:
iptables -N LOGGING 

Ejemplos prácticos

Cómo bloquear las conexiones entrantes por el puerto 1234:
Código PHP:
iptables -A INPUT -p tcp –dport 1234 -j DROP
iptables 
-A INPUT -i eth1 -p tcp –dport 80 -j DROP → bloquea en la interfaz eth1 

Bloquear una dirección IP:
Código PHP:
iptables -A INPUT -s 192.168.0.0/24 -j DROP 

Bloquear una dirección IP de salida:
Código PHP:
iptables -A OUTPUT -d 75.126.153.206 -j DROP 

También podemos bloquear una url, por ejemplo, facebook:
Código PHP:
iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP 

Bloquear el tráfico desde una direccion MAC:
Código PHP:
iptables -A INPUT -m mac –mac-source 00:0F:EA:91:04:08 -j DROP 

Bloquear peticiones ping:
Código PHP:
iptables -A INPUT -p icmp –icmp-type echo-request -j DROP 


aqui algunas reglas, para bloquear ataques comunes como


Código PHP:
#block udp methode "TSource Query Flood"
iptables -I INPUT -p udp -m u32 --u32 "77&0xFFFF=0xfeff" -j DROP
iptables 
-I INPUT -p udp -m u32 --u32 "18&0xffff=0x0000" -j DROP

#block udp with a 0-byte payload
iptables -A INPUT -p udp -m u32 --u32 "22&0xFFFF=0x0008" -j DROP

#block all packets from ips ending in .255.255
iptables -A INPUT -m u32 --u32 "12&0xFFFF=0xFFFF" -j DROP

#block common Camfrog-specific attacks
iptables -A INPUT -m u32 --u32 "28&0x00000FF0=0xFEDFFFFF" -j DROP

#block udp containing "farewall"
iptables -A INPUT -m string --algo bm --from 28 --to 29 --string "farewell" -j DROP

#block udp starting with alternating spaces
iptables -A INPUT -p udp -m u32 --u32 "28 & 0x00FF00FF = 0x00200020 && 32 & 0x00FF00FF = 0x00200020 && 36 & 0x00FF00FF = 0x00200020 && 40 & 0x00FF00FF = 0x00200020" -j DROP

#block udp containing "SAMP"
iptables -I INPUT -p udp -m udp -m string --hex-string "|53414d50|" --algo kmp --from 28 --to 29 -j DROP

#block udp starting with "std" and 00s
iptables -I INPUT -p udp -m udp -m string --hex-string "|7374640000000000|" --algo kmp --from 28 --to 29 -j DROP

#block udp containing 16 null (00) chars
iptables -I INPUT -p udp -m udp -m string --hex-string "|00000000000000000000000000000000|" --algo kmp --from 32 --to 33 -j DROP

#block udp containing "AAAAAAAAAAAAAAAA"
iptables -A INPUT -p udp -m udp -m string --algo bm --from 32 --to 33 --string "AAAAAAAAAAAAAAAA" -j DROP

#block udp containing "0123456789ABCDE"
iptables -A INPUT -p udp -m udp -m string --algo bm --from 28 --to 29 --string "0123456789ABCDE" -j DROP

#block all packets from ips ending in .0.0
iptables -A INPUT -m u32 --u32 "12&0xFFFF=0" -j DROP

#block udp containing "0123456789"
iptables -A INPUT -p udp -m udp -m string --algo bm --from 44 --to 45 --string "0123456789" -j DROP

#block udp containing "q00000000000000"
iptables -A INPUT -m string --algo bm --from 32 --to 33 --string "q00000000000000" -j DROP
 
#block udp containing "statusResponse"
iptables -A INPUT -m string --algo bm --from 32 --to 33 --string "statusResponse" -j DROP
 
#block icmp
iptables -A INPUT -p icmp -j DROP
 
#block udp methode "CODE"
iptables -I INPUT -p udp -m udp -m string --hex-string "|ffffffff6765746368616c6c656e676520302022|" --algo kmp -j DROP
 
#block udp methode "SSDP"
iptables -I INPUT -p udp --dport 16000:29000 -m string --to 75 --algo bm --string 'HTTP/1.1 200 OK' -j DROP

#block udp methode "a2s_rules"
iptables -t raw -A PREROUTING -p udp --dport 27015 -m u32 --u32 "29=0xffffff56" -j DROP 

les recalco que no es 100% seguro escudarse, ya que siempre encontraran por donde joder, también dependerá en la capacidad que tenga la red/ancho de banda que les proporciona el host donde se encuentren, si esta es pobre y no cuentan con un buen firewall físico no aguantara mucho y posiblemente les terminen limitando y/o suspendiendo los servicios Trolleyes
que hace -m u32 --32

edit:

iptables -A OUTPUT -o [interfaz] -p [protocolo] –sport [puerto] -m state –state ESTABLISHED -j ACCEPT

-state o state no lo explicaste tampoco
(11/09/2018, 12:35 AM)OsweRRR escribió: [ -> ]que hace -m u32 --32

edit:

iptables -A OUTPUT -o [interfaz] -p [protocolo] –sport [puerto] -m state –state ESTABLISHED -j ACCEPT

-state o state no lo explicaste tampoco

-m u32 --32 colocan dolo de esa manera unknown option "--32" Roflmao

añadido Mario

state –state: verifica estados de conexión: (INVALID, ESTABLISHED, NEW, RELATED).

Código:
#NEW
NEW o en español (NUEVO) se refiere a los paquetes entrantes, está creando una nueva conexión o bien forma parte de una.

#ESTABLISHED
Una conexión ESTABLISHED en español (ESTABLECIDA) es una conexión que el firewall conoce y rastrea. El estado ESTABLISHED ha visto el tráfico en ambas direcciones y, luego, combinará continuamente esos paquetes. El único requisito para entrar en un estado ESTABLISHED es que un host envía un paquete y luego recibe una respuesta del otro host. Los mensajes de respuesta de ICMP también se pueden considerar como ESTABLISHED.

#RELATED
Una conexión se considera RELATED en español (RELACIONADA) cuando está relacionada con otra conexión ya ESTABLISHED. Para que una conexión se considere como RELATED, primero debemos tener una conexión que se considera ESTABLISHED. La conexión ESTABLISHED generará una conexión fuera de la conexión principal. La conexión recién generada se considerará RELATED, si el módulo conntrack puede entender que está RELATED. Un ejemplo son las conexiones de datos FTP que se consideran RELATED con el puerto de control de FTP.

La mayoría de los protocolos TCP y algunos protocolos UDP que dependen de este mecanismo son bastante complejos y envían información de conexión dentro de la carga útil de los segmentos de datos TCP o UDP, y por lo tanto requieren módulos auxiliares especiales para ser entendidos correctamente.

#INVALID
significa que el paquete no puede identificarse o que no tiene ningun estado. Esto puede deberse a varias razones, como el sistema que se queda sin memoria o mensajes de error ICMP que no responden a ninguna conexión conocida.