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