2. Recorrido de un paquete en Netfilter
Input
Chain
Rout
e
FORWAR
D
Chain
Output
Chain
DROP
DROP
Local
Process
es
DROP
2
3. Cadenas de filtrado y tablas
iptables opera sobre el concepto de tablas
separadas para distintas funcionalidades de
procesamiento de paquetes:
Tabla filter
Tabla nat
Tabla mangle
Por defecto, se opera sobre la tabla filter
3
4. Tabla filter
Tabla por defecto
Permite (para tanto INPUT, OUTPUT y FORWARD
como para otra que quisiéramos definir):
Operaciones sobre los paquetes:
Aceptar: ACCEPT
Descartar: DROP
Rechazarlo: REJECT
Log: LOG y ULOG
Otras: CLASSIFY, CONNMARK, TRACE, BALANCE Y CLUSTERIP
Selecciona paquetes basándose en cualquier campo, en la
longitud del paquete, en el instante de recepción, en el número
de orden, en la tasa de llegada…
4
5. Tabla nat
Para funcionalidad de NAT.
Permite las siguientes acciones:
Source NAT: SNAT
Destination NAT: DNAT
MASQUERADE: (SNAT con IP dinámica)
REDIRECT: caso especial de DNAT que redirige el
paquete al equipo local con independencia de la IP
destino.
Ej. Proxy transparente
5
6. NAT con iptables
iptables permite NAT fuente, destino y de puerto.
Podemos modificar la dirección y puerto tanto fuente
como destino.
Tiene 3 cadenas predefinidas:
PREROUTING: especifica cambios en el destino de los
paquetes entrantes antes de que sean enrutados (DNAT)
OUTPUT: permite especificar cambios a los paquetes
generados localmente antes de que se les aplique la
decisión de encaminamiento (DNAT, REDIRECT)
POSTROUTING: especifica cambios en la dirección fuente
de los paquetes que se enruten, después de que hayan sido
enrutados (SNAT, MASQUERADE)
6
7. Recorrido de un paquete en Netfilter: NAT
Input
Chain
Rout
e
Forward
Chain
Output
Chain
Drop
DROP
Local
Process
es
Drop
Source
NAT Post-
routing
Destinatio
n NAT
Prerouting
7
8. Tabla mangle
La tabla mangle permite “marcar” los paquetes así
como cambiar los paquetes antes de enviarlos al
destino
Uso: QoS usando Linux (wondershaper)
Cinco cadenas:
PREROUTING
INPUT: después de PREROUTING
POSTROUTING
FORWARD
OUTPUT
8
9. Manejo básico de Iptables
Con iptables manipularemos las tablas anteriores
que especifican procesado de paquetes sobre
alguna de las cadenas que hemos visto
filter: INPUT, OUTPUT, FORWARD
nat: PREROUTING (DNAT, REDIRECT), OUTPUT
(DNAT/REDIRECT), POSTROUTING
(SNAT/MASQUERADE)
mangle: PREROUTING, INPUT, FORWARD,
POSTROUTING, OUTPUT
9
10. Manejo básico de iptables
Se opera sobre una tabla de una de las cadenas
Siempre hay que especificar la cadena
Si no se especifica la tabla se asume que se modifica
filter
Operaciones sobre cadenas enteras:
Acción por defecto:
iptables -P cadena accion
iptables –P INPUT DROP
Borrar las reglas:
iptables –F cadena
Listar las reglas:
iptables –L [cadena]
Resetear contadores de cadena:
iptables –Z [cadena]
10
12. Reglas en iptables
Hay que especificar:
Paquetes a los que se aplica la regla
Acción que se ejecutará (-j)
ACCEPT y DROP son las básicas
Se puede filtrar basándose en casi cualquier cosa:
Interfaz de entrada (-i)
Interfaz de salida (-o)
Protocolo: tcp, udp, icmp (-p)
IP origen (-s) o destino (-d)
12
13. Reglas en iptables
Hay posibilidades adicionales de filtrado:
Si usamos –p tcp:
Puertos origen (--sport) y destino (--dport) (también
válida para –p udp)
Flags (--tcp-flags)
SYN flag (-syn)
Si usamos –p icmp:
Tipo: --icmp-type
Lista de puertos (-m multiport):
Puertos fuente:
-m multiport --source-port 1024,1025,1026
Puertos destino
13
14. Reglas en iptables: estado
Es el módulo más interesante
Se habilita en una regla empleando –m state
Estados soportados:
NEW: Segmento TCP con SYN activo o primer paquete
UDP
ESTABLISHED: comunicación en curso. Permite
también enviar respuestas a los pings que recibimos sin
habilitar estas respuestas explícitamente.
RELATED:
INVALID: situaciones raras
14
15. Construir un firewall
Vamos a ver cómo construir un firewall basado en
iptables paso a paso
Crearemos un script de shell que contendrá las
reglas
El script será parametrizable para facilitar su
modificación, lectura y comprensión
IPT=“/sbin/iptables”
INTERNET=“eth0”
PRIVPORTS=“0:1023”
UNPRIVPORTS=“1024:65535”
15
16. Paso 2: Habilitar protecciones del kernel
Ignoramos ping a broadcast
Deshabilitamos encaminamiento de fuente
Habilitamos SYN Cookies para detectar y
recuperarnos de un ataque de SYN flood
Deshabilitamos el ICMP redirect
Habilitamos rp_filter
Registramos paquetes recibidos con direcciones
raras
16
18. Paso 4: Habilitamos la interfaz lo
Todo el tráfico de la interfaz de loopback debe estar
habilitado para que el equipo funcione:
iptables –A INPUT –i lo –j ACCEPT
iptables –A OUTPUT –o lo –j ACCEPT
18
19. Paso 5: Definimos la política por defecto
La política por defecto debería ser DROP. La
establecemos para todas las tablas:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING DROP
iptables -t nat -P OUTPUT DROP
iptables -t nat -P POSTROUTING DROP
iptables -t mangle -P PREROUTING
DROP
iptables -t mangle -P PREROUTING
DROP
iptables -t mangle -P OUTPUT DROP
19
20. Paso 6: Comprobamos flags
Realizamos una serie de comprobaciones de combinaciones raras de flags TCP
para evitar escaneos:
iptables –A INPUT –m unclean DROP
iptables –A INPUT –p tcp –tcp-flags ALL NONE –j DROP
iptables –A INPUT –p tcp –tcp-flags SYN, FIN SYN,FIN
–j DROP
iptables –A INPUT –p tcp –tcp-flags SYN,RST SYN,RST –
j DROP
iptables –A INPUT –p tcp –tcp-flags SYN,RST SYN,RST –
j DROP
iptables –A INPUT –p tcp –tcp-flags FIN,RST FInN,RST
–j DROP
iptables –A INPUT –p tcp –tcp-flags ACK,FIN FIN –j
DROP
iptables –A INPUT –p tcp –tcp-flags ACK,PSH PSH –j
DROP
iptables –A INPUT –p tcp –tcp-flags ACK,URG URG –j
DROP
20
21. Paso 7: Permitimos las conexiones establecidas y relacionadas
iptables –A INPUT -m state --state
ESTABLISHED, RELATED -j ACCEPT
iptables –A OUTPUT -m state --state
ESTABLISHED, RELATED --j ACCEPT
21
22. Paso 8:Rechazamos las direcciones “extrañas”
Rechazamos los paquetes entrantes por una interfaz
provenientes de otra interfaz de la máquina y las
direcciones privadas
Rechazamos los ping a direcciones de broadcast
(dirección de la red y dirección de broadcast de la red)
Rechazamos paquetes con direcciones de multicast
(clase D) que no vaya sobre UDP
Rechazamos las direcciones definidas como
reservadas por el IANA
0.*.*.*, 169.254.0.0/16, 192.0.2.0/24
22
23. Paso 9: Impedimos las conexiones a puertos no privilegiados
X Windows
iptables –A OUTPUT –o $INTERNET –p tcp –
syn –destination-port $XWINDOW_PORTS –j
REJECT
NFS, OpenWindows, SOCKS o SQUID:
iptables –A OUTPUT –o $INTERNET –p tcp –
m multiport –destination-port
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT
–syn –j REJECT
iptables –A INPUT –i $INTERNET –p tcp –m
multiport –destination-port
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT
–syn –j REJECT
Para UDP debería considerar NFS y RPC lock (4045)
23
24. Paso 10: Habilitamos los servicios que necesitemos
Empezando por DNS
Todo se simplifica mucho si usamos el módulo state
Ejemplo DNS:
iptables -A OUTPUT –o $INTERNET –p
udp –s $IP –sport $UNPRIVPORTS –d
$NAMESERVER –dport 53 –m state –
state NEW –j ACCEPT
iptables -A OUTPUT –o $INTERNET –p
tcp –s $IP –sport $UNPRIVPORTS –d
$NAMESERVER –dport 53 –m state –
state NEW –j ACCEPT
24
25. Ejemplo: FTP
Cliente FTP: (requiere cargar el módulo del kernel
ip_conntrack_ftp):
iptables –A OUTPUT -o $INTERNET –p
tcp –s $IP –sport $UNPRIVPORTS –
dport 21 –m state NEW -j ACCEPT
Modo activo:
iptables –A INPUT –i $INTERNET –p tcp –
sport 20 –d $IP –dport UNPRIVPORTS –m
state –state ESTABLISHED,RELATED –j
ACCEPT
Modo pasivo:
iptables –A OUTPUT –o $INTERNET –p tcp –s
$IP –sport 1024: $UNPRIVPORTS –dport
1024: -m state --state RELATED –j ACCEPT
25