Firewall con iptables politica DROP

Iniciado por scalverth, 10 Octubre 2012, 00:36 AM

0 Miembros y 1 Visitante están viendo este tema.

scalverth

Estoy con el trabajo de afinar el firewall de mi debian, esta todo bien después de las modificaciones que realice , pero quería que ustedes me den su punto de vista, por si hay algo que pueda mejorar.
Resumiendo pase todo a DROP para obtener mejor protección.

Aquí el código:


#!/bin/sh
##
## Recordar guardar en
## /etc/network/if-up.d/firewallver.sh
## chmod +x /etc/network/if-up.d/firewallver.sh

## Definimos las variables
## Interface conectada a internet
RED_EXT="eth0"
## Interface de red local
RED_INT="eth1"
## Ip de casa para conectar SSH
IP_CASA="190.138.0.101"
## DNS primario
DNS1="208.67.222.222"
## DNS secundario
DNS2="208.67.220.220"
WEBSERVER="192.168.10.20"

## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

## Establecemos politica por defecto DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

## Por ahora esta todo denegado.
## Debemos decir de manera explicita qué es lo que queremos abrir

## Operar en localhost sin limitaciones
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

## Este es un servicio que da la maquina a internet,
## por tanto todo paquete entrante se acepta para
## este puerto y los salientes vinculados se aceptan también.
#/sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#/sbin/iptables -A OUTPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

## Abrir puerto 80 del Web server dentro de la red local
## ( mejor seria una DMZ ;)
/sbin/iptables -t nat -A PREROUTING -i $RED_EXT -p tcp --dport 80 -j DNAT --to-destination $WEBSERVER:80
/sbin/iptables -A FORWARD -i $RED_EXT -o $RED_INT -p tcp --dport 80 -j ACCEPT

## Abrir puerto 22 para administrar ssh desde casa
/sbin/iptables -A INPUT -s $IP_CASA -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A OUTPUT -o $RED_EXT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT

## Abrir puerto 22 para administrar ssh desde la red local
/sbin/iptables -A INPUT -i $RED_INT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A OUTPUT -o $RED_INT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT

## El puerto 5900 debe estar abierto ya que esta instalado un servidor vnc
#/sbin/iptables -A INPUT -s $IP_CASA -p tcp --dport 5900 -j ACCEPT
#/sbin/iptables -A OUTPUT -o $RED_EXT -p tcp --sport 5900 -m state --state ESTABLISHED,RELATED -j ACCEPT

## Permitimos que el servidor y la red interna puedan salir a:
## Internet (navegación)
/sbin/iptables -A INPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

## webs seguras
/sbin/iptables -A INPUT -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT

## Correo POP3 SMTP
/sbin/iptables -A INPUT -p tcp -m tcp --sport 110 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 110 -m state --state RELATED,ESTABLISHED -j ACCEPT

/sbin/iptables -A INPUT -p tcp -m tcp --sport 465 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 465 -m state --state RELATED,ESTABLISHED -j ACCEPT

/sbin/iptables -A INPUT -p tcp -m tcp --sport 995 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 995 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 995 -m state --state RELATED,ESTABLISHED -j ACCEPT

/sbin/iptables -A INPUT -p tcp -m tcp --sport 587 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 587 -m state --state RELATED,ESTABLISHED -j ACCEPT

## Reglas necesarias para FTP pasivo y activo.
## Se permiten conexiones entrantes establecidas previamente
/sbin/iptables -A INPUT -p tcp -m tcp --sport 20:21 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 20:21 -m state --state RELATED,ESTABLISHED -j ACCEPT

/sbin/iptables -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 1024:65535 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --sport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT

## Permitimos la consulta a un primer DNS
/sbin/iptables -A INPUT -s $DNS1 -p udp -m udp --sport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -d $DNS1 -p udp -m udp --dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -s $DNS1 -p udp -m udp --sport 53 -j ACCEPT

## Permitimos la consulta a un segundo DNS
/sbin/iptables -A INPUT -s $DNS2 -p udp -m udp --sport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -d $DNS2 -p udp -m udp --dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -s $DNS2 -p udp -m udp --sport 53 -j ACCEPT

## Permitimos que se actualize la hora con internet
/sbin/iptables -A INPUT -p udp -m udp --sport 123 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -m udp --sport 123 -m state --state RELATED,ESTABLISHED -j ACCEPT

## FORWARD
## Aceptar los paquetes a hacer forward
/sbin/iptables -A FORWARD -i $RED_INT -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o $RED_EXT -j MASQUERADE

## Habilita el forwarding para poder responder
echo 1 > /proc/sys/net/ipv4/ip_forward

# Barrera de backup por si cambiamos a modo ACCEPT temporalmente
# Con esto protegemos los puertos reservados y otros conocidos
/sbin/iptables -A INPUT -p tcp -m tcp --dport 1:1024 -j DROP
/sbin/iptables -A INPUT -p udp -m udp --dport 1:1024 -j DROP
/sbin/iptables -A INPUT -p tcp -m tcp --dport 1723 -j DROP
/sbin/iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP
/sbin/iptables -A INPUT -p tcp -m tcp --dport 5432 -j DROP

#iptables -L -n para verificar las reglas
# Fin del script


La parte que me preocupa es esta:

## Abrir puerto 80 del Web server dentro de la red local
## ( mejor seria una DMZ ;)
/sbin/iptables -t nat -A PREROUTING -i $RED_EXT -p tcp --dport 80 -j DNAT --to-destination $WEBSERVER:80
/sbin/iptables -A FORWARD -i $RED_EXT -o $RED_INT -p tcp --dport 80 -j ACCEPT


Comentarios y sugerencias espero.
Gracias.

Epzylon

La redirección esta bien.
Ahora bien, podes añadir seguridad en varios aspectos.
Te recomiendo te des un vistazo sobre los posts que escribí en mi blog sobre el tema:
http://www.netsecure.com.ar/2008/12/02/netfilter-iptables-i/

En lo personal, haría un control anti flood, loguearia paquetes raros, e incluso haría un examen a nivel bajo (utilizando u32)
de  la carga de tcp, si la seguridad es lo que te preocupa.

Si quisieras cualquiera de estas cosas, u otras, podríamos abrir un tema separado quizas.

Saludos

scalverth

Gracias por tu respuesta, eso mismo quería pedir, material para lectura que me ayude a entender mejor.
Paso por tu blog a ver, si algo no entiendo te estaré solicitando tu ayuda.
Saludos.

scalverth

Investigando en la web recomendada por Epzylon lo primero que veo es el uso de "multiport".

Estaría bien así?


## Permitimos que el servidor y el los clientes servicios de:
## Internet (navegación), webs seguras, POP3 y SMTP
/sbin/iptables -A INPUT -p tcp -m multiport --sports 80,443,110,465,995,587 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m multiport --dports 80,443,110,465,995,587 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m multiport --sports 80,443,110,465,995,587 -m state --state RELATED,ESTABLISHED -j ACCEPT


Lo puse a prueba y funciona.

Epzylon

Creo que sería buena idea armar un tema nuevo con "trucos" para Iptables.
Empiezo a trabajar en eso, y ahí podrás sacar ideas para utilizar en tu script.

A alguien le gustaria participar en la recopilación de dichos trucos?

Saludos

scalverth

#5
La verdad que lo veo muy interesante, adelante con ese tema por favor.
Acá tengo unas 25 reglas de las cuales me estoy apoyando para mejorar este firewall.

1. Eliminar todas las reglas existentes
iptables -F

2. Establecer políticas por defecto
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

3. Bloquear una dirección IP específica
#BLOCK_THIS_IP="x.x.x.x"

iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

4. Permitir conexiones entrantes SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

5. Permitir conexiones entrantes SSH sólo a una red específica
iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

6. Permitir HTTP entrante

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

7. Permitir HTTPS entrante
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

8. Multipuerto (Permitir entrantes SSH, HTTP y HTTPS)
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

9. Permitir salir SSH

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

10. Permitir salir SSH sólo a una red específica
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

11. Permitir salir HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

12. Carguar tráfico HTTPS balanceado
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

13. Permitir ping desde el interior al exterior

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

14. Permitir ping desde el exterior al interior
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

15. Permitir el acceso loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

16. Permitir que los paquetes de red interna salgan a la red externa.
# if eth1 is connected to external network (internet)
# if eth0 is connected to internal network (192.168.1.x)
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

16. Permitir consultas DNS

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

17. Permitir conexiones NIS
#rpcinfo -p | grep ypbind ; This port is 853 and 850
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT

18. Permitir rsync de una red específica
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

19. Permitir conexión MySQL sólo desde una red específica
iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

20. Permitir Sendmail o Postfix

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

21. Permitir IMAP y IMAPS
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

22. Permitir POP3 y POP3S
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

23. Prevenir ataques DoS

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

24. Reenvío de puertos 422 to 22
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

25. Log de paquetes rechazados
iptables -N LOGGING

iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
iptables -A LOGGING -j DROP


Fuente:
http://www.thegeekstuff.com/scripts/iptables-rules

soft6perso

una duda . .
si en ese esquema tuvieramos en otra subred (eth2) una DMZ ahi tendriamos que poner los servidores verdad?

y tendriamos que hacer DNAT a los servicios que tuvuieramos ahi?
si tuvieramos un servidor DNS tendriamos que hacer lo mismo?

solo dudas, no soy experto en el tema, solo quiero profundizar.
gracias

scalverth

Citaruna duda . .
si en ese esquema tuviéramos en otra subred (eth2) una DMZ ahí tendríamos que poner los servidores verdad?

Esto se trata de forma detallada acá:
http://www.pello.info/filez/firewall/iptables.html#33

Citarsi tuviéramos un servidor DNS tendríamos que hacer lo mismo?
Con respecto a esto según entiendo si tenes un server DNS al resto de la red debes ponerle la ip de ese servidor en el archivo resolv.conf

ameise_1987

Cita de: Epzylon en 10 Octubre 2012, 03:06 AM
La redirección esta bien.
Ahora bien, podes añadir seguridad en varios aspectos.
Te recomiendo te des un vistazo sobre los posts que escribí en mi blog sobre el tema:
http://www.netsecure.com.ar/2008/12/02/netfilter-iptables-i/

En lo personal, haría un control anti flood, loguearia paquetes raros, e incluso haría un examen a nivel bajo (utilizando u32)
de  la carga de tcp, si la seguridad es lo que te preocupa.

Si quisieras cualquiera de estas cosas, u otras, podríamos abrir un tema separado quizas.

Saludos

muy buenos post, thanx.
firma retirada por insultar/cachondearse de (anelkaos) del staff.