Gentoo Archives: gentoo-commits

From: "Jose Luis Rivero (yoswink)" <yoswink@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo commit in xml/htdocs/doc/es/articles: dynamic-iptables-firewalls.xml
Date: Fri, 02 Nov 2007 15:16:50
Message-Id: E1InxrV-0007LT-Oz@stork.gentoo.org
1 yoswink 07/11/02 14:51:05
2
3 Added: dynamic-iptables-firewalls.xml
4 Log:
5 New translation about iptables
6
7 Revision Changes Path
8 1.1 xml/htdocs/doc/es/articles/dynamic-iptables-firewalls.xml
9
10 file : http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/es/articles/dynamic-iptables-firewalls.xml?rev=1.1&view=markup
11 plain: http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/es/articles/dynamic-iptables-firewalls.xml?rev=1.1&content-type=text/plain
12
13 Index: dynamic-iptables-firewalls.xml
14 ===================================================================
15 <?xml version='1.0' encoding="UTF-8"?>
16 <!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/es/articles/dynamic-iptables-firewalls.xml,v 1.1 2007/11/02 14:51:05 yoswink Exp $ -->
17 <!DOCTYPE guide SYSTEM "/dtd/guide.dtd">
18
19 <guide link="/doc/es/articles/dynamic-iptables-firewalls.xml" disclaimer="articles" lang="es">
20 <title>Cortafuegos dinámicos iptables</title>
21
22 <author title="Autor">
23 <mail link="drobbins@g.o">Daniel Robbins</mail>
24 </author>
25 <author title="Traductor">
26 <mail link="LinuxBlues@×××××××××.org">LinuxBlues</mail>
27 </author>
28
29 <abstract>
30 Los cortafuegos son buenos y divertidos, pero ¿qué podemos hacer cuando se
31 necesitan cambios rápidos y complejos en las reglas de nuestro cortafuegos?
32 Fácil, usar las macros de Daniel Robbins para crear cortafuegos dinámicos que
33 se muestran en este artículo. Se pueden usar dichas macros para incrementar la
34 seguridad y el rendimiento de nuestro tráfico de red y para inspirar nuestros
35 propios diseños creativos.
36 </abstract>
37
38 <!-- The original version of this article was published on IBM developerWorks,
39 and is property of Westtech Information Services. This document is an updated
40 version of the original article, and contains various improvements made by the
41 Gentoo Linux Documentation team -->
42
43 <version>1.3</version>
44 <date>2005-10-09</date>
45
46 <chapter>
47 <title>Introducción</title>
48 <section>
49 <title>Seguridad de red flexible (y divertida)</title>
50 <body>
51
52 <p>
53 La mejor forma de ver los beneficios de las macros de cortafuegos dinámicos es
54 verlas en acción. Para lograr esto, imaginemos que soy el administrador de un
55 proveedor de servicios de internet (ISP) y que he configurado un cortafuegos
56 Linux para proteger a mis clientes y a los sistemas internos de usuarios
57 maliciosos en internet. Para lograrlo, mi cortafuegos utiliza la completa
58 funcionalidad de iptables en el núcleo 2.4 para permitir que las conexiones de
59 salida sean establecidas por mis clientes y servidores y, por supuesto, para
60 permitir conexiones entrantes, pero sólo para los servicios "públicos", como
61 web, ftp, ssh y SMTP. Dado que he usado un diseño de denegación por defecto,
62 cualquier conexión de internet a cualquier servicio que no sea público, como la
63 caché de proxy de squid o el servidor Samba, serán automáticamente rechazadas.
64 De hecho, tengo un cortafuegos muy decente que ofrece un buen nivel de
65 protección para cualquiera de nuestros clientes en la ISP.
66 </p>
67
68 <p>
69 Durante la primera semana o así, el cortafuegos funciona estupendamente, pero
70 entonces algo malo ocurre: Roberto, alguien que trabaja en un ISP de la
71 competencia, decide inundar mi red con paquetes en un intento por denegar el
72 servicio a mis clientes. Lamentablemente, Roberto ha estudiado cuidadosamente
73 mi cortafuegos y sabe que mientras que estoy protegiendo muchos servicios
74 internos, los puertos 25 y 80 deben estar públicamente accesibles, por lo que
75 puedo recibir correo y servir solicitudes HTTP. Roberto decide aprovecharse de
76 ello lanzando un ataque que consuma la mayor parte del ancho de banda contra mi
77 servidor web y de correo.
78 </p>
79
80 <p>
81 En aproximadamente un minuto o así Roberto comienza su ataque, noto que la
82 conexión al satélite comienza a verse saturada con paquetes. Después de echar
83 un vistazo a la situación con <c>tcpdump</c> determino que este es otro ataque
84 de Roberto, y averiguo las direcciones IP que está usando para ello. Ahora que
85 dispongo de esta información, lo único que necesito hacer es bloquear estas
86 direcciones IP, con ello se resolverá el problema -- una solución bastante
87 sencilla, según creo.
88 </p>
89
90 </body>
91 </section>
92
93 <section>
94 <title>Responder a un ataque</title>
95 <body>
96
97 <p>
98 Cargo inmediatamente la macro con la configuración de mi cortafuegos en vi y
99 comienzo a buscar una solución en mis reglas iptables, modificando mi
100 cortafuegos para que bloquee los paquetes entrantes que manda Roberto. Después
101 de un minuto o así, encuentro el lugar exacto para hacer la modificación
102 adecuada en la regla DROP y la añado. Entonces reinicio el cortafuegos, pero
103 cometí un pequeño error al crear las reglas. Cargo las macros del cortafuegos
104 de nuevo, resuelvo el problema y treinta segundos después el cortafuegos está
105 listo para bloquear el ataque del mes de Roberto. Al principio parece que he
106 frustrado el ataque... Hasta que los teléfonos de la compañía comienzan a
107 sonar. Aparentemente, Roberto ha sido capaz de inhabilitar mi red durante 10
108 minutos y ahora los clientes llaman para saber qué es lo que ha sucedido. Aún
109 peor, después de unos minutos noto que la conexión al satélite vuelve a estar
110 saturada de nuevo. Parece que Roberto está usando un nuevo conjunto de
111 direcciones IP para sus ataques. En respuesta, comienzo a revisar las macros
112 del cortafuegos, excepto que en esta ocasión estoy un poco asustado -- después
113 de todo, puede que mi solución no sea tan buena.
114 </p>
115
116 <p>
117 Esto es lo que fue mal en la sitación anterior. A pesar de que tengo un
118 cortafuegos decente en el lugar y de que identifiqué rápidamente la causa del
119 problema en la red, no fui capaz de modificar el funcionamiento de mi
120 cortafuegos para responder al problema a tiempo. Por supuesto, cuando atacan
121 nuestra red, querríamos responder inmediatamente y vernos forzados a alterar la
122 configuración del archivo de comandos de nuestro cortafuegos atemorizados, no
123 sólo incrementará nuestro estrés, sino que además será muy poco eficaz.
124 </p>
125
126 </body>
127 </section>
128 </chapter>
129
130 <chapter>
131 <title>Macros</title>
132 <section>
133 <title>ipdrop</title>
134 <body>
135
136 <p>
137 Sería mucho mejor si tuviera una macro especial <c>ipdrop</c> que está diseñada
138 con el propósito específico de insertar las reglas necesarias para bloquear las
139 direcciones IP que se le especifiquen. Con dicha macro, bloquear con un
140 cortafuegos no volverá a requerir dos minutos; le tomará cinco segundos como
141 mucho. Dado que la macro me evita la tarea de editar las reglas del cortafuegos
142 a mano, elimina la mayor fuente de problemas. Todo lo que me queda por hacer es
143 determinar la dirección IP que debería bloquear y teclear después:
144 </p>
145
146 <pre caption="Ignorar una IP">
147 # <i>ipdrop 129.24.8.1 on</i>
148 IP 129.24.8.1 drop on.
149 </pre>
150
151 <p>
152 La macro ipdrop bloqueará inmediatamente 129.24.8.1, la dirección IP mala de
153 Roberto por esta semana. Esta macro mejora nuestras defensas sustancialmente,
154 dado que bloquear ahora una IP ni tan siquiera requiere pensar. Veamos ahora la
155 implementación de mi macro ipdrop:
156 </p>
157
158 <pre caption="macro ipdrop">
159 #!/bin/bash
160
161 source /usr/local/share/.sh
162
163 args 2 $# "${0} IPADDR {on/off}"
164
165 <comment># Drops packets to/from IPADDR. Good for obnoxious
166 networks/hosts/DoS"</comment>
167
168 if [ "$2" == "on" ]
169 then
170 <comment># Rules will be appended or inserted as normal</comment>
171 APPEND="-A"
172 INSERT="-I"
173 rec_check ipdrop $1 "$1 already blocked" on
174 record ipdrop $1
175 elif [ "$2" == "off" ]
176 then
177 <comment># Rules will be deleted instead</comment>
178 APPEND="-D"
179 INSERT="-D"
180 rec_check ipdrop $1 "$1 not currently blocked" off
181 unrecord ipdrop $1
182 else
183 echo "Error: \"off\" or \"on\" expected as second argument"
184 exit 1
185 fi
186
187 <comment># Block outside IP address that's causing problems</comment>
188 <comment># Attacker's incoming TCP connections will take a minute or so to time
189 out, reducing DoS effectiveness</comment>
190
191 iptables $INSERT INPUT -s $1 -j DROP
192 iptables $INSERT OUTPUT -d $1 -j DROP
193 iptables $INSERT FORWARD -d $1 -j DROP
194 iptables $INSERT FORWARD -s $1 -j DROP
195
196 echo "IP ${1} drop ${2}."
197 </pre>
198
199 </body>
200 </section>
201
202 <section>
203 <title>ipdrop: explicación</title>
204 <body>
205
206 <p>
207 Si echamos un vistazo a las cuatro últimas líneas resaltadas, veremos los
208 comandos que insertan las reglas apropiadas en las tablas del cortafuegos. Como
209 puede verse la definición de la variable de entorno $INSERT varía, dependiendo
210 de si lo ejecutamos en el modo "on" u "off". Cuando se ejecuten las líneas de
211 iptables, las reglas correspondientes se insertarán o se eliminarán
212 adecuadamente.
213 </p>
214
215 <p>
216 Ahora, veamos la función de las reglas, que deberían funcionar a la perfección
217 con cualquier tipo de cortafuegos, e incluso en un sistema sin cortafuegos;
218 todo lo que se necesita es el soporte iptables integrado en nuestro núcleo 2.4.
219 Bloqueamos los paquetes entrantes desde la dirección IP que causa los problemas
220 (la primera línea iptables), bloqueamos los paquetes salientes a dicha
221 dirección IP (la siguiente línea iptables) y después evitamos las redirecciones
222 en cada dirección para dicha IP (las últimas dos líneas iptables). Una vez se
223 apliquen dichas reglas, nuestro sistema descartará cualquier paquete
224 proveniente que caiga en una de esas categorías.
225 </p>
226
227 <p>
228 Otro apunte rápido: hacemos llamadas a "rec_check", "unrecord", "record", y
229 "args". Son funciones de ayuda especiales en bash definidas en <path>dynfw.sh
230 </path>. La función "record" graba la ip bloqueada en el archivo
231 <path>/root/.dynfw-ipdrop</path>, mientras que "unrecord" lo elimina de
232 <path>/root/.dynfw-ipdrop</path>. La función "rec_check" se usa para abortar la
233 macro con un mensaje de error si se intenta bloquear de nuevo una dirección IP
234 ya bloqueada, o quitar el bloqueo a una dirección IP que no está bloqueada. La
235 función "args" se asegura de que recibimos la cifra correcta de argumentos y
236 también muestra una información de gran ayuda. He creado el archivo
237 <uri
238 link="http://www-128.ibm.com/developerworks/library/l-fw/dynfw-1.0.tar.gz">
239 dynfw-1.0.tar.gz</uri> que contiene todas estas herramientas; ver la sección de
240 <uri link="#recursos">Recursos</uri> al final de este artículo para obtener más
241 información.
242 </p>
243
244 </body>
245 </section>
246
247 <section>
248 <title>tcplimit</title>
249 <body>
250
251 <p>
252 La siguiente macro de cortafuegos dinámica es útil si se necesita limitar el
253 uso de un servicio de red basado en TCP, algo que posiblemente sobrecargue la
254 CPU en el servidor. Se llama "tcplimit", esta macro coge un puerto TCP, una
255 tasa, una escala y "on" u "off" como argumento:
256 </p>
257
258 <pre caption="Limitar el uso de un servicio particular basado en TCP">
259 # <i>tcplimit 873 5 minute on</i>
260 Port 873 new connection limit (5/minute, burst=5) on.
261 </pre>
262
263 <p>
264 <c>tcplimit</c> usa el nuevo módulo de iptables "state" (hay que asegurarse de
265 haberlo habilitado en el núcleo o de haber cargado el módulo) para permitir
266 sólo un cierto número de conexiones entrantes en un determinado periodo de
267 tiempo. En este ejemplo, el cortafuegos únicamente permitirá cinco conexiones
268 por minuto a mi servidor rsync (puerto 873) -- y es posible especificar el
269 número de conexiones que se deseen por segundo/minuto/hora o día, tal y como se
270 necesite.
271 </p>
272
273 <p>
274 <c>tcplimit</c> ofrece una buena forma de limitar servicios que no sean
275 esenciales -- para que la inundación de tráfico en un servicio no esencial no
276 estropee nuestra red o el servidor. En mi caso, uso <c>tcplimit</c> para
277 establecer el límite superior de uso de rsync para prevenir que mi línea DSL se
278 vea saturada por excesivas conexiones rsync. Los servicios cuya conexión se ha
279 visto limitada se almacenan en <path>/root/.dynfw-tcplimit</path> y si alguna
280 vez quiero inhabilitar el nuevo límite de conexiones, sencillamente puedo
281 teclear:
282 </p>
283
284 <pre caption="Inhabilitar la limitación de conexiones">
285 # <i>tcplimit 873 5 minute off</i>
286 Port 873 new connection limit off.
287 </pre>
288
289 <p>
290 <c>tcplimit</c> funciona creando una cadena completamente nueva en la tabla
291 "filter". Esta nueva cadena rechazará todos los paquetes que excedan el límite
292 especificado. Entonces, se inserta una única regla en la cadena de entrada
293 (INPUT) que redirige todos los paquetes de conexión nuevos (NEW) dirigidos al
294 puerto de destino (873 en este caso) a esta cadena especial, limitando
295 efectivamente las nuevas conexiones de entrada, sin afectar a los paquetes que
296 forman parte de una conexión ya establecida.
297 </p>
298
299 <p>
300 Cuando <c>tcplimit</c> deja de funcionar, la regla INPUT y la cadena especial
301 son eliminadas. Este es el tipo de cosas que realmente hacen considerar la
302 importancia de tener una macro que maneje, después de haberla comprobado
303 concienzudamente, las reglas de nuestro cortafuegos por nosotros. Así como con
304 <c>ipblock</c>, la macro <c>tcplimit</c> debe ser compatible con cualquier tipo
305 de cortafuegos, e incluso con ningún cortafuegos, siempre que se tenga la
306 funcionalidad necesaria de iptables habiltada en el núcleo.
307 </p>
308
309 </body>
310 </section>
311
312 <section>
313 <title>host-tcplimit</title>
314 <body>
315
316 <p>
317 <c>host-tcplimit</c> es muy parecido a <c>tcplimit</c>, pero limita las nuevas
318 conexiones IP provenientes de una dirección IP concreta dirigidas a un puerto
319 TCP en concreto de nuestro servidor. <c>host-tcplimit</c> es muy útil para
320 limitar el abuso de una única persona de los recursos de nuestra red. Por
321 ejemplo, digamos que tenemos un servidor CVS y descubrimos que un nuevo
322 desarrollador parece estar usando una macro que actualiza su código fuente con
323 respecto al repositorio cada 10 minutos, usando una gran cantidad de recursos
324 de la red innecesariamente a lo largo del día. De todas formas, mientras
325 intentamos redactar un mensaje explicándole lo erróneo de su forma de proceder,
326 recibimos el siguiente mensaje:
327 </p>
328
329 <pre caption="Mensaje recibido">
330 ¡Hola chicos!
331
332 Me alegra formar parte de vuestro proyecto en desarrollo. He configurado una
333 macro para que actualice mi copia local del código cada diez minutos. Voy a
334 estar fuera durante dos semanas porque me marcho de viaje, pero cuando vuelva
335 tendré todo el código fuente actualizado y ¡estaré listo para ayudar! Salgo por
336 la puerta en este preciso instante... ¡Nos vemos en dos semanas!
337
338
339 Sinceramente,
340
341 Sr. Novato
342 </pre>
343
344 <p>
345 En dichas situaciones, un sencillo comando <c>host-tcplimit</c> resolverá el
346 problema:
347 </p>
348
349 <pre caption="Comando host-tcplimit">
350 # <i>host-tcplimit 1.1.1.1 2401 1 day on</i>
351 </pre>
352
353 <p>
354 Ahora, el Sr. Novato (dirección IP 1.1.1.1) ha sido limitado a una conexión CVS
355 por día (puerto 2401), evitando el desperdicio de un gran ancho de banda en la
356 red.
357 </p>
358
359 </body>
360 </section>
361
362 <section>
363 <title>user-outblock</title>
364 <body>
365
366 <p>
367 La última y posiblemente la más intrigante de todas mis macros de cortafuegos
368 dinámicas es <c>user-outblock</c>. Esta macro proporciona una forma ideal de
369 permitir a un usuario en particular hacer telnet o ssh en nuestro sistema, pero
370 sin permitir a este usuario realizar ninguna nueva conexión saliente desde la
371 línea de comandos. He aquí una situación en la que <c>user-outblock</c>
372 resultaría muy práctico. Digamos que una familia en concreto tiene una cuenta
373 en mi ISP. Mamá y papá usan un cliente gráfico de correo electrónico para leer
374 su correo y para navegar por la red de vez en cuando, pero su hijo aspira a ser
375 un genio de la informática, y usa generalmente su accesso al intérprete de
376 comandos para hacer cosas malas en las computadoras de otras personas.
377 </p>
378
379 <p>
380 Un día, nos topamos con que ha establecido conexiones ssh con varios sistemas
381 que aparentemente pertenecen al ejército pakistaní -- oh. Nos gustaría emplear
382 a este joven en actividades más benéficas, por lo que hacemos lo siguiente:
383 </p>
384
385 <p>
386 Primero, hacemos una revisión de nuestro sistema y nos aseguramos de quitar el
387 bit suid de todos los binarios de red, como ssh:
388 </p>
389
390 <pre caption="Eliminar el bit suid de todos los binarios de red">
391 # <i>chmod u-s /usr/bin/ssh</i>
392 </pre>
393
394 <p>
395 Ahora, todos los procesos que intente usar para interactuar con la red tendrán
396 como propietario su UID. Ahora podremos usar user-outblock para bloquear todo
397 el tráfico de salida TCP iniciado por dicho UID (que además es el 2049):
398 </p>
399
400 <pre caption="Bloquear todas las conexiones de salida TCP de un UID">
401 # <i>user-outblock 2049 on</i>
402 UID 2049 block on.
403 </pre>
404
405 <p>
406 Ahora, puede ingresar y leer su correo, pero no podrá usar nuestro servidor
407 para establecer conexiones ssh ni cosas similares. Ahora podría instalar un
408 cliente ssh en su PC doméstico. De todos modos, no sería demasiado complicado
409 elaborar otra macro de cortafuegos dinámico que limitase su PC doméstico a la
410 web, correo y las conexiones salientes ssh (en nuestro servidor únicamente).
411 </p>
412
413 </body>
414 </section>
415 </chapter>
416
417 <chapter id="recursos">
418 <title>Recursos</title>
419 <section>
420 <title>Tarballs</title>
421 <body>
422
423 <p>
424 Dado que he encontrado estas macros dinámicas de cortafuegos muy útiles, las he
425 incluido todas en un pequeño tarball (<uri
426 link="/doc/en/articles/files/dynfw-1.0.1.tar.bz2">dynfw-1.0.1.tar.bz2</uri>)
427 que se puede descargar e instalar en nuestra máquina.
428 </p>
429
430 <p>
431 Para instalarlas, extraemos el tarball y ejecutamos la macro que se incluye
432 <c>install.sh</c>. Esta macro instalará una macro compartida bash en <path>
433 /usr/local/share/dynfw.sh</path>, e instalará todas las macros dinámicas del
434 cortafuegos en <path>/usr/local/sbin</path>. Si se desea tenerlos en <path>
435 /usr/share</path> y <path>/usr/sbin</path> en su lugar, sencillamente tecleamos
436 esto antes de ejecutar <c>install.sh</c>:
437 </p>
438
439 <pre caption="Exportar la localización del directorio de instalación">
440 # <i>export PREFIX=/usr</i>
441 </pre>
442
443 <p>
444 He añadido también la página en Gentoo Linux <uri link="/proj/en/dynfw.xml">
445 macros dinámicas de cortafuegos</uri> (en inglés) que se puede visitar para
446 obtener la última versión del tarball. Me gustaría continuar mejorando y
447 añadiendo nuevas cosas a la colección, alcanzando la meta de hacer realidad un
448 recurso verdaderamente útil para todos los administradores de sistemas a lo
449 largo del mundo. Ahora que disponemos de iptables en el núcleo es el momento de
450 sacarle partido.
451 </p>
452
453 <p>
454 Si todo este material acerca del cortafuegos iptables es nuevo para nosotros,
455 recomiendo encarecidamente el
456 <uri link="http://www-128.ibm.com/developerworks/edu/l-dw-linuxfw-i.html">2.4
457 stateful firewall tutorial</uri> (es necesario registrarse), que contiene
458 instrucciones completas acerca de cómo elaborar nuestro cortafuegos con
459 seguimiento de estado basado en iptables.
460 </p>
461
462 <p>
463 <uri link="http://www.tcpdump.org/">tcpdump</uri> es una herramienta esencial
464 de bajo nivel para explorar los intercambios de paquetes y para verificar que
465 nuestro cortafuegos está funcionando correctamente. Si no disponemos de la
466 misma, hay que obtenerla. Si disponemos de la misma, hemos de empezar a usarla.
467 Si ya se está usando, ¡excelente! :)
468 </p>
469
470 <p>
471 Visitar la <uri link="http://netfilter.samba.org">página del equipo netfilter
472 </uri> para encontrar muchos recursos excelentes, incluyendo el código fuente
473 de iptables,
474 y las excelentes <uri
475 link="http://netfilter.samba.org/unreliable-guides/index.html">guías no fiables
476 de Rusty</uri> (traducidas al español siguiendo el enlace). Incluyen una guía
477 de conceptos básicos de red, una de filtrado de paquetes, una acerca de NAT y
478 el netfilter hacking HOWTO (no dispone de traducción al español) para los
479 desarrolladores. También hay un <uri
480 link="http://netfilter.org/documentation/index.html#documentation-faq">PUF
481 netfilter</uri> disponible, así como algunas otras cosas.
482 </p>
483
484 <p>
485 Afortunadamente, hay muchos recursos de netfilter en línea; pero, de todos
486 modos, no hay que olvidar los más básicos. La página del manual de iptables
487 es muy detallada y es un ejemplo brillante de lo que cualquier página de manual
488 debería ser.
489 </p>
490
491 <p>
492 Tenemos el <uri link="http://www.ds9a.nl/2.4Routing/">Advanced Linux Routing
493 and Traffic Control HOWTO</uri>. Disponible en español en formato PDF
494 <uri link="http://www.gulic.org/comos/LARTC">Enrutamiento avanzado y control de
495 tráfico en Linux</uri>, que dispone de una sección que muestra cómo usar
496 iptables para marcar paquetes, para después usar la funcionalidad de Linux para
497 encaminar dichos paquetes basándose en estas marcas.
498 </p>
499
500 <p>
501 Hay una <uri link="http://netfilter.org/mailinglists.html#ml-user">lista de
502 correo netfilter (iptables)</uri> disponible, así como una para los
503 <uri link="http://netfilter.org/mailinglists.html#ml-devel">desarrolladores
504 netfilter</uri>. Se puede acceder a sus archivos en esos mismos enlaces.
505 </p>
506
507 </body>
508 </section>
509 </chapter>
510 </guide>
511
512
513
514 --
515 gentoo-commits@g.o mailing list