Difference between revisions of "High Performance Firewall (Español)"

From ArchWiki
Jump to: navigation, search
m (Introducción)
m (Alto Rendimiento: sysctl configure file moved.)
 
(22 intermediate revisions by 10 users not shown)
Line 1: Line 1:
[[Category: Networking (Español)]]
+
[[Category:Firewalls (Español)]]
 +
[[en:High Performance Firewall]]
 +
[[it:High Performance Firewall]]
 +
{{merge|Router}}
 +
Imaginemos esta situación: tenemos más de dos redes separadas por un protocolo Lan Virtual (IEEE 802.1q) o VLAN, las cuales nos llegan a través de un conmutador inteligente/manejable en una línea troncal 10/100/1000 MB HD/FD (naturalmente lo mejor sería 1000 MB FD).
  
= Firewall/nat de alto rendimiento usando iptables, VLANs e ipoute2 =
+
Esta página nos introduce la forma de crear un Firewall/Nat de alto rendimiento con iptables, VLAN e iproute2. Entonces se podrá compartir Internet con un gran número de equipos y seguir manteniendo un buen rendimiento.  
 
+
=Introducción=
+
 
+
Hay una versión en inglés de este Doc [[High Performance Firewall/Nat with iptables and VLANs and iproute2]]
+
 
+
Imagina esto, tienes mas de 2 redes separadas por protocolo de VLAN trunk (IEEE 802.1q), las cuales llegan a ti via un punto de red Tagging (troncal) a través de un Switch administrable, en una linea 10/100/1000 (lo mejor es 100 FD naturalmente)
+
 
+
Tienes que compartir internet a un número realmente grande de equipos y mantener un buen rendimiento. La primera opción es separar las redes en un número igual de puertas "access" (no TAG) y tal ves un numero igual o mayor de equipos firewalls. Esto no es realmente barato, pero funciona.
+
 
+
La segunda opción es la que hice. La historua de como comenxo todo esto esta relacionada con una emergencia donde se frieron un grupo de Cisco PIXs. No voy a profundizar en el tema.
+
 
+
===Los Echos===
+
: Tengo alrededor de 4 redes con mascara 21, esto es 8 clases C cada una!!!. Esto genera una cantidad enorme de Direcciones MACs y ahun más peligroso un número ENORME de BRADCAST, Esto es una locura, pero asi es como trabaja mi empresa.
+
 
+
: Me diero 30 IPs públicas en 3 grupos
+
 
+
: Y un PC, uno pequeño, no era la gran cosa.... Solo para probar. Después (8 meses) lo cambiamos por un PC real. Un monstruo!!!
+
 
+
: Más tarde le añadimos una nueva clase C con un número creciente de subredes ruteadas .... EXTRA
+
 
+
=El Trabajo=
+
  
 
==Soporte de VLAN==
 
==Soporte de VLAN==
  
La primera cosa que tenemos que hacer es darle al kernel la capacidad de trabajar con JumboFrames (paquetes con TAG). Esto se hace añadiendo el modulo ''8021q'' al kernel
+
En primer lugar, crearemos una subred, como se indica en la página [[VLAN]].
# modprobe 8021q
+
Y/o ponerlo en la sección modules en /etc/rc.conf
+
 
+
Lo siguiente es crear las tarjetas virtuales con el comando ''vconfig''. Supongamos que tenemos las VLANes 20, 30, 40 y 50 en nuestra red troncal
+
# vconfig add ethX 20
+
# vconfig add ethX 30
+
...
+
# vconfig add ethX 50
+
Donde ''ethX'' es la nuestra tarjeta troncal. Para ver las tarjetas creadas colocamos el comando ''''ifconfig -a'''' y asi obtenemos una lista
+
 
+
Entonces.... ahora solo le ponemos las direcciones privadas a nuestras tarjetas (usando eth1 como troncal)
+
  # ifconfig eth1.20 192.168.0.1 netmask 255.255.248.0
+
# ifconfig eth1.30 192.168.8.1 netmask 255.255.248.0
+
...
+
  etc.
+
No voy a explica el orden da las IPs ni sus mascaras... eso es parte de tu propio estudio de networking
+
 
+
Hice una especie de daemon para esto. un archivo vlan.conf en /etc y uno vland en /etc/rc.d lo puedo compartir si quieren!!
+
 
+
 
+
==El Firewall==
+
 
+
Es realmente facil hacer un firewall/nat con ''iptables'' hay un monton de informacion y howtos y wikis al respecto
+
 
+
Solo manten en tu mente que vas a trabajar con un monton de tráfico, esto kiere decir, un monton de uso de CPU, asi es que manten tus reglas chiquitas, solo lo necesario, acepta todo por defecto, solo queremos hacer NAT, nada más...
+
 
+
Es buena idea acelerar ciertos puertos (80,442,25,110,21,20,53,etc), recuerda que cada paquete que pasa a través de nuestro firewall pasará a través de todas las reglas hasta que encuentre una que le calce o caiga en las politicas por defecto.
+
  
 
===El NAT round robin===
 
===El NAT round robin===
  
Si no sabes lo que es ''round robin'' googlea, pero la idea es esta. Pasa por la primera, después la siguiente y la siguiente y cuando se acaba vas de vuelta a la primera. Se aplica a muchas cosas.
+
Supongamos que tenemos una IP 200.AAA.BBB.6 y nuestro gateway es 200.AAA.BBB.1. Sin ningun problema podemos poner estos parámetros por defecto en nuestra configuracion. No va a afectar para nada a nuestro firewall.
 
+
Supongamos que tenemos una IP 200.AAA.BBB.6 y nuestro gateway es 200.AAA.BBB.1. Sin ningun problemas podemos poner estas parámetros por defecto en nuestra configuracion normal (/etc/rc.conf). No va a participar para nada en nuestro FIREWALL
+
  
Dije anteriormente que tenia 3 grupos de 10 IPs publicas cada uno...... Con esto, vamos a definir lo siguiente en el comienzo de nuestro script de firewall
+
Partimos del supuesto de que tenemos 3 grupos de 10 IP publicas cada uno... Con esto, vamos a definir lo siguiente en el comienzo de nuestro script de firewall:
 
  Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
 
  Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
 
  Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
 
  Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
 
  Gr3='200.AAA.EEE.10-200.AAA.EEE.20'
 
  Gr3='200.AAA.EEE.10-200.AAA.EEE.20'
'''Y las siguientes IMPORTANTES lineas:'''
+
'''Y las siguientes líneas importantes son:'''
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
 
  iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
 
  iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
 
  iptables -t nat -A POSTROUTING -s 192.168.15.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 30
 
  iptables -t nat -A POSTROUTING -s 192.168.15.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 30
 
  .... etc
 
  .... etc
Ahora, podemos jugar con esto, nótese que repetí el grupo 1 ($Gr1) para la vlan 30, podriamos tambien subdividir las redes ETC, iptables hace en forma automática Round Robin sobre cada grupo de IPs, no se necesita modificar nada!!!!
 
  
NO ES NECESARIO crear tarjetas virtuales (alias) para cada IP en cada grupo
+
Podemos repetir los grupos de acceso, subdividir las redes, etc. Iptables hace de forma automática ''round robin'' sobre Gr1, Gr2 y Gr3 por defecto, sin que sea necesaria modificación ulterior.
  
Es importante que cada router real (router BGP) conozca a cada grupo de IP (dirigidos a nuestra primera IP pública, la que está por defecto) y lo publique via BGP (o similar) a los router "vecinos".
+
No es necesario crear tarjetas virtuales (alias) para cada IP en cada grupo.
  
===tips===
+
Es importante que cada router real (router BGP) conozca a cada grupo y lo difunda a través de BGP (o similar) a los router «vecinos».
  
Para acelerar algunos puertos podemos poner esto en la cabeza de nuestra cadena FORWARD
+
===Sugerencias===
 +
 
 +
Para acelerar algunos puertos podemos poner lo siguiente en la cabeza de nuestra cadena {{ic|FORWARD}}:
 
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
 
  iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
 
  iptables -A FORWARD -p tcp -m multiport --dports 80,443,110,53 -j ACCEPT  # FAST FAST FAST  
 
  iptables -A FORWARD -p tcp -m multiport --dports 80,443,110,53 -j ACCEPT  # FAST FAST FAST  
 
  iptables -A FORWARD -p udp  --dport 53 -j ACCEPT
 
  iptables -A FORWARD -p udp  --dport 53 -j ACCEPT
Esto significa:
 
*Los paquetes de tráfico solo pasaran 1 regla si estos son de una coneccion establecida.
 
*Los paquetes de tráfico solo pasaran 2 reglas si son un PING o similar
 
*Los paquetes solo pasaran 3 reglas si son http, correo osimilar
 
*Y por ultimo los paquetes de DNS van a pasar3 o 4 reglas máximo antes de salir.
 
  
Los virus de los clientes van a matar el trafico de ti firewall, y no necesitamos conversaciones windows, asi que las bloqueamos
+
Esto significa:
 +
*Los paquetes de tráfico solo pasaran 1 regla si estos son de una conexion establecida.
 +
*Los paquetes de tráfico solo pasaran 2 reglas si son un PING o similar.
 +
*Los paquetes solo pasaran 3 reglas si son http, correo o similar.
 +
*Y por ultimo los paquetes de DNS van a pasar 3 o 4 reglas máximo antes de salir.
 +
Los virus de los clientes pueden matar el trafico de nuestro firewall, y no vamos a necesitar compartir conversaciones con windows, asi que las bloqueamos...
 
   #VIRUS
 
   #VIRUS
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
Line 95: Line 50:
 
  iptables -A FORWARD -p udp --dport 135:139 -j DROP
 
  iptables -A FORWARD -p udp --dport 135:139 -j DROP
 
  iptables -A FORWARD -p udp --dport 445 -j DROP
 
  iptables -A FORWARD -p udp --dport 445 -j DROP
Si se puede, antes que lleguen a nuestra máquina
+
 
 +
...si se puede, antes de que lleguen a nuestra máquina.
  
 
==Alto Rendimiento==
 
==Alto Rendimiento==
  
Llegamos a la parte que reamente importa de este Doc.
+
Llegamos a la parte que realmente importa de este documento.
 +
 
 +
En nuestra carrera por obtener un gran número de host pasando a través de nuestra máquina, olvidamos algunas cosas:
 +
# Que tenemos solo una tarjeta para, potencialmente, más de 8000 direcciones físicas (MAC). ¡La memoria compartida de la tarjeta no está preparada para esto!
 +
# Por defecto, iptables tampoco está preparado para trabajar con este gran número de conexiones simultáneas.
  
En nuestra carrera por obtener un gran número de hosts pasando a través de nuestra máquinas, olvidamos algunas cosas
+
Asi que...
# Olvidamos que es solo una targeta para, potencialmente, mas de 8000 direcciones físicas (MACs). La memoria compartida de la tarjeta no está preparada para esto!!!!!!
+
# Por defecto iptables tampoco está preparado para trabajar con este gran número de conecciones simultáneas
+
  
Asi que....
+
Para el primer problema... la solución es esta: aumentar el umbral de memoria para los vecinos.
  
Para el primer problema....
+
Escriba esto y lea:
Obtuve en su oportunidad me llegaron algunos mensajes de error relativos a esto..... Realmente lo siento, pero perdi estos logs y no recuerdo que decían.... Pero bueno, para solucionar esto tenemos que aumentar el umbral de la memoria a los "vecinos". Teclee esto y mire...
+
  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
Line 116: Line 73:
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh3  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh3  
 
  1024
 
  1024
Lo siguiente es poner esto en /etc/sysctrl.conf  
+
 
 +
Lo siguiente es poner este resultado en {{ic|/etc/sysctl.d/99-sysctl.conf}}::
 
  net.ipv4.neigh.default.gc_thresh1 = 512
 
  net.ipv4.neigh.default.gc_thresh1 = 512
 
  net.ipv4.neigh.default.gc_thresh2 = 1024
 
  net.ipv4.neigh.default.gc_thresh2 = 1024
 
  net.ipv4.neigh.default.gc_thresh3 = 2048
 
  net.ipv4.neigh.default.gc_thresh3 = 2048
Y ejecutar ''syscrtl -p'' para aumentar la memoria al doble!!!! (no se necesita reiniciar). Con esto eliminé los errores relativos a la tarjeta!!
+
Y ejecutar {{ic|syscrtl -p}} para aumentar la memoria al doble (no es necesario reiniciar). ¡Con esto eliminaremos los errores relativos a la tarjeta!
  
Lo siguiente necesitara algun conocimiento sobre buckets, conntracks y hashsize (la manera de como iptables maneja las conecciones NAT).
+
Para la siguiente parte necesitaremos algún conocimiento sobre buckets, conntracks y hashsize (la manera de cómo iptables maneja las conecciones NAT).  
Existe un muy buen documento acerca de esto [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt AQUÍ]. LEALO!!!!
+
Existe un buen documento acerca de esto [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt aquí]. ¡Léalo!
Algunas cosas han cambiado desde que IPtables se conoce ahora como Netfirter.
+
Algunas cosas han cambiado desde que IPtables se conoce ahora como Netfiler.
  
Para resumir!!!
+
En resumen:
escriba esto en su seccion de modulos en /etc/rc.conf
+
MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp
+
                                ...and other nf_stuff .......)
+
Lo último fué para eliminar ciertos problemas relativos a conecciones FTP que tuvimos en su oportunidad (creo que ya no es necesario, pero lo mantenemos por si acaso)
+
  
La seccion ''''nf_conntrack hashsize=1048576'''' incrementa el numero hashsize (incrementa la memoria del kernel destinada a las conecciones de NAT) (necesita reiniciar o '''recargar el módulo''' :) escriba ''dmesg | grep conntrack'' antes y despues para ver los cambios)
+
Escriba esto en la sección {{ic|MODULES}}:
 +
MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp
 +
                                ...y otros nf_stuff ...)
 +
Lo último es solo para evitar algunos de los problemas que podríamos tener con conexiones ftp (esto ya no es necesario, pero lo mantenemos por si acaso).
 +
La seccion ''''nf_conntrack hashsize=1048576'''' incrementa el numero hashsize (incrementa la memoria del kernel destinada a las conecciones de NAT) (necesita reiniciar o '''recargar el módulo''' :-) escriba {{ic|dmesg <nowiki>|</nowiki> grep conntrack}} antes y después, para ver los cambios).
  
Lo siguiente es poner algo similar en el archivo ''/etc/sysctrl.conf''
+
Lo siguiente es poner algo similar en el archivo {{ic|/etc/sysctl.d/99-sysctl.conf}}:
And the next is put some similar to the ''/etc/sysctrl.conf'' file
+
 
  ...
 
  ...
 
  net.netfilter.nf_conntrack_max = 1048576
 
  net.netfilter.nf_conntrack_max = 1048576
 
  ...
 
  ...
Y nuevamente el comando '''syscrtl -p''
+
Y nuevamente ejecutamos la orden {{ic|sysctl --system}}.
  
En mi caso es el mismo número, esto significa que tengo una coneccion por bucket (lea el documento). No necesito más. Por defecto iptables maneja una relacion de 1:8 es decir, 8 conecciones por bucket, con un bucket mucho mas reducido (no recuerdo bien si es esa la razon, por eso LEA EL DOC)
+
En mi caso, es el mismo número, esto significa que tengo una conexion por bucket. No necesito más. Por defecto NetFilter maneja una relación de 1:8, es decir, 8 conexiones por bucket (creo, no recuerdo bien).
  
En nuestro caso hemos llegado a tener mas de 600.000 conecciones simultáneas con 2 targetas de 1GB. Se puede obtener este numero con el siguiente comando:
+
En nuestro caso hemos llegado a tener mas de 600.000 conexiones simultáneas con 2 targetas de 1 GB. Se puede ver este numero con la siguiente orden:  
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
Y lo pueden poner en un agente snmp para poder graficarlo en algun Server MRTG/CACTI.............. tarea para la casa
+
Y se puede poner en un agente snmp para poder graficarlo en algún servidor MRTG/cacti.
 
+
Un ejemplo [http://200.112.232.3/conntrack.png aqui]. (Noactualizado, no siempre ahí, pero trataré :))
+
 
+
Finalmente
+
  
 
==Iproute2==
 
==Iproute2==
  
Tenemos 3 grandes accesos a Internet!!! Este es el porque manejo 3 grupos de Ips clase C en este firewall (relativo a algunas restricciones de BGP). Asi es que tenemos 3 traficos entrantes que podemos manejar, pero solo uno de salida!!! nuestro gateway principal.
+
¡Tenemos 3 grandes accesos a Internet! Esto se debe a que se trata de tres grupos de IP de clase C (relativo a algunas restricciones de BGP). Asi es que tenemos 3 traficos entrantes que podemos manejar, ¡pero solo uno de salida!, nuestro gateway principal. Esto podría fácilmente ocupar nuestro ancho de banda de salida. Asi que hay que separarlo.
Esto podría fácilmente ocupar nuestro ancho de banda de salida que contratamos. Asi que hay que separarlo.
+
  
Primero añadimos algunas tablas en el archivo ''/etc/iproute2/rt_tables''.
+
Primero, añadimos algunas tablas en el archivo {{ic|/etc/iproute2/rt_tables}}:
 
  # echo 200 PRO_1 >> /etc/iproute2/rt_tables
 
  # echo 200 PRO_1 >> /etc/iproute2/rt_tables
 
  # echo 205 PRO_2 >> /etc/iproute2/rt_tables
 
  # echo 205 PRO_2 >> /etc/iproute2/rt_tables
 
  # echo 210 PRO_3 >> /etc/iproute2/rt_tables
 
  # echo 210 PRO_3 >> /etc/iproute2/rt_tables
Puede ser menos, puede ser mas, depende del tráfico
+
Puede ser menos, o más, depende del tráfico.
  
Segundo, debemos dar un gateway por defecto a cada tabla
+
Segundo, debemos dar un gateway por defecto a cada tabla:
 
  # ip route add default via 200.aaa.bbb.2 table PRO_1
 
  # ip route add default via 200.aaa.bbb.2 table PRO_1
 
  # ip route add default via 200.aaa.bbb.3 table PRO_2
 
  # ip route add default via 200.aaa.bbb.3 table PRO_2
 
  # ip route add default via 200.aaa.bbb.4 table PRO_3
 
  # ip route add default via 200.aaa.bbb.4 table PRO_3
(200.aaa.bbb.2-3-4 son otros router BGP)
+
Es recomendable, pero no necesario (solo para obtener respuestas de pings o cosas similares), poner las redes locales y sus interfaces a cada tabla. Si no ponemos las siguientes líneas no obtendremos respuesta de ping en la red local, pero seguiremos teniendo conexión:
Es recomendado pero no necesario (solo para obtener respuestas de pings o cosas asi) poner las redes locales y sus interfaces a cada tabla.
+
 
  # ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
 
  # ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
 
  # ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
 
  # ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
 
  # ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
 
  # ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
  .....
+
  ...
  lo mismo PRO_2, lo mismo PRO_3
+
  same PRO_2, same PRO_3
Y la ñultima cosa es darle la orden a los paquetes entrantes
+
Y, la última operación, es darle la orden a los paquetes entrantes:
 
  # ip rule add from 192.168.0.0/21 table PRO_1
 
  # ip rule add from 192.168.0.0/21 table PRO_1
  ....
+
  ...
  ....
+
  ...
Nuevamente podemos jugar con las tablas, incluso se puede subdividir y o agarrar a una interface completa!!!!
+
Una vez más, podemos jugar con PRO_X, e, incluso, podemos jugar con la máscara y submáscara.
Por ejemplo solo le queremoas dar a una clase C acceso por la tabla PRO_3
+
Por ejemplo, si solo le queremos dar a una clase C acceso por la tabla PRO_3:
 
  # ip rule add from 192.168.1.0/24 table PRO_3
 
  # ip rule add from 192.168.1.0/24 table PRO_3
Hay que poner esto antes de la <NET>/21 anterior
+
Hay que colocar esto antes de {{ic|<NET>/21}}.
 
+
Y probar......
+
 
+
Tome un PC WIN/LIN/MAC en una de las redes privadas y haga un traceroute (tracert o similar) hacia alguna parte lejos de aqui
+
 
+
Antes de eso podria probar navegando a algun sitio que le entregue la ip como http://www.cualesmiip.es y ver cual es mi ip de salida instantanea, esperar un rato y volver a probar cual es la siguiente instantanea, etc.
+
 
+
 
+
=Conclusiones=
+
 
+
Actualmente estamos usando un PC con 2G Ram, Intel Pention 4 4.2 Dial y 2 NICs GB (una integrada y otra PCI-E), el máximo de CPU usada es menos de 80%....
+
 
+
Nuestro tráfico es cerca de los 180 MB de salida y entrada
+
 
+
Tenemos una poca de pérdida en las tarjetas. cerca de 1 paquete por segundo, comparado con el trafico es completamente despreciable
+
 
+
Ahún asi tubimos un solo gran problema, el correo/SPAM saliente provocado por VIRUS/CHICOS_MALOS pueden bloquear todas las IPs en muy poco tiempo (en las listas negras publicas).
+
 
+
Para resolver esto tuvimos que hacer algo no muy ético, pero tuvimos que hacerlo.
+
 
+
Pusimos una máquina similar antes de nuestro firewall en una configuración BRIDGE bloqueando y redireccionando cada trafico por el puerto 25 a otra máquina Anti SPAM/VIRUS.
+
 
+
Para hacer esto es necesario darle al bridge la capacidad de trabajar con VLANes y una targeta virtual en cada red (en modo bridge esto es: ''br0.30, br0.40 etc'') en cada red para darle respuesta al emisor de correo.
+
 
+
Funciona y el cliente no nota la diferencia.... Pero si hacemos ''telnet www.anywhere.net 25'' obtenemos un saludo ''Hi I'm a scanner'' como respuesta.  Es realmente bueno!!! y funciona!!! el correo saliente es enviado a traves de otra IP asi que nuestro grupo de 30 IPs se mantienen a salvo!!!.
+
 
+
Esto es todo amigos, tengo la esperanza de que esto ayuda a alguien, y es lo menos que puedo hacer para darles algo a cambio..
+
 
+
 
+
 
+
Sean fuertes, sean libres!!! PARA SIEMPRE!!!!!!!
+
 
+
 
+
 
+
 
+
:CarLost 15:13, 12 October 2007 (EDT)  from Chile
+
 
+
Gracias!!!
+

Latest revision as of 12:34, 14 November 2013

Merge-arrows-2.pngThis article or section is a candidate for merging with Router.Merge-arrows-2.png

Notes: please use the second argument of the template to provide more detailed indications. (Discuss in Talk:High Performance Firewall (Español)#)

Imaginemos esta situación: tenemos más de dos redes separadas por un protocolo Lan Virtual (IEEE 802.1q) o VLAN, las cuales nos llegan a través de un conmutador inteligente/manejable en una línea troncal 10/100/1000 MB HD/FD (naturalmente lo mejor sería 1000 MB FD).

Esta página nos introduce la forma de crear un Firewall/Nat de alto rendimiento con iptables, VLAN e iproute2. Entonces se podrá compartir Internet con un gran número de equipos y seguir manteniendo un buen rendimiento.

Soporte de VLAN

En primer lugar, crearemos una subred, como se indica en la página VLAN.

El NAT round robin

Supongamos que tenemos una IP 200.AAA.BBB.6 y nuestro gateway es 200.AAA.BBB.1. Sin ningun problema podemos poner estos parámetros por defecto en nuestra configuracion. No va a afectar para nada a nuestro firewall.

Partimos del supuesto de que tenemos 3 grupos de 10 IP publicas cada uno... Con esto, vamos a definir lo siguiente en el comienzo de nuestro script de firewall:

Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
Gr3='200.AAA.EEE.10-200.AAA.EEE.20'

Y las siguientes líneas importantes son:

iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
iptables -t nat -A POSTROUTING -s 192.168.15.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 30
.... etc

Podemos repetir los grupos de acceso, subdividir las redes, etc. Iptables hace de forma automática round robin sobre Gr1, Gr2 y Gr3 por defecto, sin que sea necesaria modificación ulterior.

No es necesario crear tarjetas virtuales (alias) para cada IP en cada grupo.

Es importante que cada router real (router BGP) conozca a cada grupo y lo difunda a través de BGP (o similar) a los router «vecinos».

Sugerencias

Para acelerar algunos puertos podemos poner lo siguiente en la cabeza de nuestra cadena FORWARD:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
iptables -A FORWARD -p tcp -m multiport --dports 80,443,110,53 -j ACCEPT  # FAST FAST FAST 
iptables -A FORWARD -p udp  --dport 53 -j ACCEPT

Esto significa:

  • Los paquetes de tráfico solo pasaran 1 regla si estos son de una conexion establecida.
  • Los paquetes de tráfico solo pasaran 2 reglas si son un PING o similar.
  • Los paquetes solo pasaran 3 reglas si son http, correo o similar.
  • Y por ultimo los paquetes de DNS van a pasar 3 o 4 reglas máximo antes de salir.

Los virus de los clientes pueden matar el trafico de nuestro firewall, y no vamos a necesitar compartir conversaciones con windows, asi que las bloqueamos...

 #VIRUS
iptables -A FORWARD -p tcp --dport 135:139 -j DROP
iptables -A FORWARD -p tcp --dport 445 -j DROP
iptables -A FORWARD -p udp --dport 135:139 -j DROP
iptables -A FORWARD -p udp --dport 445 -j DROP

...si se puede, antes de que lleguen a nuestra máquina.

Alto Rendimiento

Llegamos a la parte que realmente importa de este documento.

En nuestra carrera por obtener un gran número de host pasando a través de nuestra máquina, olvidamos algunas cosas:

  1. Que tenemos solo una tarjeta para, potencialmente, más de 8000 direcciones físicas (MAC). ¡La memoria compartida de la tarjeta no está preparada para esto!
  2. Por defecto, iptables tampoco está preparado para trabajar con este gran número de conexiones simultáneas.

Asi que...

Para el primer problema... la solución es esta: aumentar el umbral de memoria para los vecinos.

Escriba esto y lea:

# cat /proc/sys/net/ipv4/neigh/default/gc_thresh1 
128
# cat /proc/sys/net/ipv4/neigh/default/gc_thresh2 
512
# cat /proc/sys/net/ipv4/neigh/default/gc_thresh3 
1024

Lo siguiente es poner este resultado en /etc/sysctl.d/99-sysctl.conf::

net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh3 = 2048

Y ejecutar syscrtl -p para aumentar la memoria al doble (no es necesario reiniciar). ¡Con esto eliminaremos los errores relativos a la tarjeta!

Para la siguiente parte necesitaremos algún conocimiento sobre buckets, conntracks y hashsize (la manera de cómo iptables maneja las conecciones NAT). Existe un buen documento acerca de esto aquí. ¡Léalo! Algunas cosas han cambiado desde que IPtables se conoce ahora como Netfiler.

En resumen:

Escriba esto en la sección MODULES:

MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp 
                               ...y otros nf_stuff ...)

Lo último es solo para evitar algunos de los problemas que podríamos tener con conexiones ftp (esto ya no es necesario, pero lo mantenemos por si acaso). La seccion 'nf_conntrack hashsize=1048576' incrementa el numero hashsize (incrementa la memoria del kernel destinada a las conecciones de NAT) (necesita reiniciar o recargar el módulo :-) escriba dmesg | grep conntrack antes y después, para ver los cambios).

Lo siguiente es poner algo similar en el archivo /etc/sysctl.d/99-sysctl.conf:

...
net.netfilter.nf_conntrack_max = 1048576
...

Y nuevamente ejecutamos la orden sysctl --system.

En mi caso, es el mismo número, esto significa que tengo una conexion por bucket. No necesito más. Por defecto NetFilter maneja una relación de 1:8, es decir, 8 conexiones por bucket (creo, no recuerdo bien).

En nuestro caso hemos llegado a tener mas de 600.000 conexiones simultáneas con 2 targetas de 1 GB. Se puede ver este numero con la siguiente orden:

# cat /proc/sys/net/netfilter/nf_conntrack_count

Y se puede poner en un agente snmp para poder graficarlo en algún servidor MRTG/cacti.

Iproute2

¡Tenemos 3 grandes accesos a Internet! Esto se debe a que se trata de tres grupos de IP de clase C (relativo a algunas restricciones de BGP). Asi es que tenemos 3 traficos entrantes que podemos manejar, ¡pero solo uno de salida!, nuestro gateway principal. Esto podría fácilmente ocupar nuestro ancho de banda de salida. Asi que hay que separarlo.

Primero, añadimos algunas tablas en el archivo /etc/iproute2/rt_tables:

# echo 200 PRO_1 >> /etc/iproute2/rt_tables
# echo 205 PRO_2 >> /etc/iproute2/rt_tables
# echo 210 PRO_3 >> /etc/iproute2/rt_tables

Puede ser menos, o más, depende del tráfico.

Segundo, debemos dar un gateway por defecto a cada tabla:

# ip route add default via 200.aaa.bbb.2 table PRO_1
# ip route add default via 200.aaa.bbb.3 table PRO_2
# ip route add default via 200.aaa.bbb.4 table PRO_3

Es recomendable, pero no necesario (solo para obtener respuestas de pings o cosas similares), poner las redes locales y sus interfaces a cada tabla. Si no ponemos las siguientes líneas no obtendremos respuesta de ping en la red local, pero seguiremos teniendo conexión:

# ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
# ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
# ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
...
same PRO_2, same PRO_3

Y, la última operación, es darle la orden a los paquetes entrantes:

# ip rule add from 192.168.0.0/21 table PRO_1
...
...

Una vez más, podemos jugar con PRO_X, e, incluso, podemos jugar con la máscara y submáscara. Por ejemplo, si solo le queremos dar a una clase C acceso por la tabla PRO_3:

# ip rule add from 192.168.1.0/24 table PRO_3

Hay que colocar esto antes de <NET>/21.