tablas de NAT

IPTables
Š Tablas:
„
Filter
z
„
NAT
z
„
INPUT, OUTPUT, FORWARD.
PREROUTING, OUTPUT, POSTROUTING.
Mangle
PREROUTING, OUTPUT (2.4.17).
z INPUT, FORWARD, POSTROUTING (2.4.18)
z
IPTables
Š Sintaxis
„
La sintaxis general (muy simplificada para
nuestro ejemplo es)
z
Iptables –t tabla comando cadena
definicion_regla –j target
z
Tabla puede ser nat, filter o mangle; comando puede
ser –A, -D, -L, -F, -I; cadena puede ser INPUT,
OUTPUT, FORWARD; target puede ser ACCEPT o
DROP.
IPTables
Hay tres cadenas principales:
INPUT la recorren los paquetes que entran en la máquina con destino
a la propia máquina
OUTPUT la recorren los que salen (procedentes de la propia máquina)
FORWARD la recorren los que atraviesan la máquina
El administrador puede añadir subcadenas a cualquier cadena. P.e.
MI CADENA.
Desde las cadenas principales se llama a las subcadenas
SI un paquete cumple cierta condición
ENTONCES hacer algo con el paquete:
- DROP. descartarlo allı́ mismo
- ACCEPT. permitirle que siga
- Enviarla a otra cadena (subcadena)
- ...
Si el paquete no cumple la condición, sigue avanzando por la cadena
Una vez recorrida una subcadena, el flujo vuelve a la cadena principal
desde donde fue llamada
Una vez recorrida una cadena principal, se aplica la polı́tica por defecto
de esa cadena: ACCEPT o DROP
IPTables
Camino de un datagrama por el núcleo
Soy una máquina con Linux. El tratamiendo de un datagrama depende de
si soy un router o no
¿Cómo se que si soy un router?
Consultando el valor de /proc/sys/net/ipv4/ip_forward
¿Cómo hacer que me convierta en router?
echo 1 > /proc/sys/net/ipv4/ip_forward
Esto no es persistente, suele incluirse en un script de arranque
Previamente debe haber tablas de encaminamiento, creadas a mano o
mediante algoritmos de encaminamiento
Decidir el encaminamiento: consultar mi tabla de encaminamiento y
averiguar por cuál de mis interfaces debo enviar el datagrama
Encaminar: enviar el datagrama por el interfaz adecuado
Soy una máquina conectada a la red. No tengo iptables
Recibo un datagrama
Si es para mı́, me lo quedo
Si no es para mı́
- Si soy un router, decido su encaminamiento y lo encamino
- Si no soy un router, tiro el paquete
Envı́o un datagrama
- Decido su encaminamiento y lo encamino
IPTables
Soy una máquina conectada a la red, tengo iptables
Recibo un datagrama
Si es para mı́,
- Lo envio a la cadena INPUT. Si la supera, me lo quedo
Si no es para mı́
- Si soy un router, decido su encaminamiento, lo paso por la
cadena FORWARD, y si la supera, lo encamino
- Si no soy un router lo tiro
Envı́o un datagrama
- Decido su encaminamiento, lo paso en la cadena OUTPUT
y si la supera, lo encamino
IPTables
uso de iptables
La manipulación de reglas se hace mediante opciones de la orden
iptables
Las reglas se borran al reiniciar la máquina. Ası́ que hay que cargarlas
en un script en el arranque. Es conveniente activarlo antes de activar
los interfaces de red
La mayorı́a de las opciones pueden especificarse de dos formas alternativas, equivalentes
1. Con un guión y letra de opción
2. Con dos guiones y el nombre de la opción
iptables -A INPUT -p tcp -s 193.186.21.6 -j DROP
iptables --append INPUT --protocol tcp --source 193.186.21.6 -jump DROP
IPTables
Ver las reglas
-L
Listar las reglas de una(s) cadena(s)
--list
-n
--numeric
Mostrar las direcciones como números, sin intentar traducirlas en nombres
iptables -nL FORWARD
Listar la cadena FORWARD
iptabels -nL
Listar todas las cadenas
Poner y quitar reglas
-A
--append
Añadir una regla a una cadena
-F
--flush
Borrar todas las reglas
iptables --flush INPUT
Borra las reglas de la cadena input
iptables --flush
Borra las reglas de todas las cadenas
Hay opciones para borrar reglas sueltas y para reordenar las reglas
Pero ya que hay que cargar las reglas mediante un script, es más
práctico que el script borre todo y luego inserte las reglas adecuadas
en el orden adecuado
IPTables
Especificar paquetes
-s
--source
Dirección IP origen
-d
--destination
Dirección IP destino
-i
--in-interface
Interfaz de entrada
-o
--out-interface
Interfaz de salida
negación
!
-s 193.147.71.1
Paquete proveniente de 193.147.71.1
-d ! localhost
Paquete no destinado a localhost
-i lo
Paquete que entra por el interfaz lo
-o ! eth0
Paquete que no sale por eth0
-p
--protocol
--sport --source-port
Protocolo del paquete
Puerto de origen
--dport --detination-port Puerto de destino
No basta decir el puerto 80. ¿El puerto 80 TCP? ¿El puerto 80 UDP?
La opción --protocol debe preceder a --dport/--sport
-p tcp
Paquete de protocolo TCP
--dport 80
Paquete destinado al puerto 80
--sport 1-1023
Paquete con origen en los puertos del 1 al 1023
--dport 1024-
Paquete con destino al puerto 1024 o superior
--sport -3000
Paquete con origen en el puerto 3000 o inferior
El fichero /etc/services describe los well-known port numbers
IPTables
Destino de un paquete
-j --jump
-j
-j
-j
-j
DROP
REJECT
ACCEPT
RETURN
-j MI_CADENA
Enviar el paquete a DROP (descartarlo, sin más)
Rechazar el paquete y enviar un error al origen
Aceptar el paquete. No se evalúan más reglas
El paquete abandona la cadena actual
-Si está en una subcadena, vuelve a la cadena principal
-Si está en la cadena principal se le aplica la polı́tica
por defecto
Enviar el paquete a MI_CADENA
Polı́tica por defecto
Por una cadena pasan muchos datagramas
Los que encajan en una regla de destino DROP o REJECT, serán
eliminados
Los que encajan en una regla ACCEPT, superarán la cadena
¿Y los que no sea explı́citamente aceptados ni explı́citamente rechazados?
Se hará con ellos lo que indique la polı́tica por defecto
Las subcadenas no tienen polı́tica por defecto
-P
--policy
Fija la polı́tica por defecto de la cadena
iptables --policy INPUT DROP
iptables --policy FORWARD ACCEPT
Ejemplo:SNAT/DNAT
♦ dirección IP privada origen por la
dirección IP pública
Pasos:
♦ Un equipo de una red local con
una
dirección
IP
privada
(supongamos
192.168.3.14)
quiere
solicitar una página web (puerto
80/tcp) de Zeus.unex.es.
♦ Realiza una consulta DNS y obtiene
l a IP 158.49.96.23.
♦ Consulta
su
tabla
de
encaminamiento y como no está en
la misma red que Zeus.unex.es,
envía el paquete con la solicitud
de la página al equipo que es su
destino por defecto (puerta de
enlace), que supongamos tiene la
dirección 192.168.3.254.
♦ El gateway, actúa como dispositivo
de NAT, recibe el paquete,comprueba
la dirección IP destino, y como no
es la suya, lo envía a su propio
destino por defecto (gateway) que
ya será una dirección IP pública.
Ejemplo: SNAT/DNAT
♦ Antes de que el paquete salga por
la interfaz de red externa, se le
cambia
la
dirección
IP
origen
(192.168.3.14) por la dirección IP
pública
(supongamos
que
fuese
158.49.92.100)
y se
guarda
la
petición en lo que se denomina
tablas de NAT(anotando también el
puerto
origen,
supongamos
que
fuese el 5015/tcp.
♦ El
paquete
viaja
por
Internet
saltando de router a router hasta
que llega a su destino. El equipo
158.49.96.23 recibe una petición
desde la dirección 158.49.92.100 y
la contesta, por lo que el paquete
de vuelta llevará ahora dirección
IP origen 158.49.96.23, dirección
IP
destino
158.49.92.100, puerto
origen 80/tcp y puerto destino
5015/tcp.
♦ La contestación del servidor web
de
Zeus.unex.es
llega
a
la
interfaz externa del dispositivo de
NAT, que consulta las tablas de NAT
y comprueba (gracias al puerto
origen) que corresponde
con
una
petición
realizada
desde
el
equipo 192.168.3.14, por lo que
modifica la dirección IP destino
por
ésta
y
se
lo
envía
directamente.
Ejemplo: SNAT/DNAT
IP masquerading
•
SNAT: Cuando
la
dirección
IP
pública que sustituye a la IP origen
es estática (SNAT también significa
Static NAT).
• MASQUERADE: Cuando la dirección IP
pública que sustituye a la IP origen
es dinámica, caso bastante habitual
en conexiones a Internet domésticas.
Destination NAT o port forwarding
Este tipo de NAT se utiliza cuando tenemos
algún servidor en una máquina detrás del
dispositivo de NAT. En este caso será un
equipo externo el que inicie la conexión,
ya que solicitará un determinado servicio
y el dispositivo de NAT, en este caso, debe
modificar la dirección IP destino.
♦ Un equipo con dirección IP pública
150.212.23.6 desea conectarse
por
ssh(22/tcp)al equipo casa.mired.com
♦ Realiza una consulta DNS y obtiene
como respuesta que casa.mired.com
tiene la dirección IP 85.136.14.7.
Ejemplo:SNAT/DNAT
♦ Establece la conexión (supongamos
puerto origen 23014/tcp) con el
equipo 85.136.14.7, que resulta ser
un dispositivo de NAT que no tiene
ningún servicio ssh escuchando en
el puerto 22/tcp, pero que tiene
una regla de DNAT para que todo lo
que llegue a ese puerto se lo envíe
a un equipo de su red local
(supongamos que fuese el 10.0.0.2),
por lo que cambia la dirección IP
destino
(85.136.14.7)
por
la
10.0.0.2
y
lo registra en sus
tablas de NAT.
♦ Al
equipo
10.0.0.2
llega
un
solicitud al puerto 22/tcp y la
respuesta
tiene
las
siguientes
características: origen 10.0.0.2,
puerto origen 22/tcp, IP destino
150.212.23.6
y
puerto
destino
23014/tcp.
♦ El dispositivo de NAT cambia ahora
la dirección IP origen por su
dirección IP pública (85.136.14.7)
y el paquete llega de vuelta a su
destino.
SNAT/DNAT
Š Cómo se examinan las cadenas [Tabla NAT]
Incoming
Prerouting
DNAT
Outgoing
Routing
Decision
Postrouting
SNAT
Local
Process