"Después del juego es antes del juego"
Sepp Herberger

domingo, 20 de noviembre de 2016

Filtrar la salida a Internet de los PC mediante iptables

En los centros educativos muchas veces es necesario filtrar de forma temporal la salida a Internet en uno o varios PC para que los alumnos se centren en sus tareas. Aislar totalmente el equipo de la red (eliminando rutas o quitando la IP) es demasiado drástico y daría problemas si los PC montan el home por NFS o el usuario necesita recursos de la red del centro o la red educativa para trabajar (impresoras, intranet, Rayuela, etc).

Lo mas adecuado es filtrar todo tráfico que no tenga como destino la Red Educativa. En nuestro caso está red usa el espacio de direcciones 172.X.X.X, por lo que habría que desechar todo paquete que no tenga como destino direcciones en ese rango. La forma mas sencilla es usando iptables, con la orden:
# iptables -A OUTPUT -o eth0 ! -d 172.0.0.0/8 -j DROP
Con esto lo que hacemos es decir que todo paquete de salida por la interface eth0 que no tenga como destino (el simbolo ! es la negación) la red 172.0.0.0/8 debe ser descartado. Como consecuencia de esta regla no funciona ni siquiera el ping hacia fuera. Si queremos apretar un poco mas la cuerda y solo permitir el tráfico en nuestra red:
# iptables -A OUTPUT -o eth0 ! -d 172.20.196.0/24 -j DROP
Siendo nuestra red 172.20.196.X, claro está.

Con esta regla iptables tenemos, sin embargo, un problema cuando configuramos una red privada dentro de un aula que opera en el espacio de direcciones 192.168.0.X y sale hacia fuera mediante NAT. Los paquetes de esos PC con destino 192.168.0.X son descartados y por tanto la comunicación es imposible incluso para salir a la red del educativa. Si probamos a:
# iptables -A OUTPUT -o eth0 ! -d 172.0.0.0/8,192.168.0.0/24 -j DROP
Nos llevamos la desagradable sorpresa de que ! no es compatible con múltiples direcciones de destino. ¿Cómo lo hacemos entonces?. Mi compañero Oscar me dió la pista para usar un chain:
# iptables -N SOLO_INTRANET
# iptables -A SOLO_INTRANET -d 172.0.0.0/8 -j RETURN
# iptables -A SOLO_INTRANET -d 192.168.0.0/24 -j RETURN
# iptables -A SOLO_INTRANET -j DROP
# iptables -A OUTPUT -j SOLO_INTRANET  
Expliquemos: se crea una cadena (SOLO_INTRANET) que deja pasar trafico hacia 172.0.0.0/8 y 192.168.0.0/24, pero descarta el tráfico hacia cualquier otro lado, ya que las reglas se aplican secuencialmente. Luego vinculamos el chain SOLO_INTRANET al chain OUTPUT para que se aplique a los paquetes salientes. Y ya está.

Para borrar estos filtros haremos:
# iptables -F
Bueno, pues ya solo quedaría integrar estos comandos en los programas de gestión remota que usemos (p.e.: Aulalinex o epoptes) o bien en los scripts, crontabs o procesos desde donde queramos aplicarlos.

Al final los paquetes solo podrán ir, como muy lejos, a presidir la Comisión de Peticiones del Congreso. Y ojito, que les ponemos otro filtro si nos dejan.

No hay comentarios:

Publicar un comentario