[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