En el siguiente artículo, le mostraremos cómo puede asegurar y proteger su servidor virtual basado en Ubuntu o Debian usando un firewall aplicación, llamada iptables.
¿Qué es iptables?
Es un programa de aplicación de espacio de usuario que permite a un administrador del sistema configurar las tablas proporcionadas por el firewall del kernel de Linux (implementado como diferentes módulos de Netfilter ) y las cadenas y reglas que almacena.
Para reducir el número de intentos de intrusión y filtrar los puertos abiertos en su servidor virtual, es necesario configurar correctamente su cortafuegos. .
Para facilitar la administración de las reglas de firewall de su servidor, proporcionaremos un script de shell simple que lo ayudará con la administración de las reglas de firewall. Básicamente, cada vez que necesite cambiar las reglas de su cortafuegos, usará este script para agregar/eliminar las reglas deseadas.
CONFIGURAR REGLAS DE FIREWALL
Antes de envolver las reglas en un script, dividámoslo en secciones para que pueda conocer el diseño del firewall y qué reglas se implementarán.
ELIMINAR LAS REGLAS ANTIGUAS
Las reglas del cortafuegos se pueden vaciar con los siguientes comandos:
## iptables --flush ## iptables --delete-chain ## iptables --table nat --flush ## iptables --table nat --delete-chain
DETERMINAR PUERTOS DE SERVICIO
Debe saber qué servicios ha expuesto al público para poder establecer reglas apropiadas para ellos. Una forma de encontrar qué servicios están escuchando en qué puertos es usar netstat
o ss
comandos como en:
## netstat -tunlp or ## ss -tunlp
por ejemplo, estamos usando uno de nuestros servidores virtuales Ubuntu 12.04 LTS y el siguiente es el resultado de netstat
comando:
## netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 296/mysqld tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 209.135.140.77:53 0.0.0.0:* LISTEN 353/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 173/vsftpd tcp 0 0 0.0.0.0:5622 0.0.0.0:* LISTEN 630/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 261/dovecot udp 0 0 209.135.140.77:53 0.0.0.0:* 353/named udp 0 0 127.0.0.1:53 0.0.0.0:* 353/named
entonces esto significa que tenemos los siguientes puertos abiertos al público:
- 25 (smtp)
- 587 (envío SMTP)
- 110 (pop3)
- 143 (mapa)
- 993 (imáfono SSL)
- 995 (pop3 ssl)
- 80 (http)
- 443 (https)
- 53 (DNS)
- 21 (ftp)
- 5622 (ssh)
CONFIGURAR POLÍTICAS PREDETERMINADAS
ok, ahora podemos configurar las políticas de nuestro cortafuegos para DROP todo en la ENTRADA y ADELANTE cadenas y permitir el tráfico en la SALIDA cadena.
la tabla predeterminada filter
contiene tres cadenas integradas:
- El tráfico entrante dirigido a la propia máquina llega a la cadena INPUT.
- El tráfico saliente generado localmente llega a la cadena de SALIDA.
- El tráfico enrutado que no debe entregarse localmente llega a la cadena FORWARD.
verifique man 8 iptables
para más información sobre esto
Las políticas predeterminadas se pueden aplicar mediante los siguientes comandos:
## iptables -P INPUT DROP # <- do not run this over ssh as it will lock you out ## iptables -P FORWARD DROP ## iptables -P OUTPUT ACCEPT
CONFIGURACIÓN DE REGLAS DE FIREWALL
Lo siguiente que debe hacer es configurar las reglas de firewall para nuestros servicios. Como la cadena de ENTRADA está CAÍDA, necesitaremos incluir en la lista blanca los servicios que están escuchando en los puertos públicos, por lo que:
lo primero es habilitar el uso gratuito de las loopback interfaces
, para garantizar que todas las sesiones TCP comiencen con SYN y para permitir paquetes establecidos y relacionados:
## iptables -A INPUT -i lo -j ACCEPT ## iptables -A OUTPUT -o lo -j ACCEPT ## iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
a continuación, abramos nuestros puertos de servicio usando reglas de firewall como:
### SSH ## iptables -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT ### HTTP ## iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT ### SMTP ## iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
y así. Una vez que todos los servicios están en la lista blanca, es una buena idea permitir los paquetes ICMP y REGISTRAR y DESCARTAR todo lo demás en la cadena de ENTRADA.
## iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT ## iptables -A INPUT -j LOG ## iptables -A INPUT -j DROP
GUARDAR/RESTAURAR LAS REGLAS DEL FIREWALL
Las reglas del cortafuegos no son persistentes de forma predeterminada, lo que significa que se perderán si reinicia su servidor virtual, por ejemplo. Para guardar su cortafuegos actual en /etc/fwall.rules
usarías algo como:
## iptables-save > /etc/fwall.rules
y para restaurar las reglas guardadas, usaría algo como:
## iptables-restore -c /etc/fwall.rules
para que las reglas se restablezcan automáticamente al iniciar el sistema, debe usar un paquete llamado iptables-persistent
o simplemente puede crear un script en /etc/network/if-pre-up.d
que cargará las reglas guardadas en /etc/fwall.rules
, por ejemplo:
## vim /etc/network/if-pre-up.d/iptables #!/bin/bash test -e /etc/fwall.rules && iptables-restore -c /etc/fwall.rules ## chmod +x /etc/network/if-pre-up.d/iptables
GUIÓN DE CORTAFUEGOS
guarde el script en /usr/local/bin/fwall-rules
y hacerlo ejecutable
#!/bin/bash IPTABLES=/sbin/iptables echo " * flushing old rules" ${IPTABLES} --flush ${IPTABLES} --delete-chain ${IPTABLES} --table nat --flush ${IPTABLES} --table nat --delete-chain echo " * setting default policies" ${IPTABLES} -P INPUT DROP ${IPTABLES} -P FORWARD DROP ${IPTABLES} -P OUTPUT ACCEPT echo " * allowing loopback devices" ${IPTABLES} -A INPUT -i lo -j ACCEPT ${IPTABLES} -A OUTPUT -o lo -j ACCEPT ${IPTABLES} -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## BLOCK ABUSING IPs HERE ## #echo " * BLACKLIST" #${IPTABLES} -A INPUT -s _ABUSIVE_IP_ -j DROP #${IPTABLES} -A INPUT -s _ABUSIVE_IP2_ -j DROP echo " * allowing ssh on port 5622" ${IPTABLES} -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT echo " * allowing ftp on port 21" ${IPTABLES} -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT echo " * allowing dns on port 53 udp" ${IPTABLES} -A INPUT -p udp -m udp --dport 53 -j ACCEPT echo " * allowing dns on port 53 tcp" ${IPTABLES} -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT echo " * allowing http on port 80" ${IPTABLES} -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT echo " * allowing https on port 443" ${IPTABLES} -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT echo " * allowing smtp on port 25" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT echo " * allowing submission on port 587" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT echo " * allowing imaps on port 993" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT echo " * allowing pop3s on port 995" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT echo " * allowing imap on port 143" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT echo " * allowing pop3 on port 110" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT echo " * allowing ping responses" ${IPTABLES} -A INPUT -p ICMP --icmp-type 8 -j ACCEPT # DROP everything else and Log it ${IPTABLES} -A INPUT -j LOG ${IPTABLES} -A INPUT -j DROP # # Save settings # echo " * SAVING RULES" if [[ -d /etc/network/if-pre-up.d ]]; then if [[ ! -f /etc/network/if-pre-up.d/iptables ]]; then echo -e "#!/bin/bash" > /etc/network/if-pre-up.d/iptables echo -e "test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules" >> /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables fi fi iptables-save > /etc/fwall.rules iptables-restore -c /etc/fwall.rules
## chmod +x /usr/local/bin/fwall-rules
para activar las reglas que ha preparado en el script, simplemente ejecute
## fwall-rules
desde la línea de comandos. Para agregar o eliminar una regla, solo necesita abrir el script, agregar o eliminar la regla deseada, guardarla y ejecutarla nuevamente, por ejemplo:
## fwall-rules * flushing old rules * setting default policies * allowing loopback devices * allowing ssh on port 5622 * allowing ftp on port 21 * allowing dns on port 53 udp * allowing dns on port 53 tcp * allowing http on port 80 * allowing https on port 443 * allowing smtp on port 25 * allowing submission on port 587 * allowing imaps on port 993 * allowing pop3s on port 995 * allowing imap on port 143 * allowing pop3 on port 110 * allowing ping responses * SAVING RULES
Por supuesto, no tiene que hacer nada de esto si utiliza uno de nuestros servicios de alojamiento VPS de Linux, en cuyo caso simplemente puede pedirle a nuestros administradores expertos de Linux que lo hagan por usted. Están disponibles las 24 horas del día, los 7 días de la semana y atenderán su solicitud de inmediato.
PD. Si te gustó esta publicación, compártela con tus amigos en las redes sociales usando los botones de la izquierda o simplemente deja una respuesta a continuación. Gracias.