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

Eric Van Buggenhaut eric en sindominio.net
Vie Oct 17 03:03:23 CEST 2003


Hol@,

He incluido en el documento la parte de reserva de ancho de banda así
como las tablas de routing multiples y las configuraciones de núcleo.

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. Configuración del nucleo de FW1

Para que funcione el iproute, necesitamos configurar el núcleo para que provea
el socket NETLINK que nos interesa. En /usr/src/linux/.config vienen bastante
opciones que nos permiten adaptar el kernel a nuestras necesidades (para un núcleo
2.4.21):

        CONFIG_NETFILTER=y
        CONFIG_NETFILTER_DEBUG=y
	CONFIG_IP_NF_CONNTRACK=m
	CONFIG_IP_NF_FTP=m
	CONFIG_IP_NF_IRC=m
	CONFIG_IP_NF_IRC=m
	CONFIG_IP_NF_QUEUE=m
	CONFIG_IP_NF_IPTABLES=m
	CONFIG_IP_NF_MATCH_LIMIT=m
	CONFIG_IP_NF_MATCH_MAC=m
	CONFIG_IP_NF_MATCH_PKTTYPE=m
	CONFIG_IP_NF_MATCH_MARK=m
	CONFIG_IP_NF_MATCH_MULTIPORT=m
	CONFIG_IP_NF_MATCH_TOS=m
	CONFIG_IP_NF_MATCH_ECN=m
	CONFIG_IP_NF_MATCH_UNCLEAN=m
	CONFIG_IP_NF_MATCH_OWNER=m
	CONFIG_IP_NF_FILTER=m
	CONFIG_IP_NF_TARGET_REJECT=m
	CONFIG_IP_NF_TARGET_MIRROR=m
	CONFIG_IP_NF_NAT=m
	CONFIG_IP_NF_NAT_NEEDED=y
	CONFIG_IP_NF_TARGET_MASQUERADE=m
	CONFIG_IP_NF_TARGET_REDIRECT=m
	CONFIG_IP_NF_NAT_LOCAL=y
	# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
	CONFIG_IP_NF_NAT_IRC=m
	CONFIG_IP_NF_NAT_FTP=m
	CONFIG_IP_NF_MANGLE=m
	CONFIG_IP_NF_TARGET_TOS=m
	CONFIG_IP_NF_TARGET_ECN=m
	# CONFIG_IP_NF_TARGET_DSCP is not set
	CONFIG_IP_NF_TARGET_MARK=m
	CONFIG_IP_NF_TARGET_LOG=m
	# CONFIG_IP_NF_TARGET_ULOG is not set
	CONFIG_IP_NF_TARGET_TCPMSS=m
        # CONFIG_FILTER is not set
        CONFIG_UNIX=y
        CONFIG_INET=y
        # CONFIG_IP_MULTICAST is not set
        CONFIG_IP_ADVANCED_ROUTER=y
        CONFIG_NETLINK_DEV=y
        CONFIG_IP_MULTIPLE_TABLES=y
        CONFIG_IP_ROUTE_FWMARK=y
        CONFIG_IP_ROUTE_NAT=y
        CONFIG_IP_ROUTE_MULTIPATH=y
        CONFIG_IP_ROUTE_TOS=y
        CONFIG_IP_ROUTE_VERBOSE=y
        CONFIG_IP_ROUTE_LARGE_TABLES=y
        # CONFIG_IP_PNP is not set
        CONFIG_NET_IPIP=m
        CONFIG_NET_IPGRE=m
        # CONFIG_ARPD is not set
        # CONFIG_INET_ECN is not set
	
	apt-get install iproute
	modprobe ip_conntrack
	modprobe ip_conntrack_ftp
	for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done 
	echo 1 > /proc/sys/net/ipv4/ip_forward


3. Filtro de tráfico entrante y saliente (iptables en FW1)
	
	3.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.
	

	3.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


4. Balanceo de carga ADSL1/ADSL2
	4.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 64k de ADSL1 para streaming video, radio
		Trabajamos con tables de routing multiples con el
		fin de repartir el tráfico entre las 2 interfaces.

	4.2 Documentación
	Ver tc(8), tc-cbq(8), tc-cbq-details(8), tc-filters(8), etc.
	
	4.3 Configuración
	Solo queremos dirigir paquetes específicos a ADSL256, los
	demás siguen la ruta por defecto, que es el ADSL512
	
	echo 200 ADSL256 >> /etc/iproute2/rt_tables
	#Definimos 2 rutas por defecto
	ip route add default via <ip.interf.eth1> dev eth1 table ADSL256
	ip route add default via <ip.interf.eth0> dev eth0
	#Ahora definimos las reglas de eleccion de una ruta u otra
	ip rule add fwmark 1 lookup ADSL256
	#Y falta marcar los paquetes
	#el correo va por ADSL256
	iptables -A PREROUTING -i eth2 -t mangle -p tcp --dport 25 -j MARK --set-mark 1
	iptables -A PREROUTING -i eth3 -t mangle -p tcp --dport 25 -j MARK --set-mark 1
	#rsync va por ADSL256
	iptables -A PREROUTING -i eth2 -t mangle -p tcp --dport 873 -j MARK --set-mark 1
	iptables -A PREROUTING -i eth2 -t mangle -p ucp --dport 873 -j MARK --set-mark 1

	4.4 Reserva de ancho de banda
	No hay que olvidarse de que la reserva de ancho de banda solo
	se puede hacer sobre los paquetes que _se mandan_.
	El ADSL512 tiene una velocidad de upload de 128k. Reservamos
	la mitad (64k) para el streaming audio/video.

	#Definimos una disciplina raíz para las colas:
	#conexión de 128k y con un tamaño medio de paquete de 1000
	#bytes:

	tc qdisc add dev eth0 root handle 10: cbq bandwidth 128kbit avpkt 1000

	#Ahora generamos la clase raíz de la que cuelgan las demás:

	tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 128kbit \
	rate 128kbit allot 1514 weight 12.8kbit prio 8 maxburst 20 avpkt 1000

	#Y luego las dos clases hijas con su propio ancho de banda:

	#Esta primera clase no esta 'bounded', significa que puede
	#pillar ancho de banda de sus colegas
	tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 128kbit \
	rate 64kbit allot 1514 weight 6.4kbit prio 4 maxburst 20 avpkt 1000

	#Esta clase esta 'bounded', no puede sobrepasar 64k.
	tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 128kbit \
	rate 64kbit allot 1514 weight 6.4kbit prio 5 maxburst 20 avpkt 1000 \
	bounded
	
	#Ahora definimos que regla de gestión de cola queremos usar (sfq):
	
	tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
	tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15

	#Ahora vienen las reglas de asignación de las colas
	#Todo el video streaming va por la cola 10:100
	tc filter add dev eth0 parent 10:0 protocol ip u32 match tcp \
	8888 flowid 10:100

5. Masquerading (NAT/SNAT/DNAT)
	5.1 Objetivos
	Necesitamos que todos los paquetes de la red local salen con
	la misma IP

	iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
	iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE



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