[hackmeeting] RFC: configuración de la red + firewall en Iruña

Eric Van Buggenhaut eric en sindominio.net
Jue Oct 16 02:04:25 CEST 2003


Hol@,

Estando en Iruña el finde pasado, esbocé un plan de configuración de
la red así como reglas de cortafuego para que no se cuele algun@ con
el Kazaa/E-Donkey/E-Mule/Gnutella/Napster/Lopster/* de turno dejando a
los demás sin recursos. También se comtempla la obligación de usar el
proxy web y le relay de correo local.

La seconda cosa que propongo es que se gestione el ancho de banda de
modo eficaz, tendremos 2 lineas ADSL, una de 512k y otra de 256. Lo
que contemplamos al hablarlo el sábado era dejar los 512k para las
conexiones de alta prioridad (http, ...) y dedicar la linea de 256 a
las tareas de baja prioridad (smtp, ftp, apt-proxy, ...) y al
streaming audio/video, garantizado para ese último 128k gracias a
algun herramienta de gestión de ancho de banda. Esta última parte esta
todavía por escribir.

Espero vuestras respuestas, comentarios, colaboraciones para que esa
red sea de todos.

Un saludo,

-- 
"Un disco para gobernarlos a todos.
 Un disco para encontrarlos y atarlos en las tinieblas.
 En la tierra de Redmond donde se extienden las sombras"

Eric VAN BUGGENHAUT
eric en sindominio.net
------------ próxima parte ------------
Aqui viene la hoja de trabajo para la configuracion de la red y los
routers del H3ña.

Disponemos de lo siguiente:
	- linea 'ADSL1' 512k para salida a i-net con ip fija
	- linea 'ADSL2' 256k para salida a i-net con ip fija
	- router 'FW1' para enrutar trafico entre red puestos
	  clientes/servidores/i-net
	- servidor 'SERV1' donde se alojan servidores: dhcp, proxy,
	  apt-proxy, ftp, smtp saliente ... y lo que pueda surgir.
	- red interna que llamamos 'LOCAL' con masqueradeo

Un poco de arte gráfico ASCII para describir todo eso:

	      ADSL1 ADSL2
                |     |
                |     |
            eth0| eth1|
           ---------------               
           |              |                      -------------------------
           |              |eth2:10.0.0.1/8      |         SERV1           |
           |     FW1      |---------------------|10.0.0.2/8               |
           |              |                     |_________________________|
           |              |                         
           |  10.1.0.1/8  |                        
           ---------------                        
                  | eth3                        
                  |                            
                  |                           
          Red Interna (LOCAL)



1. Objetivos

Por razones de seguridad y de rendimiento de la conexión, NO debería haber tráfico
entre LOCAL y ADSL1/2

	FW1:
		filtro de tráfico entrante y saliente
		balanceo de carga entre ADSL1 y ADSL2
		enrutamiento de paquetes entre LOCAL, SERV1 y ADSL1/2

	SERV1:
		servidor DHCP (dhcp-server)
		servidor DNS (bind9)
		servidor SMTP (exim o postfix)
		servidor FTP (proftpd)
		servidor web intranet (apache+?)
		proxy web (squid)
		proxy apt (apt-proxy)

TODO: incluir posibilidad de servidor de streaming y IRC



2. Filtro de tráfico entrante y saliente (iptables en FW1)
	
	2.1 Objetivos
		FW1:
			PING cualquier red
			TRACEROUTE cualquier red
			Acceso DNS
		LOCAL:
			Autorizar ftp, traceroute, ssh, pop3 hacia ADSL
			Autorizar HTTP, SMTP, DNS, FTP, PROXY, APT-PROXY hacia SERV1
			Autorizar PING hacia FW1: asi comprueben que
			el router no esta caido (y no nos echan la
			culpa si una pagina externa no responde)
			Restringir todo lo demás.
		SERV1:
			Correo
				Autorizar SMTP hacia ADSL
				Aceptar SMTP desde LOCAL
			DNS
				Aceptar peticiones DNS desde LOCAL y
				FW1
			WEB
				Aceptar peticiones HTTP desde LOCAL
			RSYNC
				Autorizar rsync hacia ADSL

			Autorizar todos(?) los servicios hacia fuera
			(no nos compliquemos la vida)
			Restringir las conexiones entrantes.
	
	2.3 Modulos necesarios
		Para que funcionen las siguientes reglas de filtro, es
		IMPRESCINDIBLE:

		modprobe ip_conntrack
		modprobe ip_conntrack_ftp
		for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done 

	2.2 Reglas de iptables
	#Definimos las IPs de los varios servidores de dmz
	MAILSERVER=10.0.0.2
	WEBSERVER=10.0.0.2
	PROXYSERVER=10.0.0.2
	NAMESERVER=10.0.0.2
	FTPSERVER=10.0.0.2
	APTPROXYSERVER=10.0.0.2
	STREAMSERVER=10.0.0.2
	STREAMPORT=8888

	#Primero creamos cadenas para las varias conexiones posibles:
	iptables -N adsl1-adsl2
	iptables -N adsl1-dmz
	iptables -N adsl1-local
	iptables -N adsl2-adsl1
	iptables -N adsl2-dmz
	iptables -N adsl2-local
	iptables -N dmz-adsl1
	iptables -N dmz-adsl2
	iptables -N dmz-local
	iptables -N local-adsl1
	iptables -N local-adsl2
	iptables -N local-dmz
	iptables -N icmp-accept
	iptables -N NEVER
	iptables -N LOGDROP

	#Guardamos logs si pasa algo raro
	iptables -A NEVER -j LOG --log-level alert --log-prefix "filter ERROR: "
	iptables -A NEVER -j DROP
	iptables -A LOGDROP -m limit -j LOG --log-prefix "filter: "
	iptables -A LOGDROP -j DROP

	#Después de crear las cadenas, definimos a que conexion se
	#refieren:
	iptables -A FORWARD -i eth0 -o eth1 adsl1-adsl2
	iptables -A FORWARD -i eth0 -o eth2 adsl1-dmz
	iptables -A FORWARD -i eth0 -o eth3 adsl1-local
	iptables -A FORWARD -i eth1 -o eth0 adsl2-adsl1
	iptables -A FORWARD -i eth1 -o eth2 adsl2-dmz
	iptables -A FORWARD -i eth1 -o eth3 adsl2-local
	iptables -A FORWARD -i eth2 -o eth0 dmz-adsl1
	iptables -A FORWARD -i eth2 -o eth1 dmz-adsl2
	iptables -A FORWARD -i eth2 -o eth3 dmz-local
	iptables -A FORWARD -i eth3 -o eth0 local-adsl1
	iptables -A FORWARD -i eth3 -o eth1 local-adsl2
	iptables -A FORWARD -i eth3 -o eth2 local-dmz

	#Definimos la cadena de icmp
	iptables -A icmp-accept -p icmp --icmp-type destination-unreachable -j ACCEPT
	iptables -A icmp-accept -p icmp --icmp-type source-quench -j ACCEPT
	iptables -A icmp-accept -p icmp --icmp-type time-exceeded -j ACCEPT
	iptables -A icmp-accept -p icmp --icmp-type parameter-problem -j ACCEPT

	#Definimos las reglas de acceso de la red interna hacia la DMZ
	iptables -A local-dmz -p tcp -d $MAILSERVER --dport smtp -j ACCEPT
	iptables -A local-dmz -p udp -d $NAMESERVER --dport domain -j ACCEPT
	iptables -A local-dmz -p tcp -d $NAMESERVER --dport domain -j ACCEPT
	iptables -A local-dmz -p tcp -d $WEBSERVER --dport www -j ACCEPT
	iptables -A local-dmz -p tcp -d $PROXYSERVER --dport webcache -j ACCEPT
	iptables -A local-dmz -p tcp -d $FTPSERVER --dport ftp -j ACCEPT
	iptables -A local-dmz -p tcp -d $FTPSERVER --dport 1024:65535 -j ACCEPT
	iptables -A local-dmz -p tcp -d $APTPROXYSERVER --dport 9999 -j ACCEPT
	iptables -A local-dmz -p icmp -j icmp-accept
	iptables -A local-dmz -j LOGDROP

	#Definimos las reglas de acceso de la DMZ hacia la red interna
	iptables -A dmz-local -p tcp ! --syn -s $MAILSERVER smtp -j ACCEPT
	iptables -A dmz-local -p udp -s $NAMESERVER domain -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $NAMESERVER domain -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $WEBSERVER www -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $PROXYSERVER webcache -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $FTPSERVER ftp -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $FTPSERVER 1024:65535 -j ACCEPT
	iptables -A dmz-local -p tcp ! --syn -s $APTPROXYSERVER 9999 -j ACCEPT
	iptables -A dmz-local -p icmp -j icmp-accept
	iptables -A dmz-local -j NEVER


	#Definimos las reglas de acceso de adsl512 hacia DMZ:
	#normalmente no se acceptan conexiones desde fuera
	iptables -A adsl1-dmz -p icmp -j icmp-accept
	iptables -A adsl1-dmz -j DROP

	#Definimos las reglas de acceso de adsl256 hacia DMZ:
	#normalmente solo se acceptan conexiones de streaming
	iptables -A adsl2-dmz -p tcp $STREAMSERVER --dport $STREAMPORT -j ACCEPT
	iptables -A adsl2-dmz -p icmp -j icmp-accept
	iptables -A adsl2-dmz -j DROP

	#Definimos las reglas de salida de la red local hacia i-net
	#via adsl512
	#Dejamos pasar ssh
	iptables -A local-adsl1 -p tcp --dport ssh -j ACCEPT
	iptables -A local-adsl1 -p udp --dport 33434:33500 -j ACCEPT
	iptables -A local-adsl1 -p icmp --icmp-type ping -j ACCEPT
	iptables -A local-adsl1 -j LOG
	iptables -A local-adsl1 -j REJECT
	
	#Dejamos pasar los paquetes de vuelta de adsl512 a la red
	#interna
	#iptables -A adsl1-local -p tcp ! --syn --sport ssh -j ACCEPT
	#iptables -A adsl1-local -p tcp ! --syn --sport 1024:65535 -j ACCEPT
	#iptables -A adsl1-local -p icmp --icmp-type pong -j ACCEPT
	#iptables -A adsl1-local -j DROP
	iptables -A external-internal -m state --state ESTABLISHED,RELATED -j ACCEPT
	iptables -A external-internal -j DROP

	#Definimos las reglas de salida de la red local hacia i-net
	#via adsl256
	#dejamos pasar ftp y pop3
	iptables -A local-adsl2 -p tcp --dport ftp -j ACCEPT
	iptables -A local-adsl2 -p tcp --dport 1024:65535 -j ACCEPT
	iptables -A local-adsl2 -p tcp --dport pop3 -j ACCEPT
	iptables -A local-adsl2 -j LOG
	iptables -A local-adsl2 -j REJECT

	#Dejamos volver los paquetes de respuesta de adsl256 a la red
	#interna
	#iptables -A adsl2-local -p tcp ! --syn --sport ftp -j ACCEPT
	#iptables -A adsl2-local -p tcp ! --syn --sport 1024:65535 -j ACCEPT
	#iptables -A adsl2-local -p icmp --icmp-type pong -j ACCEPT
	#iptables -A adsl2-local -j DROP
	iptables -A external-internal -m state --state ESTABLISHED,RELATED -j ACCEPT
	iptables -A external-internal -j DROP

	#Definimos las reglas de salida de dmz hacia adsl512
	iptables -A dmz-adsl1 -p udp --dport domain -j ACCEPT
	iptables -A dmz-adsl1 -p tcp --dport domain -j ACCEPT
	iptables -A dmz-adsl1 -p tcp --dport www -j ACCEPT
	iptables -A dmz-adsl1 -p tcp --dport webcache -j ACCEPT
	iptables -A dmz-adsl1 -p tcp --dport rsync -j ACCEPT
	iptables -A dmz-adsl1 -p tcp --dport ssh -j ACCEPT
	iptables -A dmz-adsl1 -p icmp -j icmp-accept
	iptables -A dmz-adsl1 -j NEVER

	#Definimos las reglas de salida de dmz hacia adsl256
	iptables -A dmz-adsl2 -p tcp --dport smtp -j ACCEPT
	iptables -A dmz-adsl2 -p tcp --dport ftp -j ACCEPT
	iptables -A dmz-adsl2 -p tcp --dport 1024:65535 -j ACCEPT
	iptables -A dmz-adsl1 -p icmp -j icmp-accept
	iptables -A dmz-adsl2 -j NEVER

	#Normalemente no pasan los paquetes de adsl512 a adsl256
	iptables -A adsl1-adsl2 -j NEVER

	#Normalemente no pasan los paquetes de adsl256 a adsl512
	iptables -A adsl2-adsl1 -j NEVER

	#Por fin podemos proteger las mismas interfaces
	iptables -N adsl-if
	iptables -N dmz-if
	iptables -N local-if
	iptables -A INPUT -i eth0 -j adsl-if
	iptables -A INPUT -i eth1 -j adsl-if
	iptables -A INPUT -i eth2 -j dmz-if
	iptables -A INPUT -i eth3 -j local-if
	iptables -A adsl-if -p icmp --icmp-type pong -j ACCEPT
	iptables -A adsl-if -j icmp-accept
	iptables -A adsl-if -j DROP
	iptables -A dmz-if -p tcp ! --syn -s $NAMESERVER 53 -j ACCEPT
	iptables -A dmz-if -p udp -s $NAMESERVER 53 -j ACCEPT
	iptables -A dmz-if -p icmp --icmp-type pong -j ACCEPT
	iptables -A dmz-if -j icmp-accept
	iptables -A dmz-if -j NEVER
	iptables -A local-if -p icmp --icmp-type ping -j ACCEPT
	iptables -A local-if -p icmp --icmp-type pong -j ACCEPT
	iptables -A local-if -j icmp-accept
	iptables -A local-if -j LOGDROP


3. Masquerading (NAT/DNAT)
	3.1 Requisitos
	Para que funcione necesitamos instalar el paquete iproute2


4. Balanceo de carga ADSL1/ADSL2
	3.1 Objetivos
		Orientar el tráfico de alta prioridad hacia ADSL1
		(512k) es decir WEB, DNS
		Orientar el tráfico de baja prioridad hacia ADSL2
		(256k) es decir SMTP, APT-PROXY
		Reservar 192k de ADSL2 para streaming video, radio
	


Más información sobre la lista de distribución HackMeeting