{"id":60691,"date":"2022-05-23T15:36:53","date_gmt":"2022-05-23T15:36:53","guid":{"rendered":"https:\/\/www.redeszone.net\/?post_type=tutoriales&amp;p=546903"},"modified":"2022-05-23T15:36:53","modified_gmt":"2022-05-23T15:36:53","slug":"configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor","status":"publish","type":"post","link":"http:\/\/cordobadirecto.com\/index.php\/2022\/05\/23\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor\/","title":{"rendered":"Configura el firewall de Linux con IPtables y protege tu servidor"},"content":{"rendered":"<p>Una vez que ya conocemos las principales caracter\u00edsticas, os vamos a ense\u00f1ar el funcionamiento y la arquitectura de este cortafuegos.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-funcionamiento-y-arquitectura\">&nbsp;<\/span><\/p>\n<h2>Funcionamiento y arquitectura<\/h2>\n<p>Este cortafuegos se basa en reglas que iremos introduciendo una tras otra, su funcionamiento se basa en aplicar reglas que el propio firewall se encargue de ejecutar. Aunque en un primer momento iptables pueda parecer sencillo de usar, si quieres hacerlo de forma avanzada, es m\u00e1s complicado. A continuaci\u00f3n, pod\u00e9is ver un esquema resumido del funcionamiento de iptables.<\/p>\n<p><img src=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor.png\" loading=\"lazy\" class=\"aligncenter size-full wp-image-546912\" alt width=\"531\" height=\"274\" sizes=\"(max-width: 531px) 100vw, 531px\" srcset=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor.png 531w, http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-11.webp 300w\"><\/p>\n<p>La estructura de iptables se basa en tablas, muchas de ellas ya est\u00e1n creadas de forma predeterminada. Dentro de las tablas tenemos las cadenas, que tambi\u00e9n tenemos algunas creadas de forma predeterminada. Finalmente, dentro de las cadenas tenemos las diferentes reglas que podemos configurar. En la siguiente foto pod\u00e9is ver un peque\u00f1o esquema de c\u00f3mo quedar\u00eda la arquitectura del firewall:<\/p>\n<p><img src=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-1.png\" loading=\"lazy\" class=\"aligncenter size-full wp-image-546918\" alt width=\"539\" height=\"400\" sizes=\"(max-width: 539px) 100vw, 539px\" srcset=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-1.png 539w, http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-12.webp 300w\"><\/p>\n<p>De forma predeterminada tenemos un total de cuatro tablas:<\/p>\n<ul>\n<li><strong>Tabla filter<\/strong>: es la tabla por defecto, si no definimos una tabla para a\u00f1adir una regla, siempre se ir\u00e1 a la tabla filter. En esta tabla tenemos un total de tres cadenas por defecto, dependiendo de lo que nos interese, tendremos que usar una cadena u otra: INPUT (son los paquetes en sentido entrante, al propio firewall), OUTPUT (son los paquetes en sentido saliente, desde el servidor hacia fuera), y FORWARD (sirve para filtrar los paquetes que van de una interfaz de red a otra).<\/li>\n<li><strong>Tabla nat<\/strong>: esta tabla se encarga de hacer el NAT, transformar la IP privada en p\u00fablica y al rev\u00e9s. Dentro de NAT tenemos tres cadenas: PREROUTING (altera los paquetes antes de enrutarlos, aqu\u00ed se hace el DNAT o reenv\u00edo de puertos), POSTROUTING (altera los paquetes despu\u00e9s de enrutarlos, aqu\u00ed se hace el SNAT o MASQUERADE) y OUTPUT (paquetes generados por el firewall que atravesar\u00e1 el NAT configurado).<\/li>\n<li><strong>Tabla mangle<\/strong>: esta tabla se encarga de hacer la alteraci\u00f3n de los paquetes, es donde se configura el QoS para la calidad del servicio, alterar cabeceras TCP etc. En esta tabla tenemos las cinco cadenas: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.<\/li>\n<li><strong>Tabla raw<\/strong>: esta tabla no se suele usar porque los paquetes viajan sin estado de conexi\u00f3n. Tenemos la cadena PREROUTING y OUTPUT.<\/li>\n<\/ul>\n<p>En la siguiente imagen pod\u00e9is ver un peque\u00f1o resumen de las cadenas que tenemos en las diferentes tablas:<\/p>\n<p><img src=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-9.webp\" loading=\"lazy\" class=\"aligncenter size-full wp-image-546921\" alt width=\"614\" height=\"318\" sizes=\"(max-width: 614px) 100vw, 614px\" srcset=\"http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-9.webp 614w, http:\/\/cordobadirecto.com\/wp-content\/uploads\/2022\/05\/configura-el-firewall-de-linux-con-iptables-y-protege-tu-servidor-13.webp 300w\"><\/p>\n<p>El funcionamiento a la hora de a\u00f1adir una regla es el siguiente:<\/p>\n<ul>\n<li>Las reglas que incorporamos a las cadenas siempre tienen un objetivo (-j en la regla).<\/li>\n<li>Cuando el firewall recibe un paquete, comprueba si el paquete concuerda con una regla que hayamos dado de alta. Si concuerda, se ejecuta la orden objetivo, sino, pasa a la siguiente regla hasta el final de la cadena.<\/li>\n<li>Las reglas se verifican en un orden secuencial, desde la primera regla hasta la \u00faltima. Es muy importante el orden, si bloqueamos todo primero y luego permitimos algo m\u00e1s espec\u00edfico, bloquearemos todo el tr\u00e1fico y la regla m\u00e1s espec\u00edfica no se comprobar\u00e1.<\/li>\n<li>En el caso de que ninguna regla satisfaga el paquete, entonces se utilizar\u00e1 la pol\u00edtica de la cadena que tengamos (regla global).<\/li>\n<\/ul>\n<p>Los objetivos que tienen las diferentes reglas son las siguientes:<\/p>\n<ul>\n<li>ACCEPT: acepta el paquete y lo pasa al siguiente nivel, un servidor web, SSH, FTP etc.<\/li>\n<li>DROP: bloquea el paquete y no lo pasa al siguiente nivel.<\/li>\n<li>QUEUE: es un objetivo especial, que pasa al paquete en una cola destinada al procesamiento en espacio de usuario. Esto se puede usar para utilizar otros programas externos.<\/li>\n<li>RETURN: tiene el mismo efecto que si hubi\u00e9semos llegado al final de la cadena. Si la regla estaba en una cadena de las que hay por defecto, entonces se ejecuta la pol\u00edtica de la cadena. Para una regla que est\u00e9 en una cadena definida por el usuario, se sale de ella, y se contin\u00faa atravesando la cadena anterior al salto, justo despu\u00e9s de la regla con la que se salt\u00f3.<\/li>\n<\/ul>\n<p>Una vez que ya conocemos el funcionamiento y su arquitectura, vamos a ver diferentes comandos para realizar diferentes acciones.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-comandos-imprescindibles-para-usar-iptables\">&nbsp;<\/span><\/p>\n<h2>Comandos imprescindibles para usar iptables<\/h2>\n<p>Lo primero que debemos tener en cuenta a la hora de configurar este firewall, es que necesitamos permisos de superusuario para realizar las diferentes \u00f3rdenes. Es totalmente necesario para que se ejecuten, de lo contrario no funcionar\u00e1. Las siguientes \u00f3rdenes no llevan \u00absudo\u00bb porque suponemos que ya est\u00e1s con el superusuario (sudo su).<\/p>\n<p>En las \u00faltimas versiones de Linux no es posible parar el servicio de iptables, para poder permitir todo el tr\u00e1fico de red y dejar el firewall con los par\u00e1metros por defecto, tenemos que ejecutar las siguientes \u00f3rdenes:<\/p>\n<ul>\n<li>sudo iptables -F<\/li>\n<li>sudo iptables -X<\/li>\n<li>sudo iptables -t nat -F<\/li>\n<li>sudo iptables -t nat -X<\/li>\n<li>sudo iptables -t mangle -F<\/li>\n<li>sudo iptables -t mangle -X<\/li>\n<li>sudo iptables -P INPUT ACCEPT<\/li>\n<li>sudo iptables -P FORWARD ACCEPT<\/li>\n<li>sudo iptables -P OUTPUT ACCEPT<\/li>\n<\/ul>\n<p>Una vez que hayamos hecho esto, ya tendremos el firewall \u00abreseteado\u00bb y con el permitir todo. Ahora que ya sabemos c\u00f3mo resetearlo, vamos a ver las diferentes \u00f3rdenes.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-visualizar-las-tablas-actuales\">&nbsp;<\/span><\/p>\n<h3>Visualizar las tablas actuales<\/h3>\n<p>Si quieres ver el contenido de las diferentes cadenas y reglas que tenemos en una determinada tabla, a continuaci\u00f3n, puedes ver c\u00f3mo se ver\u00edan:<\/p>\n<ul>\n<li>iptables -t filter \u2013list<\/li>\n<li>iptables -t mangle \u2013list<\/li>\n<li>iptables -t nat \u2013list<\/li>\n<li>iptables -t raw \u2013list<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-argumentos-principales-y-para-que-sirven\">&nbsp;<\/span><\/p>\n<h3>Argumentos principales y para qu\u00e9 sirven<\/h3>\n<ul>\n<li>-t, \u2013table table Selecciona la tabla que queramos<\/li>\n<li>-A, \u2013append chain rule-specification A\u00f1adimos una nueva regla en una determinada cadena<\/li>\n<li>-C, \u2013check chain rule-specification Comprobamos que existe una determinada regla en una determinada cadena<\/li>\n<li>-D, \u2013delete chain rule-specification Borramos la regla que pongamos en una determinada cadena<\/li>\n<li>-D, \u2013delete chain rulenum Borramos la regla n\u00famero X en una determinada cadena<\/li>\n<li>-I, \u2013insert chain [rulenum] rule-specification Insertamos una nueva cadena con un n\u00famero en una determinada tabla<\/li>\n<li>-R, \u2013replace chain rulenum rule-specification Reemplaza una determinada cadena en una tabla, sirve para moverla de n\u00famero.<\/li>\n<li>-L, \u2013list [chain] Muestra el listado de reglas de una cadena<\/li>\n<li>-F, \u2013flush [chain] Elimina todas las reglas de una determinada cadena.<\/li>\n<li>-Z, \u2013zero [chain [rulenum]] Pone los contadores de una determinada regla a 0.<\/li>\n<li>-N, \u2013new-chain chain Creamos una nueva cadena en una determinada tabla<\/li>\n<li>-X, \u2013delete-chain [chain] Borramos una determinada cadena (vac\u00eda) en una determinada tabla<\/li>\n<li>-P, \u2013policy chain target Aplicamos la pol\u00edtica por defecto, se cumple cuando ninguna regla de las cadenas se cumplen.<\/li>\n<li>-E, \u2013rename-chain old-chain new-chain Renombra una cadena a\u00f1adida anteriormente<\/li>\n<li>-h, muestra la ayuda<\/li>\n<li>-v, \u2013verbose Salida que se usa en conjunto con \u2013L, sirve para mostrar m\u00e1s informaci\u00f3n que lo que proporciona el comando \u2013L.<\/li>\n<li>-n, \u2013numeric Las direcciones IP y los n\u00fameros de puertos aparecer\u00e1n con n\u00fameros. Por ejemplo si filtramos el puerto 80, con el \u2013L t\u00edpico aparecer\u00e1 www, y no 80.<\/li>\n<li>-x, \u2013exact Muestra el valor exacto del contador de paquetes y bytes, en lugar de usar K, M o G para los valores.<\/li>\n<li>\u2013line-numbers Al mostrar el listado de reglas, mostrar\u00e1 el n\u00famero exacto de la regla. Ideal para usar \u2013D y el n\u00famero (eliminar) o \u2013I para introducir delante o detr\u00e1s de dicha regla.<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-condiciones-principales\">&nbsp;<\/span><\/p>\n<h3>Condiciones principales<\/h3>\n<ul>\n<li><strong>-p<\/strong>, \u2013protocol protocol. Filtra el paquete por protocolo, el protocolo especificado puede ser: tcp, udp, Idplite, icmp, esp, ah, sctp.<\/li>\n<li><strong>-s<\/strong>, \u2013source address[\/mask][,\u2026] Direcci\u00f3n IP de origen del paquete. Podemos tener una IP o una subred (indicando la m\u00e1scara en formato CIDR). Tambi\u00e9n podemos poner nombres de host (dominios, webs etc), pero es una mala idea porque no es eficiente. Se pueden especificar varias direcciones de origen, (192.168.1.1,192.168.1.2) pero crear\u00e1 diferentes reglas para satisfacerlas.<\/li>\n<li><strong>-d<\/strong>, \u2013destination address[\/mask][,\u2026] Direcci\u00f3n IP de destino del paquete. Se comporta exactamente igual que -s.<\/li>\n<li><strong>-m<\/strong>, \u2013match match. Especifica si queremos llamar a los m\u00f3dulos extendidos de iptables, para realizar determinadas acciones como:\n<ul>\n<li>Poner m\u00faltiples puertos de origen y destino (m\u00f3dulo multiport).<\/li>\n<li>Controlar conexiones (m\u00f3dulo conntrack).<\/li>\n<li>Evitar fuerza bruta (m\u00f3dulo recent, ideal para SSH).<\/li>\n<li>Limitar el n\u00famero de conexiones (m\u00f3dulo limit y connlimit).<\/li>\n<li>Rango de direcciones IP (iprange).<\/li>\n<\/ul>\n<\/li>\n<li><strong>-j<\/strong>, \u2013jump target. Especifica el objetivo de la regla, si queremos aceptar, denegar e incluso reenviar el paquete a otra cadena para su posterior tratamiento. Siempre en cualquier regla vamos a tener un \u2013j para decirle qu\u00e9 queremos hacer. Si no incorporamos un \u2013j se a\u00f1adir\u00e1 la regla y contar\u00e1 los paquetes, pero no har\u00e1 nada. Si utilizamos \u2013j para reenviar a otra cadena, una vez que en la otra cadena haya terminado, volver\u00e1 a la original.<\/li>\n<li><strong>-g<\/strong>, \u2013goto chain. Sirve para reenviar el tr\u00e1fico a otra cadena, pero a diferencia de jump, no volver\u00e1 a la cadena original por donde entr\u00f3.<\/li>\n<li><strong>-i<\/strong>, \u2013in-interface name. Nombre de la interfaz por donde un paquete se recibe. Solo vale para las cadenas de entrada como INPUT, FORWARD y PREROUTING. Si ponemos ! Significa todas menos esa interfaz. Si ponemos un + al final del nombre, cualquier interfaz con el inicio del nombre la coger\u00e1 para comprobarla. Imaginemos eth0, eth1 y eth2. Si queremos poner las tres simplemente con poner eth+ es suficiente.<\/li>\n<li><strong>-o<\/strong>, \u2013out-interface name. Nombre de la interfaz por donde un paquete sale. Solo vale para las cadenas de salida como OUTPUT, FORWARD y POSTROUTING.<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-condiciones-solamente-si-usas-tcp-o-udp\">&nbsp;<\/span><\/p>\n<h4>Condiciones solamente si usas TCP o UDP<\/h4>\n<p>Si utilizas el protocolo TCP o UDP, es posible que quieras filtrar por n\u00famero de puerto origen y\/o destino, a continuaci\u00f3n, ten\u00e9is los dos argumentos que puedes usar:<\/p>\n<ul>\n<li>\u2013sport \u2013source-port. Selecciona puertos de origen para permitir o denegar. Si usamos ! excluye.<\/li>\n<li>\u2013dport \u2013destination-port. Selecciona puertos de destino para permitir o denegar. Si usamos ! excluye.<\/li>\n<\/ul>\n<p>Existen muchas mas condiciones para una configuraci\u00f3n avanzada del firewall, pero las elementales ya las tenemos listadas.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-configurar-la-politica-por-defecto\">&nbsp;<\/span><\/p>\n<h3>Configurar la pol\u00edtica por defecto<\/h3>\n<p>Las pol\u00edticas sirven para que cuando no se encuentra una regla dentro de la cadena, se ejecute la pol\u00edtica por defecto. La pol\u00edtica por defecto de todas las cadenas es ACCEPT, pero hay dos opciones: ACCEPT o DROP<\/p>\n<p><b>-P, \u2013policy chain target <\/b><\/p>\n<p>Ejemplos:<\/p>\n<ul>\n<li>iptables -P INPUT DROP<\/li>\n<li>iptables -P FORWARD DROP<\/li>\n<li>iptables -P OUTPUT DROP<\/li>\n<\/ul>\n<p>Con esto nos quedaremos sin internet, por lo que a continuaci\u00f3n debemos empezar a crear reglas permisivas.<\/p>\n<p>A continuaci\u00f3n, pod\u00e9is ver todas las pol\u00edticas que tenemos en las diferentes tablas:<\/p>\n<ul>\n<li>iptables -t filter -P (INPUT | OUTPUT | FORWARD) (ACCEPT | DROP)<\/li>\n<li>iptables -P (INPUT | OUTPUT | FORWARD) (ACCEPT | DROP)<\/li>\n<li>iptables -t mangle -P (INPUT | OUTPUT | FORWARD | PREROUTING | POSTROUTING) (ACCEPT | DROP)<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-ver-el-estado-del-firewall\">&nbsp;<\/span><\/p>\n<h3>Ver el estado del firewall<\/h3>\n<p>El par\u00e1metro -L muestra las reglas que tenemos configuradas. V permite recibir m\u00e1s informaci\u00f3n sobre las conexiones y N nos devuelve las direcciones IP y sus correspondientes puertos sin pasar por un servidor DNS.<\/p>\n<ul>\n<li>iptables -L -n -v<\/li>\n<\/ul>\n<p>Este es uno de los comandos m\u00e1s importantes para ver el estado del cortafuegos.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-modulos-m-match-de-iptables\">&nbsp;<\/span><\/p>\n<h3>M\u00f3dulos (-m match) de iptables<\/h3>\n<p> <span class=\"space_toc\" id=\"546903-multiport\">&nbsp;<\/span><\/p>\n<h4>Multiport<\/h4>\n<p>Es una extensi\u00f3n de iptables que nos da la posibilidad de agrupar reglas similares con diferentes puertos TCP y UDP en una sola. Multiport permite poner varios puertos salteados, y tambi\u00e9n varios puertos seguidos, el m\u00e1ximo es de 15 argumentos de puertos. Ejemplo:<\/p>\n<ul>\n<li>iptables \u2013A INPUT \u2013p tcp \u2013m multiport \u2013dports 80,81,1000:1200 \u2013j ACCEPT<\/li>\n<\/ul>\n<p>Gracias a este m\u00f3dulo, tenemos la posibilidad de usar varios puertos en la misma regla.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-iprange\">&nbsp;<\/span><\/p>\n<h4>iprange<\/h4>\n<p>iprange nos permite poner varias direcciones IP de origen o destino de una vez, sin necesidad de poner decenas de reglas. Tambi\u00e9n permite poner tanto IP de origen como de destino, la sintaxis es la siguiente:<\/p>\n<ul>\n<li>[!]\u2013src-range ip-ip<\/li>\n<li>[!]\u2013dst-range ip-ip<\/li>\n<\/ul>\n<p>El funcionamiento de esta regla es bastante sencilla, simplemente ponemos IP inicio e IP final.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-connlimit\">&nbsp;<\/span><\/p>\n<h4>Connlimit<\/h4>\n<p>El m\u00f3dulo connlimit se encarga de restringir el n\u00famero de conexiones simult\u00e1neas realizadas por una direcci\u00f3n IP, es ideal para limitar el n\u00famero de conexiones para evitar DoS.<\/p>\n<ul>\n<li>\u2013connlimit-upto n . Marcamos si el n\u00famero de conexiones es igual o menor que N (luego podemos permitir o denegar).<\/li>\n<li>\u2013connlimit-above n . Marcamos si el n\u00famero de conexiones es mayor que N (luego podemos permitir o denegar).<\/li>\n<li>\u2013connlimit-mask prefix_length . Marcamos por rango de subred (es igual que un host haga 2 conexiones, que dos host de la misma subred hagan 1 conexi\u00f3n cada uno).<\/li>\n<li>\u2013connlimit-saddr . Aplicar la limitaci\u00f3n al grupo de origen, es la de por defecto si no se especifica nada.<\/li>\n<li>\u2013connlimit-daddr . Aplica la limitaci\u00f3n al grupo de destino.<\/li>\n<\/ul>\n<p>Por ejemplo, imaginemos que queremos permitir dos conexiones SSH por cliente \u00fanicamente:<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 22 -m connlimit \u2013connlimit-above 2 -j DROP<\/li>\n<\/ul>\n<p>No obstante, podemos hacer la regla complementaria, poniendo un accept hasta 2 conexiones.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-conntrack\">&nbsp;<\/span><\/p>\n<h4>Conntrack<\/h4>\n<p>Este m\u00f3dulo sirve para realizar un tracking de las conexiones, sirve para gestionar la entrada y salida de paquetes antes y despu\u00e9s del establecimiento de la conexi\u00f3n. Dentro de este m\u00f3dulo hay varias opciones, pero la m\u00e1s importante es -ctstate que nos permite aceptar o denegar diferentes tipos de paquetes. Dentro de ctstate tenemos varios estados, destacan los siguientes:<\/p>\n<ul>\n<li>INVALID: El paquete recibido es inv\u00e1lido y no pertenece a ninguna conexi\u00f3n.<\/li>\n<li>NEW: Conexiones nuevas que se realizan, o que est\u00e1 asociado a una conexi\u00f3n que a\u00fan no es bidireccional.<\/li>\n<li>ESTABLISHED: Conexiones establecidas, pasan primero por NEW ya que han tenido respuesta<\/li>\n<li>RELATED: Paquete que est\u00e1 relacionado a una conexi\u00f3n existente, pero que no es parte de ella, como FTP pasivo.<\/li>\n<\/ul>\n<p>Imaginemos que queremos acceder a cualquier sitio, sin embargo, no queremos que absolutamente nadie acceda a nosotros.<\/p>\n<ul>\n<li>iptables \u2013P INPUT DROP<\/li>\n<li>iptables -A INPUT -m conntrack \u2013ctstate ESTABLISHED,RELATED -j ACCEPT<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-limit\">&nbsp;<\/span><\/p>\n<h4>Limit<\/h4>\n<p>El m\u00f3dulo limit nos permite limitar, tanto tr\u00e1fico, como n\u00famero de logs a escribir en el syslog como intentos de conexi\u00f3n. Tiene dos argumentos principalmente:<\/p>\n<ul>\n<li>\u2013limit N . Este argumento especifica el n\u00famero m\u00e1ximo de coincidencias de media por segundo (N\/s), minuto (N\/m), hora (N\/h) o d\u00eda (N\/d) a permitir. N especifica el n\u00famero<\/li>\n<li>\u2013limit-burst N . Indica la r\u00e1faga m\u00e1s larga que se puede producir antes de comprobar el l\u00edmite \u2013limit.<\/li>\n<\/ul>\n<p>El valor por defecto si no se especifica nada es 3 coincidencias por hora, a r\u00e1fagas de 5. Imaginemos la siguiente regla: \u00abiptables -A INPUT -m limit -j LOG\u00bb, el funcionamiento es el siguiente:<\/p>\n<ul>\n<li>La primera vez que se alcanza esta regla, se registran los primeros cinco paquetes.<\/li>\n<li>Despu\u00e9s, pasar\u00e1n veinte minutos antes de que vuelva a registrarse un paquete con esta regla (3 coincidencias entre 60 minutos igual a 20 minutos, ya que es MEDIA).<\/li>\n<li>Adem\u00e1s, cada veinte minutos que pasen sin que un paquete alcance la regla, la r\u00e1faga recuperar\u00e1 un paquete.<\/li>\n<li>Si no sucede nada durante 100 minutos, la r\u00e1faga quedar\u00e1 completamente recargada; de vuelta entonces a la situaci\u00f3n inicial.<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-recent\">&nbsp;<\/span><\/p>\n<h4>Recent<\/h4>\n<p>El m\u00f3dulo recent sirve para limitar el n\u00famero de conexiones por segundo a nivel de IP, esto es ideal para protegernos de ataques al puerto SSH porque un atacante probar\u00e1 m\u00faltiples contrase\u00f1as. Por ejemplo, si queremos proteger nuestro SSH, podr\u00edamos ejecutar la siguiente regla:<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 22 -m conntrack \u2013ctstate NEW -m recent \u2013set \u2013name ssh \u2013rsource<\/li>\n<li>iptables -A INPUT -p tcp \u2013dport 22 -m state \u2013state NEW -m recent \u2013rcheck \u2013seconds 60 \u2013hitcount 4 \u2013name ssh \u2013rsource -j DROP<\/li>\n<\/ul>\n<p>Esta regla permite solamente hacer cuatro intentos de conexi\u00f3n al cabo de 60 segundos, es una ventana \u00abdeslizante\u00bb.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-nat\">&nbsp;<\/span><\/p>\n<h3>NAT<\/h3>\n<p>Este firewall tambi\u00e9n se encarga de hacer NAT de nuestra conexi\u00f3n. Para hacer el NAT de nuestra IP p\u00fablica (o interfaz que tenga esta IP p\u00fablica), debemos poner:<\/p>\n<ul>\n<li>SNAT Est\u00e1tico: iptables -t nat -A POSTROUTING -s 192.168.1.0\/24 \u2013o eth1 -j SNAT \u2013to IP_eth1<\/li>\n<li>SNAT Din\u00e1mico: iptables -t nat -A POSTROUTING -s 192.168.1.0\/24 -o eth1 -j MASQUERADE<\/li>\n<\/ul>\n<p>Lo normal es usar MASQUERADE para hacer NAT independientemente de la direcci\u00f3n IP que tenga la interfaz f\u00edsica o l\u00f3gica.<\/p>\n<p>Para abrir puertos tenemos que a\u00f1adir una regla en la cadena PREROUTING de la tabla NAT.<\/p>\n<ul>\n<li>iptables -t nat -A PREROUTING -i eth1 -p tcp \u2013dport 22 -j DNAT \u2013to-destination 192.168.1.1<\/li>\n<\/ul>\n<p>La tabla PREROUTING tambi\u00e9n nos permite modificar los puertos al vuelo, de tal forma que si recibimos paquetes en el puerto 2121, lo podemos transformar al 21.<\/p>\n<ul>\n<li>iptables -t nat -A PREROUTING -i eth1 -p tcp \u2013dport 2121 -j DNAT \u2013to-destination 192.168.1.1:21<\/li>\n<\/ul>\n<p>Una vez que ya conocemos en detalle este cortafuegos, vamos a ver los ejemplos b\u00e1sicos de utilizaci\u00f3n y tambi\u00e9n los m\u00e1s avanzados.<\/p>\n<p> <span class=\"space_toc\" id=\"546903-ejemplos-basicos-de-utilizacion\">&nbsp;<\/span><\/p>\n<h2>Ejemplos b\u00e1sicos de utilizaci\u00f3n<\/h2>\n<p>Este firewall es muy completo y tenemos cientos de comandos que podemos ejecutar para realizar diferentes acciones. En RedesZone os vamos a poner unos ejemplos f\u00e1ciles de entender para un primer acercamiento a este cortafuegos.<\/p>\n<p>Bloquear la direcci\u00f3n IP 192.168.1.10 para que no realice ninguna comunicaci\u00f3n a nuestro servidor:<\/p>\n<ul>\n<li>iptables -A INPUT \u2013s 192.168.1.10 \u2013j DROP<\/li>\n<\/ul>\n<p>Bloquear las direcciones IP 192.168.1.20, 192.168.1.30, 192.168.1.40, 192.168.1.50 para que no realicen ninguna comunicaci\u00f3n a nuestro servidor:<\/p>\n<ul>\n<li>iptables -A INPUT \u2013s 192.168.1.20,192.168.1.30,192.168.1.40,192.168.1.50 \u2013j DROP<\/li>\n<\/ul>\n<p>Bloquear toda la subred 192.168.2.0\/24 para que no realicen ninguna comunicaci\u00f3n a nuestro servidor, excepto la direcci\u00f3n IP 192.168.2.20 que s\u00ed se permitir\u00eda:<\/p>\n<ul>\n<li>iptables \u2013A INPUT \u2013s 192.168.2.20 \u2013j ACCEPT<\/li>\n<li>iptables \u2013A INPUT \u2013s 192.168.2.0\/24 \u2013j DROP<\/li>\n<\/ul>\n<p>Bloquear la direcci\u00f3n IP de 192.168.4.50 para que nosotros no podamos hacer ninguna comunicaci\u00f3n:<\/p>\n<ul>\n<li>iptables \u2013A OUTPUT \u2013d 192.168.4.50 \u2013j DROP<\/li>\n<\/ul>\n<p>Bloquear las direcciones IP 192.168.4.51 y 192.168.4.52 para que nosotros no podamos hacer ninguna comunicaci\u00f3n:<\/p>\n<ul>\n<li>iptables \u2013A OUTPUT \u2013d 192.168.4.51,192.168.4.52 \u2013j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso a www.google.es desde iptables:<\/p>\n<ul>\n<li>iptables \u2013A OUTPUT \u2013d www.google.es \u2013j DROP<\/li>\n<\/ul>\n<p>Queremos bloquear el acceso a nuestro servidor de la MAC 00:01:02:03:04:05, y el resto permitir todo:<\/p>\n<ul>\n<li>iptables -A INPUT -m mac \u2013mac-source 00:01:02:03:04:05 -j DROP<\/li>\n<\/ul>\n<p>Queremos permitir el acceso a nuestro servidor a la direcci\u00f3n MAC MAC 00:01:02:03:04:06, y el resto denegar todo:<\/p>\n<ul>\n<li>iptables -A INPUT -m mac \u2013mac-source 00:01:02:03:04:05 -j ACCEPT<br \/>iptables -A INPUT -j DROP<\/li>\n<\/ul>\n<p>Bloquear la direcci\u00f3n IP 192.168.1.10 para realizar ping desde nuestro nuestro servidor:<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.1.10 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Bloquear las direcciones IP 192.168.1.20, 192.168.1.30, 192.168.1.40, 192.168.1.50 para que no realicen PING a nuestro servidor (en una sola regla):<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.1.20,192.168.1.30,192.168.1.40,192.168.1.50 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Bloquear toda la subred 192.168.2.0\/24 para que no realicen PING a nuestro servidor, excepto la direcci\u00f3n IP 192.168.2.20 que s\u00ed se permitir\u00eda:<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.2.20 -p icmp -j ACCEPT<br \/>iptables -A INPUT -s 192.168.2.0\/24 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Bloquear la direcci\u00f3n IP de 192.168.4.50 para que nosotros no podamos hacer ping.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d 192.168.4.50 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Bloquear las direcciones IP 192.168.4.51 y 192.168.4.52 para que nosotros no podamos hacer ping.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d 192.168.4.51,192.168.4.52 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso a www.google.es desde iptables.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d www.google.es -p icmp -j DROP<\/li>\n<\/ul>\n<p>Tal y como pod\u00e9is ver, el funcionamiento es bastante sencillo con las reglas basadas en IP con origen y destino. Tambi\u00e9n podr\u00edamos usar el m\u00f3dulo iprange para configurar un rango de IPs:<\/p>\n<p>Bloquear un rango de direcciones IP que van desde 192.168.5.1 hasta la direcci\u00f3n 192.168.5.50 para que no puedan hacer ping desde nuestro servidor.<\/p>\n<ul>\n<li>iptables -A OUTPUT -m iprange \u2013dst-range 192.168.5.1-192.168.5.50 -p icmp -j DROP<\/li>\n<\/ul>\n<p>Tambi\u00e9n podemos filtrar de forma m\u00e1s avanzada el protocolo ICMP. Imaginemos que tenemos un usuario que quiere poder hacer ping a cualquier host, pero sin embargo, no quiere que NADIE le pueda hacer ping a \u00e9l. \u00bfC\u00f3mo lo podemos hacer con iptables si el propio PING tiene comunicaci\u00f3n bidireccional?<\/p>\n<ul>\n<li>iptables -A INPUT -s IP -p icmp \u2013icmp-type echo-request -j DROP<\/li>\n<\/ul>\n<p>Bloquear cualquier acceso entrante por la interfaz eth0 (\u00fanicamente), por lo tanto permitir el acceso eth1.<\/p>\n<ul>\n<li>iptables -A INPUT -i eth0 -j DROP<\/li>\n<li>iptables -A INPUT -i eth1 -j ACCEPT<\/li>\n<\/ul>\n<p>Bloquear el tr\u00e1fico saliente por la interfaz eth0 (\u00fanicamente), por lo tanto permitir el acceso eth1.<\/p>\n<ul>\n<li>iptables -A OUTPUT -o eth0 -j DROP<\/li>\n<li>iptables -A OUTPUT -o eth1 -j ACCEPT<\/li>\n<\/ul>\n<p>Permitir cualquier tipo de tr\u00e1fico entrante y saliente por eth0, y denegar cualquier tr\u00e1fico entrante o saliente por eth1.<\/p>\n<ul>\n<li>iptables -A INPUT -i eth0 -j ACCEPT<\/li>\n<li>iptables -A OUTPUT -o eth0 -j ACCEPT<\/li>\n<li>iptables -A INPUT -i eth1 -j DROP<\/li>\n<li>iptables -A OUTPUT -o eth1 -j DROP<\/li>\n<\/ul>\n<p>Si quieres empezar a ver c\u00f3mo funciona el protocolo TCP y UDP, a continuaci\u00f3n ten\u00e9is algunos ejemplos:<\/p>\n<p>Bloquear el acceso web a www.google.es y permitir todo lo dem\u00e1s (ping) por ejemplo.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d www.google.es -p tcp \u2013dport 80 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso FTP a cualquier IP o dominio, y permitir todo lo dem\u00e1s.<\/p>\n<ul>\n<li>iptables -A OUTPUT -p tcp \u2013dport 21 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso SSH a la IP 192.168.1.50, y permitir todo lo dem\u00e1s.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d 192.168.1.50 -p tcp \u2013dport 22 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso Telnet a la subred 192.168.2.0, y permitir todo lo dem\u00e1s.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d 192.168.2.0\/24 -p tcp \u2013dport 23 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso de 192.168.1.50 a nuestro servidor web.<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.1.50 -p tcp \u2013dport 80 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso de 192.168.1.150 y 192.168.1.151 a nuestro servidor SSH.<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.1.150,192.168.1.151 -p tcp \u2013dport 22 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso de toda la subred 192.168.2.0\/24 a nuestro servicio telnet<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.2.0\/24 -p tcp \u2013dport 23 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso de todo el mundo al servidor OpenVPN, excepto la direcci\u00f3n IP 77.77.77.77 que s\u00ed se permite.<\/p>\n<ul>\n<li>iptables -A INPUT -s 77.77.77.77 -p tcp \u2013dport 1194 -j ACCEPT<\/li>\n<li>iptables -A INPUT -p tcp \u2013dport 1194 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso DNS a 8.8.8.8 y permitir todo lo dem\u00e1s (ping) por ejemplo.<\/p>\n<ul>\n<li>iptables -A OUTPUT -d 8.8.8.8 -p tcp \u2013dport 53 -j DROP<\/li>\n<li>iptables -A OUTPUT -d 8.8.8.8 -p udp \u2013dport 53 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso al puerto 1194 a cualquier IP o dominio, y permitir todo lo dem\u00e1s.<\/p>\n<ul>\n<li>iptables -A INPUT -p udp \u2013dport 1194 -j DROP<\/li>\n<\/ul>\n<p>Tenemos un servidor DNS en nuestro servidor. Queremos que solo los equipos de la subred 192.168.1.0\/24 se puedan comunicar con \u00e9l, y bloquear todos los dem\u00e1s accesos.<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.1.0\/24 -p tcp \u2013dport 53 -j ACCEPT<\/li>\n<li>iptables -A INPUT -s 192.168.1.0\/24 -p udp \u2013dport 53 -j ACCEPT<\/li>\n<li>iptables -A INPUT -p tcp \u2013dport 53 -j DROP<\/li>\n<li>iptables -A INPUT -p udp \u2013dport 53 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso a nuestro servidor web, del rango de IP 192.168.100.0\/24, que proviene de la interfaz eth0.<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.100.0\/24 -i eth0 -p tcp \u2013dport 80 -j DROP<\/li>\n<\/ul>\n<p>Bloquear el acceso a nuestro servidor ssh, del rango de IP 192.168.100.0\/24, que proviene de la interfaz eth1.<\/p>\n<ul>\n<li>iptables -A INPUT -s 192.168.100.0\/24 -i eth1 -p tcp \u2013dport 22 -j DROP<\/li>\n<\/ul>\n<p> <span class=\"space_toc\" id=\"546903-ejemplos-avanzados-de-uso\">&nbsp;<\/span><\/p>\n<h2>Ejemplos avanzados de uso<\/h2>\n<p>Si quieres aprender m\u00e1s sobre iptables, a continuaci\u00f3n, ten\u00e9is algunos ejemplos donde hacemos uso del m\u00f3dulo connlimit.<\/p>\n<p>Permitir \u00fanicamente 10 conexiones Telnet por cliente.<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 23 -m connlimit \u2013connlimit-above 10 \u2013connlimit-mask 32 -j DROP<\/li>\n<\/ul>\n<p>Denegar hasta la conexi\u00f3n n\u00famero 5 en web que realice un cliente (no tiene mucho sentido pero es un ejemplo).<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 80 -m connlimit \u2013connlimit-upto 5 \u2013connlimit-mask 32 -j DROP<\/li>\n<\/ul>\n<p>Permitir \u00fanicamente 10 conexiones Telnet por cliente (hacerlo de otra manera al anterior).<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 23 -m connlimit \u2013connlimit-upto 10 \u2013connlimit-mask 32 -j ACCEPT<\/li>\n<li>iptables -A INPUT -p tcp \u2013dport 23 -j DROP<\/li>\n<\/ul>\n<p>Permitir \u00fanicamente 10 conexiones web en el rango de IP 10.0.0.0\/8, y denegar si supera este n\u00famero.<\/p>\n<ul>\n<li>iptables -A INPUT -s 10.0.0.0\/8 -p tcp \u2013dport 80 -m connlimit \u2013connlimit-above 10 \u2013connlimit-mask 8 -j DROP<\/li>\n<\/ul>\n<p>Permitir \u00fanicamente 20 conexiones HTTP por cada cliente, en cuanto se supere mandamos un TCP Reset.<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013dport 80 -m connlimit \u2013connlimit-above 20 \u2013connlimit-mask 32 -j REJECT \u2013reject-with tcp-reset<\/li>\n<\/ul>\n<p>O este forma:<\/p>\n<ul>\n<li>iptables -A INPUT -p tcp \u2013syn \u2013dport 80 -m connlimit \u2013connlimit-above 20 \u2013connlimit-mask 32 -j REJECT \u2013reject-with tcp-reset<\/li>\n<\/ul>\n<p>Tal y como pod\u00e9is ver, este firewall es realmente completo y podremos hacer una gran cantidad de configuraci\u00f3n muy avanzadas, para controlar en detalle todas las conexiones entrantes y salientes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una vez que ya conocemos las principales caracter\u00edsticas, os vamos a ense\u00f1ar el funcionamiento y la arquitectura de este cortafuegos. &nbsp; Funcionamiento y arquitectura Este cortafuegos se basa en reglas que iremos introduciendo una tras otra, su funcionamiento se basa en aplicar reglas que el propio firewall se encargue de ejecutar. Aunque en un primer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":60692,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[42],"tags":[],"_links":{"self":[{"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/posts\/60691"}],"collection":[{"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/comments?post=60691"}],"version-history":[{"count":0,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/posts\/60691\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/media\/60692"}],"wp:attachment":[{"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/media?parent=60691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/categories?post=60691"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/cordobadirecto.com\/index.php\/wp-json\/wp\/v2\/tags?post=60691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}