Enrutamiento y filtrado Linux como router.

Anuncio
Asegurando tu red con Iptables – Proxy – NAT – IDS: PARTE 1
http://blog.desdelinux.net/iptables-asegurando-red-parte1
Este post intenta esclarecer un poco de como funcionan las redes y como
convertir nuestro equipo Linux en un Router que nos asegure un poco más
nuestra red, ya sea de hogar e incluso empresarial. Así que vamos al tema:
Este contenido es basado en el libro “Linux – Administración del sistema y
explotación de los servicios de red” – Sébastien BOBILLIER
Enrutamiento y filtrado
Para hablar y entender sobre el enrutamiento podemos definir primero ¿cual
es la función del router?. Para ello podemos decir que un router, además de
crear una red y permitir conexión con otros equipos (sabiendo que esto lo
podemos hacer con un AP, Switch, Hub u otros) tiene la capacidad de
conectar dos redes diferentes entre si.
Como lo podemos ver en la imagen, existe una red local “10.0.1.0” que es
creada por el router, y llega a una de sus dos interfaces. Luego el router en
su otra interfaz, tiene otra red, con su IP pública con la cual puede conectar a
Internet. La función de enrutamiento básicamente es servir de intermediario
entre estas dos redes para que puedan comunicarse.
Linux como router.
De forma natural, el Kernel de Linux ya tiene la capacidad de hacer
“forwarding”, pero por defecto viene desactivado, entonces si queremos que
nuestro linux pueda hacer este trabajo debemos ir al archivo.
/proc/sys/net/ipv4/ip_forward
Allí encontraremos que es un archivo que lo único que contiene es un cero
“0”, lo que debemos hacer es cambiarlo por un uno “1” para activar este
comportamiento. Esto por desgracia se borra cuando reiniciemos el equipo,
para dejarlo por defecto activado debemos utilizar el comando:
sysctl net.ipv4.ip_forward=1
O editarlo directamente en el archivo /etc/sysctl.conf. Dependiendo de la
distribución esta configuración también puede estar en un archivo
en /etc/sysctl.d/.
Por defecto nuestro Linux debe tener una tabla de enrutamiento, que
generalmente es la configuración de nuestra red lan y conexión con el router.
Si queremos ver este enrutamiento podemos usar dos comandos:
route -n
o
netstat -nr
Ambos comandos deberían devolver lo mismo.
En general, esta configuración es suficiente para que tu Linux sirva como
Gateway y otros equipos puedan navegar a través de nuestro equipo. Ahora
bien, si queremos que por ejemplo, nuestro Linux conecte dos o más redes
ya sean locales o no, podemos hacer uso de las rutas estáticas.
Supongamos que mi Linux tiene dos interfaces de red, en la primera tiene
salida a Internet cuya red es 172.26.0.0 y en la segunda (10.0.0.0) hay unos
equipos de otra red local. Si queremos enrutar paquetes a esa otra red
podemos usar:
route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.26.0.8
De forma general es:
route add -net REDDESTINO netmask MASCARA gw IPDELLINUX
si damos route -n independientemente de que esta red exista o no, estará
fijado este enrutamiento en nuestra tabla.
Si queremos eliminar dicho enrutamiento podemos usar
route del -net 10.0.0.0 netmask 255.0.0.0
Iptables.
Básicamente iptables es usado para el filtrado de paquetes, salientes,
entrantes u otros, esto hace que se convierta en una gran herramienta para
administrar el tráfico de nuestra red. Pues iptables así como nos permite
filtrar el tráfico del mismo equipo, también permite filtrar el tráfico que
pasada a través de él. (Forwarding). Iptables puede dividirse en tablas,
cadenas, y acciones.

Tablas: básicamente pueden haber dos tablas, filter, para filtrar
paquetes y nat para traducir direcciones, es decir, para pasar de una
red a otra.

Cadenas: La cadena se refiere al tipo de tráfico que deseamos filtrar o
natear, es decir, ¿a cual tráfico vamos aplicar las tablas?. y pueden
ser: INPUT: Tráfico entrante, OUTPUT: tráfico saliente
o FORWARD: Tráfico que pasa a través de él, pero no es una conexión
propia.

También puede aparecer POSTROUTING, que se usa para tratar el
paquete de un modo determinado luego de haber sido enrutado.

Acciones: Las acciones básicamente es la acción que se va realizar
con la cadena. Esta acción puede ser DROP, que simplemente
destruye ese tráfico oACCEPT. que permite al tráfico hacer dicha
acción.
Las reglas de IPTABLES se guardan y ejecutan en el orden que fueron
creadas, y si una regla suprime a una regla anterior, siempre queda aplicada
la ultima regla en el orden.
Políticas de Cortafuegos.
En general, de forma natural los cortafuegos trabajan de dos maneras:
1. Permitir todo el tráfico excepto, o
2. No permitir ningún tráfico excepto…
Para aplicar politicas se usa IPTABLES – P CADENA ACCION
Donde la cadena representa el tipo de tráfico (INPUT, OUTPUT, FORWARD,
POSTROUTING…) y la acción es DROP O ACCEPT.
Veamos un ejemplo.
Aquí vemos que en principio pude hacer ping, luego le dije a IPTABLES que
todo el tráfico OUTPUT (Saliente) fuera DROP o no permitido. Luego le dije a
IPTABLES que lo aceptara.
Si vamos a construir un cortafuegos desde cero debemos siempre aplicar las
reglas de (No permitir ningún tráfico excepto… Para esto entonces
aplicamos las reglas
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Si aplican estas políticas no tendrán ningún tipo de conexión
.
Para regresar escribimos lo mismo y reemplazamos DROP por ACCEPT.
En este punto, ya que todo el tráfico está denegado, comenzamos a decirle a
nuestro IPTABLES cual es el tráfico que si puede tener.
La sintaxis es:
iptables -A cadena -s ip_orgigen -d ip_destino -p protocolo --dport
puerto -j acción
Donde:
Cadena = INPUT, OUTPUT o FORWARD
ip_origen = Origen de los paquetes, esto puede ser una sola IP o una red y
en este caso debemos especificar la mascara ).
ip_destino = hacia donde se dirigen los paquetes. esto puede ser una sola
IP o una red y en este caso debemos especificar la mascara ).
protocolo = indica el protocolo que usan los paquetes (icmp, tcp, udp…)
puerto = puerto destino del tráfico.
acción = DROP o ACCEPT.
Ejemplo:
Se aplican las políticas de TODO restringido.
Luego añadimos las reglas para poder tener tráfico por el puerto 80 HTTP y
443 HTTPS, con el protocolo TCP. Luego el puerto 53 Se aplica para que el
cliente DNS pues a resolver los dominios, de lo contrario no navegarás. Esto
funciona con protocolo udp.
La linea:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Es por lo siguiente: Cuando haces una petición HTTP por ejemplo, tu te
conectas al puerto 80 del servidor, pero el servidor para devolverte la
información necesita conectar contigo por un puerto cualquiera.
(Generalmente superior a 1024).
Como todos nuestros puertos están cerrados esto no se logrará a menos que
abramos todos los puertos superiores a 1024 (Mala idea). Lo que esto dice es
que se acepta todo el tráfico entrante que provenga de una conexión que yo
mismo establecí. Osea una conexión que en principio yo inicié.
Al poner OUTPUT en las reglas, esto solo aplica para el equipo en cuestión, si
estamos usando nuestro equipo como router para permitir estas conexiones,
debemos cambiar OUTPUT por FORWARD. Dado que el tráfico pasa por el equipo
pero no es iniciado por él
Todas estas reglas se borran luego del reinicio, por eso hay que crear scripts para
que se inicien por defecto. Pero esto lo veremos en la próxima
Espero que esta información les haya gustado. En la próxima les hablaré de
NAT, Proxy y scripts para el Firewal.
Asegurando tu red con Iptables – Proxy – NAT – IDS: PARTE 2
http://blog.desdelinux.net/nat-iptables-asegurando-red-parte2/
En el post anterior vimos la configuración de IPTables para que funcione
como un Firewall. Ahora podemos ver como crear esos scripts para que se
ejecuten las reglas automáticamente cuando se inicie el sistema, y también
como podemos eliminar o detener esas reglas por un momento.
Antes de hacer el script y mostrarles como va quedando, hablemos un poco
de NAT y del concepto de lo que queremos hacer con este equipo.
NAT y Contexto del ejemplo.
Cuando hablamos de NAT, podemos confundir esto con enrutamiento, y es
que ambos se encargan de conectar dos redes diferentes entre sí. La
diferencia realmente radica es que el enrutamiento se aplica para pasar de
una red local a otra y esta otra red puede conectarse a un router y salir a
Internet.
Mientras que, cuando hablamos de NAT, hablamos de enrutar paquetes de
una red local o privada a una red pública o Internet. Esto lo hace
enmascarando los paquetes poniéndole la ip pública con la que sale a
Internet. Es decir, que no necesitamos un router, porque la ip pública la tiene
directamente el ordenador con GNU/Linux.
Trabajaremos esto con la consigna de que estamos usando nuestro Linux
como un router/firewall para salir a Internet desde una red local. Pero aquí
pueden aparecer dos escenarios.

Que nuestro Linux esté entre el router del proveedor de servicio y la
red local.
En este caso, entre el router y nuestro Linux habría una red, y entre el Linux
y la red local habría otra red diferente. Esto significa que nuestro router no
tendría que hacer NAT como tal, con un simple enrutamiento de tráfico como
lo explique en post anterior estaría bien.

Que nuestro Linux tenga una interfaz conectada a la red local y por la
otra interfaz reciba directamente una ip pública con la cual navega.
Esto significa que nuestro Linux debe hacer NAT para que los paquetes
puedan llegar a Internet.
Para efectos de este pequeño laboratorio entonces, diremos que nuestro
Linux recibe directamente una ip pública y así poder probar los efectos de la
NAT.
Para hacer NAT usamos entonces la sintaxis
iptables -t nat -A POSTROUTING -O eth1 -j MASQUERADE
Donde eth1 es la interfaz por donde recibimos la ip pública, osea por donde
salimos a Internet.
se usa MASQUERADE cuando la ip es pública pero puede variar con el tiempo
(dinámica). En caso contrario podemos usar SNAT –to-source ip
Creando script iptables
Supongamos entonces que: 172.26.0.0 es nuestra red local y 81.2.3.4 es la
ip pública con la que salimos a Internet. (es una ip estática). Tengo las
interfaces eth0 (Red local)
eth1 (Red pública).
Consiste básicamente en crear un script que pueda ser llamado desde
/etc/init.d/cortafuegos (por ejemplo). y desde este script poder iniciar,
detener o consultar el estado de nuestra configuración, tal y como hacemos
con cualquier demonio del sistema.
Supongamos que mis reglas IPTABLES SON:
#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/cortafuegos_on
# By Jlcmux Twitter: @Jlcmux
#
# Política básica.
iptables -P INPOUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#
#NAT para compartir Internet desde eth0 a eth1
iptables -t nat -A POSTROUTING -O eth1 -j SNAT --to-source 81.2.3.4
#
# Permitir conexiones entrantes iniciadas por mi
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Trafico saliente autorizado
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p udp --dport 53 -j ACCEPT
No olvidemos dar permisos de ejecución
Explicación:
El script básicamente hace lo siguiente:
1. Primero restringe toda la navegación, conexiones y tráfico. (Políticas
básicas de Firewall)
2. Luego crea la NAT con el destino eth1. indicando le que tenemos una ip
pública estática “81.2.3.4”
3. Abre los puertos necesarios para recibir los paquetes de conexiones
iniciadas por mi.
4. Acepta el tráfico saliente de HTTP, HTTPS y DNS.
Las reglas tienen como destino el tráfico FORWARD porque estamos usando nuestro
Linux como Router, entonces las políticas se usan para el tráfico que PASA por el
Linux, osea, actúa como intermediario. Esto significa que nuestro Linux realmente
no puede navegar ni recibir ningún dato directamente. Solo se aplica para los
equipos conectados a él, pero no a él mismo
Si quisiéramos usar nuestro equipo para navegar deberíamos repetir las
lineas y cambiar FORWARD por INPUT o OUTPUT según el caso.
Script anulación.
Ahora vamos a crear un script que anule todo lo anterior y deje el equipo
limpio de todo esto. (Para efectos de pruebas o simplemente queremos
apagar el firewall).
#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/cortafuegos_off
# By Jlcmux Twitter: @Jlcmux
#
#Borrando Reglas
iptables -F
#
#Aplicando politicas por defecto (todo tráfico aceptado)
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Automatizando.
Ahora debemos crear el script dentro de /etc/init.d/ y el servicio se inicie
automáticamente y lo podamos gestionar de una manera más cómoda.
#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/init.d/cortafuegos
# By Jlcmux Twitter: @Jlcmux
case $1 in
start)
/etc/cortafuegos_on
;;
stop)
/etc/cortafuegos_off
;;
status)
iptables -L
;;
*)
echo "Sintaxis erronea. Valido = /etc/init.d/cortafuegos start|stop|status
;;
esac
Explicación:
Este último script lo ponemos en /etc/init.d/ con el nombre cortafuegos.
Entonces si queremos gestionar el firewall podemos usar el
comando /etc/init.d/cortafuegos start. De la misma forma lo podemos
parar o ver el estado.
Ahora vamos a editar el archivo /etc/rc.local y ponemos algo
como:/etc/init.d/cortafuegos start para que se inicie con el sistema.
Pues bien. Este es la segunda parte. Espero que aporte algo a todos ustedes.
En la próxima vemos Proxy e IDS.
http://blog.desdelinux.net/iptables-para-novatos-curiosos-interesados/
http://blog.desdelinux.net/iptables-para-novatos-curiosos-interesados-2daparte/
http://www.enlinux.org/iptables-con-squid-3-1-transparente-en-gnulinuxcentos-sl-rhel/
Iptables con SQUID 3.1+ transparente en
GNU/Linux CentOS / SL / RHEL
Para iniciar se configura crea un archivo vacío;
touch iptables_intercept.sh
Creado el archivo se inserta el siguiente contenido;
Se asigna permiso de ejecución en el script;
chmod +x iptables_intercept.sh
Y se ejecuta;
sh iptables_intercept.sh
Por último se edita el archivo /etc/squid/squid.conf;
vim /etc/squid/squid.conf
Y se inserta la siguiente sintaxis;
httpd_port 3128 intercept
Se reinicia el servicio SQUID;
service squid restart
Acá el contenido del script;
!/bin/bash
# Direccion IP del SQUID
IPSQUID=192.168.1.100
# Puerto de escucha del SQUID
PUERTOSQUID=3128
# Redireccion del Puerto 80 en TCP al puerto 3128 del SQUID.
iptables -t nat -A PREROUTING -s $IPSQUID -p tcp –dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port $PUERTOSQUID
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t mangle -A PREROUTING -p tcp –dport $PUERTOSQUID -j DROP
http://www.tldp.org/HOWTO/TransparentProxy-5.html
5. Setting up iptables (Netfilter)
iptables is a new thing for Linux kernel 2.4 that replaces ipchains. If your
distribution came with a 2.4 kernel, it probably has iptables already installed. If
not, you'll have to download it (and possibly compile it). The homepage
is netfilter.samba.org. You make be able to find binary RPMs elsewhere, I haven't
looked. For the curious, there is plenty of documentation on the netfilter site.
To set up the rules, you will need to know two things, the interface that the to-beproxied requests are coming in on (I'll use eth0 as an example) and the port squid is
running on (I'll use the default of 3128 as an example).
Now, the magic words for transparent proxying:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --toport 3128
You will want to add the above commands to your appropriate bootup script
under /etc/rc.d/. Readers upgrading from 2.2 kernels should note that this is the
only command needed. 2.2 kernels required two extra commands in order to
prevent forwarding loops. The infastructure of netfilter is much nicer, and only this
command is needed.
http://www.tldp.org/HOWTO/TransparentProxy-6.html
6.3 Method One: What if iptables-box is on a dynamic IP?
If the iptables-box is on a dynamic IP address (e.g. a dialup PPP connection, or a
DHCP assigned IP address from a cable modem, etc.), then you will want to make
a slight change to the above commands. Replace the second command with this
one:

iptables -t nat -A POSTROUTING -o eth0 -s local-network -d squid-box -j
MASQUERADE
This change avoids having to specify the IP address of iptables-box in the
command. Since it will change often, you'd have to change your commands to
reflect it. This will save you a lot of hassle.
Descargar