Router NAT proxy firewall

Sencillos pasos para compartir una conexión a Internet

Esta receta explica cómo convertir, con ayuda de GNU/Linux, una vieja máquina "inservible" en una pasarela para compartir nuestra conexión ADSL con muchos ordenadores.

En nuestro caso hemos montado una máquina con dos interfaces de red. El interfaz eth0 estará conectado al router ADSL o al servicio que nos provea la conexión. El interfaz eth1 será a través del cual demos servicio a nuestra red local.

Ingredientes

Los programas necesarios para configurar nuestra máquina dependen de los servicios que queramos prestar, en nuestro caso serán:
- NAT: iptables
- servidor dhcp: dhcp
- proxy web: squid
- proxy dns: dnsmasq
- firewall: iptables otra vez Eye-wink

Si te falta alguno de estos paquetes y tienes Debian, ya sabes, apt-get install ...

Configuración de red

Para llevar a cabo el cometido necesitamos de una máquina con dos interfaces de red, como ya hemos comentado antes. La configuración del interfaz eth0 puede ser tan sencilla como dejarla automática con DHCP. Muchos routers ADSL llevan incorporado un servidor DHCP. En caso contrario deberemos proceder según las intrucciones de nuestro ISP.

En resumen, a través de eth0 (también es aplicable a conexiónes por modem a través de ppp0, o RDSI por ippp0) debe existir una salida a internet perfectamente configurada.

El interfaz eth1 debe ser configurado de forma estática. Debe escogerse una dirección de red privada puesto que nuestra red es privada. Los rangos de IPs privadas son:
- 10.0.0.0 - 10.255.255.255
- 172.16.0.0 - 172.31.255.255
- 192.168.0.0 - 192.168.255.255

Para nuestro ejemplo eth1 se ha configurado con la dirección 10.12.0.1 con una máscara de 255.255.255.0, es decir 24 bits. Esto significa que en nuestra red pueden haber 253 equipos.

Activando el rutado

En primer lugar tenemos que decirle a nuestra máquina que debe enrutar los paquetes que le lleguen por los interfaces, para eso debemos poner a 1 el contenido del fichero /proc/sys/net/ipv4/ip_forward. Para que este cambio sea permanente debemos editar el fichero /etc/sysctl.conf y añadir la siguiente línea.

net.ipv4.ip_forward=1

Activando el NAT

Es lo que se conoce como Traducción de direcciones. Para que podamos pasar tráfico de distintas máquinas, a través de nuestro gateway, necesitamos enmascarar el tráfico y hacerles creer el gateway quien realiza las peticiones y no el host cliente. Para ello utilizaremos el fantástico iptables con la siguiente orden:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Es decir, le decimos que todo el tráfico, una vez que sabemos por donde tiene que ir (POSTROUTING), si tiene que salir por el interfaz eth0, debe ser enmascarado. Esto funciona para todo el tráfico saliente. Existen un par de casos excepcionales. Con los protocolos FTP e IRC(DCC) el ordenador cliente tiene que hacer a su vez de servidor para realizar la conexión. Debemos habilitar a iptables a que haga NAT de este tipo de conexiones mediante la carga de los módulos ip_nat_ftp e ip_nat_irc. Para que se carguen siempre al inicio añadiremos en el fichero /etc/modules los dos módulos.

Instalación del servidor DHCP

Resulta muy cómodo no tener que andar configurando cada cliente que se enchufe en nuestra red local, por este motivo vamos a dar capacidades de servidor dhcp a nuestra máquina. Una vez instalado el servidor DHCP editamos el archivo /etc/dpchd.conf e introducidmos lo siguiente.

option domain-name-servers 10.12.0.1;
option subnet-mask 255.255.255.0;

default-lease-time 600;
max-lease-time 7200;

subnet 10.12.0.0 netmask 255.255.255.0 {
range 10.12.0.2 10.12.0.254;
option broadcast-address 10.12.0.255;
option routers 10.12.0.1;
}

En nuestro ejemplo, la red local que estamos configurando es la 10.12.0.0/24 por este motivo el rango de direcciones asignables va de 10.12.0.2 a 10.12.0.254. El router de esa red es nuestra máquina por eso especificamos el router 10.12.0.1 que es la dirección que le hemos asignado al interfaz eth1. El servidor de nombres también está configurado como 10.12.0.1 pues a continuación vamos a instalar un proxy DNS que hará que nuestra máquina también atienda las peticiones DNS de los clientes.

Nos queda una última cosa por hacer. Tenemos que indicar a nuestra máquina que sólo sirva peticiones DHCP por el interfaz eth1, para esto tenemos que editar el archivo /etc/default/dhcp y modificar la variable INTERFACES para que contenga el valor eth1.

INTERFACES="eth1"

Servidor proxy web

Para ahorrar ancho de banda resulta muy útil disponer de un proxy-cache para web. Yo he elegido squid porque es el mejor que hay Eye-wink. Una vez instalado debemos editar su fichero de configuración /etc/squid.conf para indicarle que debe comportarse como un proxy transparente, además de autorizar el servicio para nuestra red local. Para ello debemos localizar los siguientes parámetros dentro del archivo y establecerlos a los siguientes valores (si los parámetros no existen se introducirán).

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

acl localnet src 10.12.0.0/24
http_access allow localnet

Las dos últimas líneas deben estar antes de la directiva http_access deny all.

Sólo nos queda indicar a la máquina que redirija todas las peticiones web a nuestro proxy. Para ello utilizaremos de nuevo iptables, que tanto sirve para un roto como para un descosido.
# iptables -t nat -A PREROUTING -i eth1 -p tcp \
--dport 80 -j REDIRECT --to-port 3128

Esta orden indica que los paquetes que vengan por el interfaz eth1 con dirección a un puerto 80, antes de saber por donde tienen que ser enrutados, deben ser redirigidos al puerto 3128 que es donde está escuchando nuestro proxy.

De esta manera los clientes no tienen que configurar nada en sus navegadores para aprovecharse de las ventajas de emplear un proxy-cache de web.

Servidor proxy DNS

Como instalar y configurar un servidor DNS es realmente complicado para lo que queremos hacer, existe la opción más sencilla de utilizar un proxy DNS. El proxy DNS realizará por nosotros las consultas a los servidores DNS que tengamos configurados en nuestra máquina y además mantendrá una caché interna para ahorrar tráfico innecesario. El programa empleado es dnsmasq que funciona perfectamente si realizar ninguna modificación. Aun así se pueden realizar unos ajustes mínimos en el fichero /etc/dnsmasq.conf

interface=eth1
cache-size=600

Configuración del Firewall

Por último, nos queda configurar algunas reglas de firewall básicas, muy útiles en el caso de que nuestros desdichados clientes utilicen SS.OO. no evangelizados, propensos a virus y demás fauna, puedan sufrir ataques a través de NetBIOS o del servidor RPC (Blaster). Para ello, se pueden habilitar algunas sencillas reglas de denegación de entrada a tráfico innecesario y sospechoso.

Por mi parte sugiero cerrar el acceso a los siguientes servicios.
- SMTP: 25
- win RPC: 135
- netbios-ns: 137 (tcp y udp)
- netbios-dgm: 138 (tcp y udp)
- netbios-ssn: 139 (tcp y udp)

Estas reglas se aplican con los siguientes comandos:
# iptables -A INPUT -i eth0 -p tcp --dport 25 --tcp-flags SYN,RST SYN -j DROP
# iptables -A INPUT -i eth0 -p tcp --dport 135 --tcp-flags SYN,RST SYN -j DROP
# iptables -A INPUT -i eth0 -p tcp --dport 137 --tcp-flags SYN,RST SYN -j DROP
# iptables -A INPUT -i eth0 -p tcp --dport 138 --tcp-flags SYN,RST SYN -j DROP
# iptables -A INPUT -i eth0 -p tcp --dport 139 --tcp-flags SYN,RST SYN -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 135 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 137 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 138 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 139 -j DROP

Configuración final

Una vez que está todo bien configurado nos queda salvar las reglas de iptables para que se establezcan al inicio. Para ello necesitamos crear el directorio /var/lib/iptables donde se almacenará el conjunto de reglas. Después ejecutamos:
# /etc/init.d/iptables save active

Con todo esto tendremos nuestra máquina haciendo de router, NAT, proxy web, proxy DNS y firewall a nuestra red.

Enlaces
* Montar un Gateway en Debian [es]
* Cómo Balancear conexiones a Internet [es]