[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