El equipo terminador de túneles IPSec cuenta con una sola interfaz de red física conectada a la red privada de la universidad, y con una sola dirección IP pública con la que accede tanto al exterior como al interior de la red. La configuración concreta es la siguiente:
minimum root # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:24:C8:0A:98 inet addr:193.147.184.193 Bcast:193.147.184.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:14905358 errors:3 dropped:0 overruns:0 frame:0 TX packets:534587 errors:3999 dropped:0 overruns:0 carrier:3999 collisions:32135 txqueuelen:1000 RX bytes:1438569655 (1371.9 Mb) TX bytes:48817647 (46.5 Mb) Interrupt:5 Base address:0xe800 minimum root # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 193.147.184.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo 0.0.0.0 193.147.184.1 0.0.0.0 UG 0 0 0 eth0
Para que esta configuración se aplique automáticamente al arrancar la máquina, modificamos el fichero de configuración /etc/conf.d/net:
# configuración del interfaz de red iface_eth0="193.147.184.193 broadcast 193.147.184.255 netmask 255.255.255.0" # gateway por defecto de la red gateway="eth0/193.147.184.1"
Gentoo proporciona scripts para activar o desactivar los interfaces de red de forma automática. Utilizándolos resulta trivial conseguir que esta configuración se aplique en el arranque del PC:
minimum root # rc-update add net.eth0 default
Una vez configurada la red, podemos proceder a configurar el cortafuegos que filtrará el tráfico del terminador de túneles. Para empezar, es fundamental activar la opción del núcleo de redirección de IP (IP Forwarding) y desactivar la comprobación de la ruta de origen de los paquetes IP (sin hacer esto último IPSec no funcionará correctamente). Podemos hacerlo interactivamente de forma sencilla:
minimum root # echo 1 > /proc/sys/net/ipv4/ip_forward minimum root # for f in /proc/sys/net/ipv4/conf/*/rp_filter > do echo 1 > $f > done
Nuevamente, deseamos que estos cambios se realicen de forma automática al arrancar el servidor, sin necesidad de la intervención de un operador, por lo que modificamos el fichero /etc/sysctl.conf:
# Habilitamos la redireccion de paquetes net.ipv4.ip_forward = 1 # Deshabilitamos ECN net.ipv4.tcp_ecn = 0 # Habilitamos la verificacion de la ruta origen net.ipv4.conf.default.rp_filter = 0
Nos aseguramos de que el módulo ipsec (recordemos que hemos habilitado el soporte IPSec en el núcleo en forma de módulo, no como parte del mismo. En caso contrario no sería necesario este paso) se cargue al arrancar el sistema operativo:
minimum root # echo ipsec >> /etc/modules.autoload.d/kernel-2.4
Dado que como ya se ha dicho, la maqueta no cuenta con teclado ni monitor conectados, la única forma de trabajar con ella se reduce a alguna forma de acceso remoto. En particular SSH3.4 es fundamental para nuestros propósitos, por lo que instalamos un servidor:
minimum root # emerge openssh
y modificamos su fichero de configuración /etc/ssh/sshd_config adecuadamente:
Port 22 Protocol 2 ListenAddress 193.147.184.193 # Logging #obsoletes QuietMode and FascistLogging SyslogFacility AUTH LogLevel INFO # Authentication: #LoginGraceTime 2m PermitRootLogin yes #StrictModes yes # Set this to 'yes' to enable PAM authentication (via challenge-response) # and session processing. Depending on your PAM configuration, this may # bypass the setting of 'PasswordAuthentication' and 'PermitEmptyPasswords' UsePAM yes # override default of no subsystems #Subsystem sftp /usr/lib/misc/sftp-server
Lo arrancamos y le indicamos al sistema que lo arranque al iniciarse el sistema operativo:
minimum root # /etc/init.d/sshd start * Starting sshd... [ ok ] minimum root # rc-update add sshd default
En todo momento podemos comprobar el estado de los servicios del nivel por defecto de ejecución con el comando rc-status. Una vez llegados a este punto, configuraremos un cortafuegos mediante iptables para asegurar los accesos al PC terminador de túneles. Creamos un sencillo script que nos permita modificar rápidamente estas reglas, y lo probamos simplemente ejecutándolo:
#!/bin/bash IPTABLES='/sbin/iptables' # Interfaces EXTIF='eth0' IPSECIF='ipsec+' # IP's de interés PUBIP='193.147.184.193' # Terminadores túneles IPSec Telefónica TERM1='195.55.47.10' TERM2='195.55.47.11' # Radius de la universidad RADIUS1='193.147.184.3' RADIUS2='193.147.184.22' # DNS de la universidad DNS1='193.147.184.2' DNS2='193.147.71.64' # Pools de usuarios de la VPN POOLGSM='193.147.59.160/27' # Habilitamos IP forwarding en el núcleo /bin/echo 1 > /proc/sys/net/ipv4/ip_forward # Eliminar reglas y cadenas $IPTABLES -F $IPTABLES -X ## ## ADMINISTRACIÓN DE SERVICIOS ## # Acceso para el servicio ssh $IPTABLES -A INPUT -s 193.147.184.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 22 -j ACCEPT $IPTABLES -A INPUT -s 193.147.72.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 22 -j ACCEPT # Acceso a los interfaces telnet de administración de zebra y ripd $IPTABLES -A INPUT -s 193.147.184.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 2601 -j ACCEPT $IPTABLES -A INPUT -s 193.147.72.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 2601 -j ACCEPT $IPTABLES -A INPUT -s 193.147.184.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 2602 -j ACCEPT $IPTABLES -A INPUT -s 193.147.72.0/24 -d $PUBIP -i $EXTIF \ -p tcp --sport 1024:65535 --dport 2602 -j ACCEPT # Bloqueamos el acceso desde la VPN a los servicios del gateway $IPTABLES -A INPUT -d $PUBIP -i $IPSECIF -p tcp \ --dport 22 -j DROP $IPTABLES -A INPUT -d $PUBIP -i $IPSECIF -p tcp \ --dport 2601 -j DROP $IPTABLES -A INPUT -d $PUBIP -i $IPSECIF -p tcp \ --dport 2602 -j DROP ## ## Servicios públicos ## # Acceso UDP al demonio RIP $IPTABLES -A INPUT -d $PUBIP -i $EXTIF -p udp \ --dport 520 -j ACCEPT # Acceso consultas Radius $IPTABLES -A INPUT -s $TERM1 -d $PUBIP -p udp \ --dport 1812 -j ACCEPT $IPTABLES -A INPUT -s $TERM2 -d $PUBIP -p udp \ --dport 1812 -j ACCEPT $IPTABLES -A INPUT -s $RADIUS1 -d $PUBIP -p udp \ --dport 1812 -j ACCEPT $IPTABLES -A INPUT -s $RADIUS2 -d $PUBIP -p udp \ --dport 1812 -j ACCEPT # Permitimos protocolo ESP de IPSec $IPTABLES -A INPUT -s $TERM1 -d $PUBIP -p esp -j ACCEPT $IPTABLES -A INPUT -s $TERM2 -d $PUBIP -p esp -j ACCEPT # Permitimos las transacciones IKE $IPTABLES -A INPUT -s $TERM1 -d $PUBIP -p udp --sport 500 \ --dport 500 -j ACCEPT $IPTABLES -A INPUT -s $TERM2 -d $PUBIP -p udp --sport 500 \ --dport 500 -j ACCEPT # Permitimos el tráfico entre las VPN y la red de la universidad $IPTABLES -A INPUT -d $POOLGSM -i $EXTIF -j ACCEPT $IPTABLES -A INPUT -s $POOLGSM -i $IPSECIF -j ACCEPT # Permitimos consultas DNS con los servidores privados $IPTABLES -A INPUT -s $DNS1 -d $PUBIP -i $EXTIF -p udp \ --sport 53 -j ACCEPT $IPTABLES -A INPUT -s $DNS2 -d $PUBIP -i $EXTIF -p udp \ --sport 53 -j ACCEPT # Permitimos el tráfico originado desde el terminador # (conexiones TCP ya abiertas) $IPTABLES -A INPUT -d $PUBIP -i $EXTIF -p tcp \ ! --tcp-flags SYN,RST,ACK SYN -j ACCEPT # Bloqueamos todo el tráfico $IPTABLES -A INPUT -i $EXTIF -p tcp -j DROP $IPTABLES -A INPUT -i $EXTIF -p udp -j DROP
Verificamos el correcto funcionamiento de la red una vez ejecutado este script, y comprobamos que las reglas se han aplicado correctamente:
minimum root # iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 193.147.184.0/24 193.147.184.193 tcp spts:1024:65535 dpt:22 ACCEPT tcp -- 193.147.72.0/24 193.147.184.193 tcp spts:1024:65535 dpt:22 ACCEPT tcp -- 193.147.184.0/24 193.147.184.193 tcp spts:1024:65535 dpt:2601 ACCEPT tcp -- 193.147.72.0/24 193.147.184.193 tcp spts:1024:65535 dpt:2601 ACCEPT tcp -- 193.147.184.0/24 193.147.184.193 tcp spts:1024:65535 dpt:2602 ACCEPT tcp -- 193.147.72.0/24 193.147.184.193 tcp spts:1024:65535 dpt:2602 DROP tcp -- 0.0.0.0/0 193.147.184.193 tcp dpt:22 DROP tcp -- 0.0.0.0/0 193.147.184.193 tcp dpt:2601 DROP tcp -- 0.0.0.0/0 193.147.184.193 tcp dpt:2602 ACCEPT udp -- 0.0.0.0/0 193.147.184.193 udp dpt:520 ACCEPT udp -- 195.55.47.10 193.147.184.193 udp dpt:1812 ACCEPT udp -- 195.55.47.11 193.147.184.193 udp dpt:1812 ACCEPT udp -- 193.147.184.3 193.147.184.193 udp dpt:1812 ACCEPT udp -- 193.147.184.22 193.147.184.193 udp dpt:1812 ACCEPT esp -- 195.55.47.10 193.147.184.193 ACCEPT esp -- 195.55.47.11 193.147.184.193 ACCEPT udp -- 195.55.47.10 193.147.184.193 udp spt:500 dpt:500 ACCEPT udp -- 195.55.47.11 193.147.184.193 udp spt:500 dpt:500 ACCEPT all -- 0.0.0.0/0 193.147.59.160/27 ACCEPT all -- 193.147.59.160/27 0.0.0.0/0 ACCEPT udp -- 193.147.184.2 193.147.184.193 udp spt:53 ACCEPT udp -- 193.147.71.64 193.147.184.193 udp spt:53 ACCEPT tcp -- 0.0.0.0/0 193.147.184.193 tcp flags:!0x16/0x02 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Si todo está correcto, guardamos el estado de las reglas actuales, y configuramos iptables para que se ejecute al inicio:
minimum root # /etc/init.d/iptables save minimum root # rc-update add iptables default
El funcionamiento de este cortafuegos es muy básico. Simplemente nos aseguramos de que sólo usuarios de subredes autorizadas de la universidad (la red de servidores y la de trabajadores de Servicios Centrales) tienen acceso a la administración de servicios que existirán en este PC. Esto incluye tanto SSH como los interfaces telnet de configuración de Zebra y RIP, que veremos más adelante. Prohibimos el acceso a estos servicios también a los usuarios de la VPN. Permitimos el acceso al demonio del protocolo RIP y al Radius delegado, desde las direcciones IP necesarias. Permitimos la entrada de datagramas IP conteniendo paquetes con el protocolo ESP, que se corresponderán con tráfico IPSec, desde las direcciones legítimas de los terminadores de túneles de Telefónica. Permitimos por último el tráfico al puerto 500 UDP desde dichos terminadores, utilizado para las transacciones del protocolo IKE. Por último, denegamos el resto del tráfico en su totalidad.