iptables output, configuración iptables para conexiones salientes, en Red Hat/CentOS 6 o Ubuntu

A modo de ampliación del post «Configuración firewall iptables Red Hat/CentOS 6, desde linea de comandos«, esta vez vamos a ver como asegurar las conexiones salientes de nuestro servidor.

El limitar las conexiones salientes puede parecer algo un tanto paranoico, pero en caso de un ataque tu máquina será utilizada para «saltar» a otras o enviar correos. Se que esto todavía puede sonar más paranoico todavía, pero son cosas que ocurren y son muy reales, quiero hacer un post más adelante tratando un caso real.

Vamos al lío, partimos de una situación inicial:

Source   
[root@oradb ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Vamos a dar acceso solo a lo básico para que un sistema funcione, pero lo vamos a simplificar lo máximo posible. Resumiendo mucho necesitamos:

  • Permitir conexiones establecidas o relacionadas.
  • Permitir conexiones al interfaz local.
  • Permitir consultas a DNS
  • Permitir accesos a máquinas conocidas, omitiremos el protocolo y puerto para simplificar.
  • Escribir en el log el resto de actividad que vamos a denagar.
  • Rechazar el resto

El fragmento de código que os paso hace lo enumerado arriba:

Source   
#Permitir conexiones establecidas o relacionadas
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -m comment --comment "Permitir conexiones salientes existentes " -j ACCEPT
#Permitir conexiones al interfaz local
iptables -A OUTPUT -o lo -m comment --comment "Permitir conexiones salientes internas " -j ACCEPT
#Permitir consultas a DNS
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -m comment --comment "Permitir saliente puerte 53 " -j ACCEPT
#Permitir accesos a máquinas conocidas, omitiremos el protocolo y puerto para simplificar, a otro servidor nuestro.
iptables -A OUTPUT -p all -d s1.dominio.es -m state --state NEW -m comment --comment "Permitir saliente s1 " -j ACCEPT
#Permitir accesos a máquinas conocidas, omitiremos el protocolo y puerto para simplificar, en este caso al servido smtp de google.
iptables -A OUTPUT -p all -d smtp.gmail.com -m state --state NEW -m comment --comment "Permitir saliente gmail " -j ACCEPT
#Escribir en el log el resto de actividad que vamos a denegar.
iptables -A OUTPUT -m comment --comment "LOG Rechazar saliente todo lo demas " -j LOG --log-prefix "Rechazar conexion saliente "
#Rechazar el resto
iptables -A OUTPUT -m comment --comment "Rechazar saliente todo lo demas " -j REJECT

Para más detalles sobre las llamadas podéis echarle un vistazo al post «Configuración firewall iptables Red Hat/CentOS 6, desde linea de comandos«.

Una vez ejecutado lo anterior podemos obtener el estado de iptables con:

Source   
[root@oradb ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED /* Permitir conexiones salientes existentes  */
ACCEPT     all  --  anywhere             anywhere            /* Permitir conexiones salientes internas  */
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain state NEW /* Permitir saliente puerte 53  */
ACCEPT     all  --  anywhere             s1.dominio.es state NEW /* Permitir saliente s1  */
ACCEPT     all  --  anywhere             wi-in-f108.1e100.net state NEW /* Permitir saliente gmail  */
ACCEPT     all  --  anywhere             wi-in-f109.1e100.net state NEW /* Permitir saliente gmail  */
LOG        all  --  anywhere             anywhere            /* LOG Rechazar saliente todo lo demas  */ LOG level warning prefix `Rechazar conexion saliente '
REJECT     all  --  anywhere             anywhere            /* Rechazar saliente todo lo demas  */ reject-with icmp-port-unreachable

El log de las conexiones rechazadas lo podemos ver en:
/var/log/messages

Realmente todo es aplicable para Ubuntu por ejemplo, lo único que cambia en el destino de log.

Os dejo el link a la documentación:

http://linux.die.net/man/8/iptables

Deja un comentario