Un firewall es un dispositivo, ya sea software o hardware, que filtra todo el tráfico de red. El sistema operativo Linux dispone de un firewall llamado IPtables.

Iptables es un firewall incluido en el kernel de Linux desde la versión 2.4 que está incluido en el sistema operativo. Es un firewall basado en reglas, su funcionamiento se basa en aplicar reglas que el mismo firewall ejecute. Estas IPtables también se encuentran en los firmwares basados en Linux y por supuesto, los dispositivos Android.

El uso de IPtables es bastante complejo, por lo que vamos a hacer un vistazo general sobre sus opciones:

Para Iniciar/Parar/Reiniciar Iptables debemos ejecutar estos comandos:

  • sudo service iptables start
  • sudo service iptables stop
  • sudo service iptables restart

Los principales comandos de IPtables son los siguientes (argumentos de una orden):

  • -A –append → agrega una regla a una cadena.
  • -D –delete → borra una regla de una cadena especificada.
  • -R –replace → reemplaza una regla.
  • -I –insert → inserta una regla en lugar de una cadena.
  • -L –list → muestra las reglas que le pasamos como argumento.
  • -F –flush → borra todas las reglas de una cadena.
  • -Z –zero → pone a cero todos los contadores de una cadena.
  • -N –new-chain → permite al usuario crear su propia cadena.
  • -X –delete-chain → borra la cadena especificada.
  • -P –policy → explica al kernel qué hacer con los paquetes que no coincidan con ninguna regla.
  • -E –rename-chain → cambia el orden de una cadena.

Condiciones principales para Iptables:

  • -p –protocol → la regla se aplica a un protocolo.
  • -s –src –source → la regla se aplica a una IP de origen.
  • -d –dst –destination → la regla se aplica a una Ip de destino.
  • -i –in-interface → la regla de aplica a una interfaz de origen, como eth0.
  • -o –out-interface → la regla se aplica a una interfaz de destino.

Condiciones TCP/UDP

  • -sport –source-port → selecciona o excluye puertos de un determinado puerto de origen.
  • -dport –destination-port → selecciona o excluye puertos de un determinado puerto de destino.

Existen muchas mas condiciones para una configuración avanzada del firewall, pero las elementales ya las tenemos listadas.

Configurar reglas por defecto

La configuración por defecto de un firewall debería ser, traducido al español, “bloquear todo excepto [reglas]”. Para configurar el firewall para que bloquee todas las conexiones debemos teclear:

  • iptables -P INPUT DROP
  • iptables -P FORWARD DROP
  • iptables -P OUTPUT DROP

Con esto nos quedaremos sin internet, por lo que a continuación debemos empezar a crear reglas permisivas.

Para aplicar una regla que filtre un determinado puerto, debemos ejecutar:

  • iptables -A INPUT -p tcp –sport 22 22 → crea una regla para el puerto de origen tcp 2222

Para bloquear el tráfico procedente de una determinada IP, debemos ejecutar:

  • iptables -A INPUT -p tcp -m iprange –src-range 192.168.1.13-192.168.2.19 (ejemplo de IP)

También podriamos bloquear por MAC con la condición –mac-source.

  • iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01

Una vez ejecutadas las reglas que queramos aplicar, debemos guardarlas tecleando sudo service iptables save

Ver el estado del firewall

  • iptables -L -n -v

El parámetro L muestra las líneas abiertas. V permite recibir más información sobre las conexiones y N nos devuelve las direcciones IP y sus correspondientes puertos sin pasar por un servidor DNS.

Eliminar las reglas existentes

Para borrar toda la configuración del firewall para volver a configurarlo de nuevo debemos teclear:

  • iptables -F

Permitir conexiones entrantes

Teclearemos los siguientes parámetros:

  • iptables -A INPUT -i [interface] -p [protocolo] –dport [puerto] -m state –state NEW,ESTABLISHED -j ACCEPT

-i: debemos configurar la interfaz, por ejemplo, eth0. Esto es útil en caso de tener varias tarjetas de red, si tenemos sólo una, no tenemos por qué especificar este parámetro.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–dport: el puerto que queremos permitir, por ejemplo, en caso de HTTP sería el 80.

Un ejemplo para permitir las conexiones entrantes desde páginas web:

  • iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

Permitir las conexiones salientes

  • iptables -A OUTPUT -o [interfaz] -p [protocolo] –sport [puerto] -m state –state ESTABLISHED -j ACCEPT

-o: debemos configurar la interfaz, por ejemplo, eth0, al igual que en el caso anterior.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–sport: el puerto que queremos permitir, por ejemplo, en caso de HTTPS sería el 443.

Un ejemplo para permitir el tráfico saliente hacia páginas web:

  • iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

Permitir los paquetes ICMP

Por defecto, el ping está deshabilitado. Debemos habilitarlo manualmente añadiendo las correspondientes entradas en iptables. Para ello teclearemos:

Para poder hacer ping a otros servidores:

  • iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT

Para permitir recibir solicitudes de ping de otros equipos:

  • iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT

Permitir que el tráfico interno salga a internet

En el caso de tener 2 tarjetas de red (eth0 en local y eth1 conectada a internet) podemos configurar el firewall para que reenvíe el tráfico de la red local a través de internet. Para ello escribiremos:

  • iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

Bloquear y prevenir ataques DDoS

  • iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/minute –limit-burst 100 -j ACCEPT

Consultar los paquetes rechazados por iptables

Para saber los paquetes que iptables ha rechazado debemos teclear:

  • iptables -N LOGGING

Ejemplos prácticos:

Cómo bloquear las conexiones entrantes por el puerto 1234:

  • iptables -A INPUT -p tcp –dport 1234 -j DROP
  • iptables -A INPUT -i eth1 -p tcp –dport 80 -j DROP → bloquea en la interfaz eth1

Bloquear una dirección IP:

  • iptables -A INPUT -s 192.168.0.0/24 -j DROP

Bloquear una dirección IP de salida:

  • iptables -A OUTPUT -d 75.126.153.206 -j DROP

También podemos bloquear una url, por ejemplo, facebook:

  • iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP

Bloquear el tráfico desde una direccion MAC:

  • iptables -A INPUT -m mac –mac-source 00:0F:EA:91:04:08 -j DROP

Bloquear peticiones ping:

  • iptables -A INPUT -p icmp –icmp-type echo-request -j DROP

UFW (Uncomplicated Firewall) es una herramienta de configuración de firewall para Ubuntu desde la consola, desarrollado para facilitar la configuración del firewall Iptables. Ufw proporciona una manera fácil de crear un firewall basado en host IPv4 o IPv6.

Lo primero que debemos hacer es instalar ufw desde apt-get con:

  • sudo apt-get install ufw

Ahora ejecutamos el firewall tecleando sudo ufw enable. Para parar el firewall, teclearemos sudo ufw disable, y para reiniciarlo, primero lo pararemos y a continuación lo volveremos a arrancar con los comandos especificados.

Una vez tengamos el firewall funcionando, ya podemos comenzar a establecer reglas en su funcionamiento. Para aplicar una regla que permita por defecto todo el tráfico, tecleamos:

  • sudo ufw default allow

Por el contrario, para bloquear todo el tráfico, teclearemos:

  • sudo ufw default deny

Para aplicar reglas a determinados puertos, lo haremos mediante el comando:

  • sudo ufw allow\deny [puerto]/[protocolo]

Ejemplo:

  • sudo ufw allow 1234/tcp (permite las conexiones del puerto 1234 en tcp)
  • sudo ufw deny 4321/udp (bloquea las conexiones del puerto 4321 en udp)

Existe un archivo que contiene más reglas predefinidas en la ruta /etc/ufw/before.rules donde, por ejemplo, podemos permitir o bloquear el ping externo. Para ello, pondremos una # delante de la linea -A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT

Podemos consultar las reglas del firewall desde un terminal tecleando sudo ufw status

Como podemos ver, con UFW es bastante sencillo gestionar a nivel ipv4 e ipv6 nuestro firewall iptables. Todo ello podemos gestionarlo desde un terminal sin necesidad de disponer de una interfaz gráfica, pero aún podemos facilitarlo más con otra aplicación, llamada gufw, que es una interfaz gráfica para ufw que simplifica aún más su uso.

Para instalar gufw debemos escribir en un terminal sudo apt-get install gufw

Una vez instalado, lo ejecutamos escribiendo gufw o buscándolo en el panel de aplicaciones.

La primera ventana que nos muestra el programa nos permite activar y desactivar el firewall, establecer reglas por defecto para el tráfico entrante y saliente (permitir, rechazar y denegar), y, en la parte inferior, crear reglas.

Si pulsamos en el botón + de la parte inferior, accedemos al menú de configuración de reglas. Aqui podemos añadir reglas personalizadas en cuanto a puertos, aplicaciones, ips de origen, etc.

Para añadir una regla por puerto igual que hemos especificado desde terminal, seleccionamos si queremos permitir (allow) o bloquear (deny), si queremos que se filtre el tráfico entrante o saliente, el protocolo, ya sea tcp o udp y el puerto a filtrar.

Las posibilidades de iptables son prácticamente infinitas, y la dificultad de configuración aumenta exponencialmente según sean de complejas las configuraciones que queremos realizar. Desde RedesZone esperamos que con este pequeño tutorial podáis configurar vuestro firewall iptables a nivel básico de forma sencilla.

Artículo realizado por Rubén Velasco (ruvelro) para RedesZone.net.

Artículo en exclusiva para RedesZone.net

Prohibida su reproducción total o parcial sin el consentimiento del autor.

Publicado por Sergio De Luz el 22 septiembre 2012 , actualizado el 16 febrero 2014

  • Pingback: IPtables: Manual básico y ejemplos()

  • Victor

    excelente
    Muchas gracias

  • Sergi Tur Badenas

    Excelente. Os recomiendo tambien http://acacha.org/mediawiki/index.php/Iptables

  • Adriana

    Muy bien explicado y muy útil, Muchas gracias!

    • Roberto

      Genial, muchas gracias!

  • Pingback: Configuración del firewall en Linux con IPtables « CFGS - ASIR()

  • Juan

    Una pregunta, ¿Con que comando se pueden bloquear puertos en específico?

    • # Permitir salida al puerto 80
      /sbin/iptables -A INPUT -i eth0 -p tcp –sport 80 -j ACCEPT (source port) en entrada
      /sbin/iptables -A OUTPUT -o eth0 -p tcp –dport 80 -j ACCEPT (destination port) en salida.

  • Rudy King

    Saludos, ante todo un agradecimiento por toda esta buena información, a todo el equipo GRACIAS.
    Una pregunta, es posible bloquear con IPTables que solo desde el dominio de mi país se pueda ver mi red, y no permitir el acceso desde Internet a mi red o sitios.
    Ejemplo: deseo que solo sean aceptadas conexiones externas desde el dominio *.RR y todas las que no vengan desde *.RR o su rangos de IP sean bloqueadas.
    De ser posible donde debe quedar Jerárquicamente esta cadena, perdonen la pregunta pero no tengo mucha experiencia con la aplicación, solo encuentro reglas para el bloqueo desde mi red hacia tal dirección o dominio, pero no a la inversa.
    Gracias por su tiempo y ayuda.

    • Pero es que las páginas con ese dominio no son las que acceden a tu red…porque las webs no lanzan peticiones normalmente. Supongo que lo que quieres es permitir todas las IP de tu país y el resto no, para eso tienes que irte a la organización ICANN o similar y ver el listado de IPs proporcionadas y permitirlas, y todo lo demás denegado.

      • Rudy King

        Saludos, GRACIAS.
        Bueno no me refería a los sitios, sino a los clientes que hacen peticiones hacia mi dominio fuera del rango de IP o dominio de mi país, pero si tengo que registrar todos los rangos de IP internacionales la tarea es dura, agradezco mucho la respuesta.

        Un cordial saludo.

        PD: intenté aplicar esta regla y me genera un error:
        iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/minute –limit-burst 100 -j ACCEPT
        ———————————-
        Bad argument `–dport’

        • Tienes que poner dos guiones en –dport, no uno, y en lo de limit también, es tema de sintaxis.

          • Rudy King

            Gracias Sergio por la respuesta.
            Sigue sin trabajarme y dándome errores la línea, Bloquear y prevenir ataques DDoS
            Tengo corriendo el iptables sobre Fedora, te agradezco si puedes darme la línea exacta a como debería quedar.

            Saludos, perdona el tiempo que te puedo consumir.
            Gracias

          • Rudy King

            Gracias Sergio, ya el problema resuelto.

            Saludos, buen año en contacto.

            Rudy

  • Rudy King

    Gracias Sergio, tengo una pregunta amigo para ver si puedes ayudarme.
    Tienes alguna cadena de iptables donde pueda definir varios rangos de IP ejemplo: 152.206.0.0/15 169.158.0.0/16 y otros, y solo que desde estos puedan acceder a mi apache por el puerto 80.

    Saludos, gracias por la ayuda, si lo deseas puede responderme por el correo.
    Rudy

    • Por ejemplo:

      iptables -A INPUT -p tcp –dport 80 -m iprange –src-range 192.168.1.100-192.168.1.200 -j ACCEPT

      Te recomiendo mirar la documentación oficial de iptables donde hay muchos más ejemplos.

      • Rudy King

        Gracias, si este ya lo había visto, pero no era esta la opción que me hacía falta, este es para un mismo rango y varios IP aceptados, lo que necesito es manejar diferentes rangos como los que te comenté anteriormente .

        Gracias nuevamente, seguiré buscando a ver si aparece algo.

        • Puedes poner directamente la subred, pero tendrás que crear varias reglas y no solo una. Mirate el comando ipset

  • anieska

    buen dia instale firewall ufw se instalo correctamente solo que no puedo darle salida a internet cuento con dos targetas de red.. como podria darle salida mediante ufw tendras un tutorial eplicando eso¡? gracias por tu atencion espero tu respuesta

  • miledis

    Muy bueno

  • Jose Rey

    buenas tardes, una consulta. con este firewall yo puedo bloquear las paginas de internet pero por categorias???

    ejemplo: adultos, bancos, redes sociales, etc…

    en tal caso de ser afirmativa la respuesta es muy complejo????

    gracias

    • Bruno Robles

      si necesitas bloquear paginas por categorías te recomiendo usar PROXY SQUID

  • Santiago

    Que tal, espero me puedan ayudar como puedo crear una regla para que todas las peticiones a los protocolos http y https salgan por la red inalambrica y el resto por la lan sucede que trabajo con mi laptop esta se conecta a la red local via cable para poder trabajar pero para poder tener acceso a internet se debe conectar via wifi a otra red.
    gracias

    • Es un poco más complicado que configurar el firewall, te doy la pista:

      Tienes que marcar MARK los paquetes http y https salientes, y en la tabla de enrutamiento con ip route enviarlas por una interfaz de red u otra…

  • Javier Chavez

    Buenas noches, estoy intentando redirigir un DVR de mi LAN a internet través de mi servidor proxy. eth0 = Internet (IP publica), eth1 = LAN (192.168.2.1). Mi DVR es 192.168.2.188. Necesito redirigir el puerto 8000 hacia la IP LAN desde mi IP publica.

    Las reglas que he creado son:

    IPTABLES=”/sbin/iptables” # ubicacion de iptables
    INTERNET=”eth0″ # tarjeta de red que se conecta a Internet
    LAN=”eth1″ # tarjeta de red que se conecta a la red local

    $IPTABLES -F
    $IPTABLES -t nat -F

    $IPTABLES -A PREROUTING -t nat -i $INTERNET -p UDP –dport 8000 -j DNAT –to 192.168.2.188
    $IPTABLES -A INPUT -p UDP -m state –state NEW –dport 8000 -i $INTERNET -j ACCEPT
    $IPTABLES -A PREROUTING -t nat -i $INTERNET -p TCP –dport 8000 -j DNAT –to 192.168.2.188
    $IPTABLES -A INPUT -p TCP -m state –state NEW –dport 8000 -i $INTERNET -j ACCEPT

    Pero no funciona,
    también cree esta regla

    $IPTABLES -A INPUT -i $INTERNET -p TCP –dport 8000 -m state –state NEW -j ACCEPT
    $IPTABLES -A INPUT -i $INTERNET -p UDP –dport 8000 -m state –state NEW -j ACCEPT

    Pero aun no puedo autenticar el app ni el computador desde el software para visualizar el DVR. Podría decirme por favor por que no funciona?

    • ¿Pero ese firewall que me pones es el equipo que hace NAT? Porque te falta la regla de POSTROUTING… ¿Tienes un router o solo usas este dispositivo de router y eth0 tiene la IP pública?

      • Javier Chavez

        si tiene la regla POSTROUTING, le voy a copiar toda la configuración que tengo:

        IPTABLES=”/sbin/iptables” # ubicacion de iptables
        INTERNET=”eth0″ # tarjeta de red que se conecta a Internet
        LAN=”eth1″ # tarjeta de red que se conecta a la red local

        $IPTABLES -F
        $IPTABLES -t nat -F

        echo 1 > /proc/sys/net/ipv4/ip_forward

        iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 0.0.0.0/0 -j MASQUERADE

        # si es conexion ADSL descomentar
        #iptables -t mangle -A POSTROUTING -p tcp –tcp-flags SYN,RST SYN -o eth0 -j TCPMSS –clamp-mss-to-pmtu

        iptables -A OUTPUT -o eth1 -p tcp –sport ftp -j ACCEPT
        iptables -A OUTPUT -o eth1 -p tcp –sport ftp-data -j ACCEPT

        #dejo pasar paquetes ICMP, esto es para que el firewall responda pings
        $IPTABLES -A INPUT -i $INTERNET -p ICMP -j ACCEPT

        # Permito conexiones al puerto 80 (Web) y al puerto 22 (ssh), para poder acceder a estos servicios desde Internet
        $IPTABLES -A INPUT -i $INTERNET -p TCP –dport 80 -m state –state NEW -j ACCEPT
        $IPTABLES -A INPUT -i $INTERNET -p TCP –dport 22 -m state –state NEW -j ACCEPT

        $IPTABLES -A INPUT -i $INTERNET -p TCP –dport 8000 -m state –state NEW -j ACCEPT
        $IPTABLES -A INPUT -i $INTERNET -p UDP –dport 8000 -m state –state NEW -j ACCEPT

        #DVR HIKVISION

        $IPTABLES -A PREROUTING -t nat -i $INTERNET -p UDP –dport 8000 -j DNAT –to 192.168.2.188
        $IPTABLES -A INPUT -p UDP -m state –state NEW –dport 8000 -i $INTERNET -j ACCEPT
        $IPTABLES -A PREROUTING -t nat -i $INTERNET -p TCP –dport 8000 -j DNAT –to 192.168.2.188
        $IPTABLES -A INPUT -p TCP -m state –state NEW –dport 8000 -i $INTERNET -j ACCEPT

        # AQUI INTENTE REDIRIGIR LA WEB DEL DVR
        iptables -A PREROUTING -t nat -i eth0 -p udp –dport 88 -j DNAT –to 192.168.2.188
        iptables -A INPUT -p udp -m state –state NEW –dport 88 -i eth0 -j ACCEPT
        iptables -A PREROUTING -t nat -i eth0 -p tcp –dport 88 -j DNAT –to 192.168.2.188
        iptables -A INPUT -p tcp -m state –state NEW –dport 88 -i eth0 -j ACCEPT

        #Webmin
        $IPTABLES -A INPUT -i $INTERNET -p TCP –dport 10000 -m state –state NEW -j ACCEPT

        # Acepto paquetes de conexiones ya establecidas
        $IPTABLES -A INPUT -p TCP -m state –state RELATED -j ACCEPT

        # Rechazamos paquetes de conexiones nuevas y rechazamos paquetes de forwarding de conexiones no establecidas.
        # bloqueo todo lo que venga de Internet y no coincida con las reglas anteriores
        $IPTABLES -A INPUT -i $INTERNET -m state –state NEW,INVALID -j DROP
        $IPTABLES -A FORWARD -i $INTERNET -m state –state NEW,INVALID -j DROP

        Como ve, intente redirigir la conexión web del DVR para hacer la prueba dede un navegador especificando el puerto 88 para que no hiciera conflicto con el servidor apache montado en mi proxy. Si tiene alguna sugerencia para mejorarlo bien recibida. Pero la prioridad es redirigir el trafico para qu eme permita ver el DVR desde la APP por el puerto 8000. Gracias

        • ¿Pero la eth0 tiene la dirección IP pública que te proporciona tu operador? Es lo más importante…

          • Javier Chavez

            Si correcto, la eth0 tiene una IP publica.

          • Esta regla:

            iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 0.0.0.0/0 -j MASQUERADE

            Pon esta en su lugar:

            iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

            Y para redirigir ese puerto:

            iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 22 -j DNAT –to-destination 192.168.2.188

  • Hugo

    disculpen
    tengo un problema
    de cada en cuando llega un ataque de spam o troyano a un cliente de correos y estos saturan los relay salientes permitidos. por un dia por que hacen un envio masivo y pues en menos de 1 hora ya llegaron a los 1000 releys.

    solo cambio contraseña de correo y listo.. pero tengo que esperar al siguiente dia para que nuevamente pueda enviar correos de ese servidor vps.

    ya he visto algunos tutos incluso instale el CSF
    ConfigServer Security & Firewall.

    pero se le escapan este tipo de ataques

    hay manera de bloquear esto antes de que pase el problema? por medio de iptables?
    osea limitar yo mismo los relays a 500 o 1000 y que no llegue al limite permitido por dia? con eso me daria oportunidad de una vez bloquear el ataque permitir unos pocos mas relay por dia. asi podremos seguir enviando correos sin necesidad de esperar al dia sigiente.

    y/o a a la ves cuando empiece los ataques de spam , al menos que me mande una alerta a algun correo..

    gracias por su ayuda de antemano.

    • El SPAM se debe bloquear a nivel de correo electrónico, y descartarlo de esa manera. Mirate http://spamassassin.apache.org/

      • Hugo

        gracias lo vere. pero el spamassanssin ya lo tenia activado y en varias ocasiones ya me hay atacado y saturado el servidor de relays al limite.
        tengo 5000 permitidos de relays por mi proveedor, me gustaria yo limitarlos digamos unos 1000 mil. por si la ocasion de que vuelvan los ataques pueda asi detenerlos y bloquearlos.. una vez haciedo esto. liberar otros 500 relay para que dure el resto del dia y no esperar hasta mañana, no se si me doy a entender?
        muchas gracias por su ayuda

Últimos análisis

Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
10
Valoración RZ
8
Valoración RZ
9
Valoración RZ
9
Valoración RZ
10