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

From ArchWiki
Jump to: navigation, search
m
(Link to VLAN.)
(23 intermediate revisions by 9 users not shown)
Line 1: Line 1:
[[Category: Networking (Español)]]
+
[[Category:Networking (Español)]]
 +
[[Category:Security (Español)]]
 +
[[en:High Performance Firewall]]
 +
[[it:High Performance Firewall]]
 +
Imagina esto, tienes más 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 línea 10/100/1000 (lo mejor es 100 FD naturalmente)
  
= Firewall/nat de alto rendimiento usando iptables, VLANs e ipoute2 =
+
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.
  
=Introducción=
+
La segunda opción es la que hice. La historia de como comenzó todo esto esta relacionada con una emergencia donde se quemaron/frieron un grupo de Cisco PIXs. No voy a profundizar en el tema.
  
Holas, este es mi segundo Wiki, el primero es el mismo version Ingles, espero les sirva.
+
===Los Hechos===
 +
: Tengo alrededor de 4 redes no enrutadas, con máscara 21, esto es 8 clases C cada una!!!. Esto genera una cantidad enorme de Direcciones MACs y aun más peligroso un número ENORME de BRADCAST, Esto es una locura, pero así es como trabaja mi empresa.
  
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)
+
: Me dieron 30 IPs públicas en 3 grupos
  
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.
+
: Y un PC, uno pequeño, no era gran cosa.... Sólo para probar. Después (8 meses) lo cambiamos por un PC real. Un monstruo!!!
  
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.
+
: Más tarde le añadimos una nueva clase C con un número creciente de subredes enrutadas .... EXTRA
 
+
===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=
 
=El Trabajo=
Line 26: Line 22:
 
==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
+
First, create sub-network as in page [[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==
 
==El Firewall==
Line 59: Line 36:
 
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.
 
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 problemas podemos poner estas parámetros por defecto en nuestra configuracion normal (/etc/rc.conf)
+
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
Let's suppose we have a one ip: 200.aaa.bbb.6 and our gateway is 200.aaa.bbb.1. we can safely put this parameters by default in our configuration. It will not get participation at all in our firewall.
+
 
+
I say I have 3 groups of 10 IPs each to play...... we'll define the NEXT in our firewall script:
+
 
  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'
'''And the next important line is:'''
+
'''Y las siguientes IMPORTANTES lineas:'''
 
  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!!!!
  
You can repeat the groups for access, subdivide the networks ETC, iptables make a round robin over the Gr1, Gr2 and Gr3 by default, no modification is needed.
+
NO ES NECESARIO crear tarjetas virtuales (alias) para cada IP en cada grupo
  
It's not necessary create a virtual card (alias) to every IP in the group.
+
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".
 
+
It's important that every real router know every group and publish its via BGP (or similar) to the neighbors.
+
  
 
===tips===
 
===tips===
  
To accelerate some ports you can put this in the top of FORWARD chain
+
Para acelerar algunos puertos podemos poner esto en la cabeza de nuestra cadena 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.
  
This mean:
+
Los virus de los clientes van a matar el trafico de ti firewall, y no necesitamos conversaciones windows, asi que las bloqueamos
*the packets incoming will pass only 1 rule if it is a establish connection
+
*the packet incoming will pass 2 rules if is a ping o similar
+
*the packet will pass 3 rules if is http, mail or similar
+
*and the DNS recuest will pass 3 o 4 rules until go out
+
 
+
The virus outcoming will KILL our machine, and we not need to share "windows" conversatios so, kill them!!!!
+
 
   #VIRUS
 
   #VIRUS
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
Line 100: Line 72:
 
  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
  
If you can, before they reach our machine.
+
==Alto Rendimiento==
  
==The High Performance==
+
Llegamos a la parte que reamente importa de este Doc.
  
We get to the real important part of this howto.
+
En nuestra carrera por obtener un gran número de hosts pasando a través de nuestra máquinas, olvidamos algunas cosas
 +
# 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
  
In our run to get a really big numbers of host running trough our machine we miss some things
+
Asi que....
# We forget that is just one NICs to potentially more than 8000 Mac Addresses. The card shared memory is not prepare to this!!!!!
+
# By default iptables is not prepare to make this numbers of connections simultaneously !!!!!!
+
  
So...
+
Para el primer problema....
 
+
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...
To the first isue...
+
I get some error messages in the logs realtive to this.... I'm really sorry, I lost this logs and don't remember what they say. But the answer is this... increase the treshold memory to the neighbors.
+
Type this and read:
+
  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
Line 123: Line 93:
 
  # 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
Next you can put this in the /etc/sysctrl
+
 
  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
and make ''sysctl -p'' to increase to the double!!! (no reboot needed) with this I get no errors!!!!!
+
Y ejecutar ''syscrtl -p'' para aumentar la memoria al doble!!!! (no se necesita reiniciar). Con esto eliminé los errores relativos a la tarjeta!!
  
The next will need some comprehension about buckets and conntracks and hashsize (the way how iptables manage the nat connections).
+
Lo siguiente necesitara algun conocimiento sobre buckets, conntracks y hashsize (la manera de como iptables maneja las conecciones NAT).
There is a very good document about this in [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt here]. Read it!!!!
+
Existe un muy buen documento acerca de esto [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt AQUÍ]. LEALO!!!!
Some thing are change since IPtables is know as Netfiler.
+
Algunas cosas han cambiado desde que IPtables se conoce ahora como Netfirter.
  
In resume!!!
+
Para resumir!!!
Put this in your modules section:
+
escriba esto en su seccion de modulos en /etc/rc.conf
 
  MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp  
 
  MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp  
 
                                 ...and other nf_stuff .......)
 
                                 ...and other nf_stuff .......)
The last ones is just to avoid some problems tha we have with ftp connections (I thing this is no necessary anymore).
+
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)
The ''''nf_conntrack hashsize=1048576'''' increase the numbers of the hashsize (increase the kernel memory designated to NAT connections) (need reboot or '''reload module''' :-) see with ''dmesg | grep conntrack'')
+
  
 +
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)
 +
 +
Lo siguiente es poner algo similar en el archivo ''/etc/sysctrl.conf''
 
And the next is put some similar to the ''/etc/sysctrl.conf'' file
 
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
 
  ...
 
  ...
And do the ''sysctl -p'' command
+
Y nuevamente el comando '''syscrtl -p''
  
In my case is the same number, thats mean that I have 1 coneccion for bucket!!!! I don't need more!!!! by default NetFilter put rate of 1:8. I.E. 8 conections per bucket!! (I think, not remmember well)..
+
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)
  
In our case we get about 600.000 simultaneous connections in 2 1Giga NICs cards, You can see this with the next command
+
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:
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
And put this in a snmpd agent to get and graph it in a MRTG/cacti server  ..... uuuuuuu homework
+
Y lo pueden poner en un agente snmp para poder graficarlo en algun Server MRTG/CACTI.............. tarea para la casa
  
A sample [http://200.112.232.3/conntrack.png here]. (Not actualized, not ever here, but I'll try.)
+
Un ejemplo [http://carlost.890m.com/conntrack.png aqui]. (Noactualizado, no siempre ahí, pero trataré :))
  
Finally
+
Finalmente
  
==The iproute2==
+
==Iproute2==
  
We have 3 big access to Internet!!! this is because we manage 3 class C groups of IPs  (some restrictions of BGP) in this firewall. So, we have 3 incoming traffics that we can manage, but only one outgoing!!! our default gateway.
+
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.
This can easily full our outgoing quote, so we have to spare it
+
Esto podría fácilmente ocupar nuestro ancho de banda de salida que contratamos. Asi que hay que separarlo.
  
First we have to put some new tables to ''/etc/iproute2/rt_tables'' file
+
Primero añadimos algunas tablas en el archivo ''/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
Can be more, can be less, depends on traffic
+
Puede ser menos, puede ser mas, depende del tráfico
  
Second we have to give a default gateway to this tables
+
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
It's recommended but not necesary put the local interfaces to each table
+
(200.aaa.bbb.2-3-4 son otros router BGP)
 +
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
 
  .....
 
  .....
  same PRO_2, same PRO_3
+
  lo mismo PRO_2, lo mismo PRO_3
The last thing is give the order to the incoming packages
+
Y la ñultima cosa 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
 
  ....
 
  ....
 
  ....
 
  ....
Again, you can play with the PRO_X and even you can play with the mask and submask
+
Nuevamente podemos jugar con las tablas, incluso se puede subdividir y o agarrar a una interface completa!!!!
For example we want to give only a one class C to outgoing to PRO_3
+
Por ejemplo solo le queremoas 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
Put this before the <NET>/21  
+
Hay que poner esto antes de la <NET>/21 anterior
 
+
and then TEST IT!!!!
+
  
pick a WinPC in one of the private networks and make a tracert to somewhere!!!
+
Y probar......
  
Before this, you can browse to a some MYIPsite like www.whatismyip.com and get your "RightNow" address, test it later and get some other address ETC...
+
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
  
=Conclusions=
+
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.
  
Actually we are using a PC with 1G ram , Intel Pentium 4 2.8GHz Dual and 2 NICs 1Gb (one integrated one PCI-E), the top CPU usage don't get the 80% pic...
 
  
Out traffics is about 180 MB IN/OUT.
+
=Conclusiones=
  
We get some lost in the cards, about 1 packets per second, it's really low compared with the traffic, so we just don't care..
+
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%....
  
Nevertheless we get a big problem, the MAIL/SPAM outgoing, provoked by VIRUS/MAD_GUYs, can block all the publics IP in a really short time. (in the public Black Lists).
+
'''Actualización'''
 +
* Recibí una gran sorpresa cuando actualicé el paquete net-snmp a la versión 5.4.1 (la cual utilizo para obtener las estadísticas), el uso de CPU bajo de un 80% a casi un 3%, y lo comprobé actualizando el bridge del cual hablo mas abajo...Con esto concluyo que tenemos para ponerle aun mucho más tráfico
  
The answer to this may be not really ethic, but we have to do it.
+
Nuestro tráfico es cerca de los 180 MB de salida y entrada
  
We put a similar machine before this one with a bridge configuration blocking every port 25 traffic and sending to another anti SPAM/VIRUS/MAIL machine.  
+
Tenemos una poca de pérdida en las tarjetas. cerca de 1 paquete por segundo, comparado con el trafico es completamente despreciable
  
To do this is necessary give to the bridge the capacity of VLANs and one virtual card (in bridge mode i.e.'br0.30') in every net to answer to the sender...
+
'''Actualización'''
 +
* Con la actualización ya no tenemos ninguna perdida
  
It works and the costumer don't note the difference .... Just if you do a ''telnet anywhere.net 25'' you get a '''Hi I'm a scanner''' hello answer!!!.. It's really good!!! and works, the mail outgoing is sender from another IP, so we get our 3 groups safe!!!.
+
Aún así tuvimos 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).
  
Thats all folks, I hope this can help anyone, and it's the only thing I can do to give you something back..
+
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.
  
Be strong, be free, 4 ever
+
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!!!.
  
: CarLost 11:51, 12 October 2007 (EDT)  from Chile
+
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!!!!!!!
  
 +
:[[User:CarLost|CarLost]] 15:13, 12 October 2007 (EDT)  from Chile
  
PS: English is not my natural language, I ask you forgive me if there is some uncomprehensive stuff, and feel free to improve this if you want!!!!
+
Gracias!!!

Revision as of 07:12, 8 March 2013

Imagina esto, tienes más 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 línea 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 historia de como comenzó todo esto esta relacionada con una emergencia donde se quemaron/frieron un grupo de Cisco PIXs. No voy a profundizar en el tema.

Los Hechos

Tengo alrededor de 4 redes no enrutadas, con máscara 21, esto es 8 clases C cada una!!!. Esto genera una cantidad enorme de Direcciones MACs y aun más peligroso un número ENORME de BRADCAST, Esto es una locura, pero así es como trabaja mi empresa.
Me dieron 30 IPs públicas en 3 grupos
Y un PC, uno pequeño, no era gran cosa.... Sólo 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 enrutadas .... EXTRA

El Trabajo

Soporte de VLAN

First, create sub-network as in page VLAN.

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

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

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 IMPORTANTES lineas:

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

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

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

tips

Para acelerar algunos puertos podemos poner esto 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 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

 #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 que lleguen a nuestra máquina

Alto Rendimiento

Llegamos a la parte que reamente importa de este Doc.

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

  1. 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!!!!!!
  2. Por defecto iptables tampoco está preparado para trabajar con este gran número de conecciones simultáneas

Asi que....

Para el primer problema.... 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 
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 esto en /etc/sysctrl.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 se necesita reiniciar). Con esto eliminé 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). Existe un muy buen documento acerca de esto AQUÍ. LEALO!!!! Algunas cosas han cambiado desde que IPtables se conoce ahora como Netfirter.

Para resumir!!! 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)

Lo siguiente es poner algo similar en el archivo /etc/sysctrl.conf And the next is put some similar to the /etc/sysctrl.conf file

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

Y nuevamente el comando 'syscrtl -p

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 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:

# 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

Un ejemplo aqui. (Noactualizado, no siempre ahí, pero trataré :))

Finalmente

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

# 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, puede ser mas, 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

(200.aaa.bbb.2-3-4 son otros router BGP) 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.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
.....
lo mismo PRO_2, lo mismo PRO_3

Y la ñultima cosa es darle la orden a los paquetes entrantes

# 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!!!! Por ejemplo solo le queremoas 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 poner esto antes de la <NET>/21 anterior

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

Actualización

  • Recibí una gran sorpresa cuando actualicé el paquete net-snmp a la versión 5.4.1 (la cual utilizo para obtener las estadísticas), el uso de CPU bajo de un 80% a casi un 3%, y lo comprobé actualizando el bridge del cual hablo mas abajo...Con esto concluyo que tenemos para ponerle aun mucho más tráfico

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

Actualización

  • Con la actualización ya no tenemos ninguna perdida

Aún así tuvimos 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!!!