[SOLUCIONADO] Consulta sobre iptables + solicitud revisión de firewall.

Iniciado por ignorante, Enero 07, 2016, 06:13:56 AM

Tema anterior - Siguiente tema

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

Buenas a todos, este es mi primer post.Estoy con mi primer firewall y ya encuentro problemas, en mi pc me bloquea el internet, y ni con iptables -F puedo restaurarlas. Debe tener muchos errores que espero que puedan corregir y explicar con paciencia.
Ademas una consulta especifica: Cuando debe especificarse la interface (lo,eth0,etc...)?
Muchas gracias por su tiempo.


CODIGO:

Código: bash
#!/bin/bash
#Remove all rules
iptables -F


# Policy Drop
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

#Allow Apache (80/443)
iptables -A INPUT -m state --state NEW -p tcp  --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp  --dport 443 -j ACCEPT
#Allow http-proxy
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 8080 -j ACCEPT
#Allow port 8443 (Plesk)
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 8443 -j ACCEPT
#FTP
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 21 -j ACCEPT
####MAILING####
#Allow SMTP
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 25 -j ACCEPT
#Allow IMAP
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 143 -j ACCEPT
#Allow IMAPS
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 993 -j ACCEPT
#Allow SMTPS
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 465 -j ACCEPT
#Allow ESMTPS
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 587 -j ACCEPT
#Allow 110
iptables -A INPUT -m state --state NEW -p tcp  --dport 110 -j ACCEPT
########DATABASE####
#Allow Mysql
iptables -A INPUT -p tcp -i eth0 --dport 3306 -j ACCEPT
#Allow PostgreSQL
iptables -A INPUT -p tcp -i eth0 --dport 5432 -j ACCEPT
#Allow DNS
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
########## R1soft CDP System ###############
iptables -A INPUT -p tcp -m tcp -s xx.xx.xx.xx --dport 1167 -j ACCEPT



#Allow Nexpose
iptables -A INPUT -m state --state NEW -p tcp -i eth0 --dport 3780 -j ACCEPT

##Redirect SSH to port 50683##
iptables -A PREROUTING -t nat -p tcp -d 127.0.0.1 --dport 22 -j DNAT -to 127.0.0.1 --dport 50683


#We tell iptables to add (-A) a rule to the incoming (INPUT)- SSH works on port 50683 instead 22.
iptables -A INPUT -p tcp -m tcp --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s xx.xx.xx.xx --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s xx.xx.xx.xx --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s xx.xx.xx.xx --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP




#iptables -A PREROUTING -t nat -p tcp -d 127.0.0.1 --dport 22 -j DNAT -to 127.0.0.1:50683

#Reject
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable

#flood
iptables -N FLOOD
iptables -A FLOOD -m --limit 2/s --limit-burst 5 -j RETURN
iptables -A FLOOD -j DROP

iptables -A INPUT -j FLOOD
iptables -A INPUT -p tcp  --dport 80 -j ACCEPT
#HTTP requests limit to 20
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 25 --connlimit-mask 24 -j DROP

#ALLOW ALL OUTPUT TRAFFIC
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


iptables -L -n
iptables-save |  tee /etc/iptables.test.rules
iptables-restore < /etc/iptables.test.rules
#service iptables restart

Normalmente lo que hacemos con iptables siempre es aceptar las conexiones que nos interesan y negar el resto, no se en que tipo de entorno estes usando iptable (empresa, produccion, uso personal, etc..) por lo cual no sabria decirte si esta bien ó mal configurado.

Leete este sencillo articulo para que te orientes:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos y cuenta que tal todo.
El talento se parece al tirador que da en un blanco que los demás no pueden alcanzar; el genio se parece al tirador que da en un blanco que los demás no pueden ver.


Cl0udswX , muchas gracias por responder, tengo dias luchando con ese script del #%$^$#.

Como ves lo primero que hice fue definir las politicas como bien dijiste,rechazando todo lo entrante por defecto y permitiendo lo saliente.
A eso agregue reglas de excepcion permitiendo acceso entrante a los servicios necesarios: apache, r1soft, mysql, smtp,imap, ftp, imaps,etc...
Ademas redirijo el puerto 22 al 50683. Aplico unas reglas contra flood y ddos.

El firewall es para un server en produccion, aunque no llegue a probarlo ahi,porque no pasa de mi maquina, y no encuentro el error.
Ademas sigo teniendo la duda,que tampoco esta explicada en el link que compartiste, en que casos se especifica la interface y en que casos no?.

Gracias de nuevo,un saludo.

Hola,

La mejor forma es especificando la "interface" ya que si no lo haces seguramente lo hará de forma automática o bien para todas las interfaces. Sabiendo que interface estas utilizando estaría bien especificarlo ya que además puedes configurar reglas con distintas interfaces.

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.

Si encuentras errores puedes probar de eliminar la linea o lineas conflictivas de la siguiente forma:

Código: bash
iptables -nL --line-number


Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 23.4.18.17 0.0.0.0/0
2 ACCEPT all -- 23.4.18.18 0.0.0.0/0
3 ACCEPT all -- 23.4.18.19 0.0.0.0/0
4 ACCEPT all -- 23.4.18.20 0.0.0.0/0
5 ACCEPT all -- 23.4.18.21 0.0.0.0/0

Una vez que conocemos el número de linea que queremos eliminar y la cadena a la que pertenece simplemente utilizamos el modificador:

-D chain número

Código: bash
iptables -D INPUT 4


Una vez que ejecutemos el comando, veremos que la linea deseada a desaparecido y las reglas se han reenumerado.

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 23.4.18.17 0.0.0.0/0
2 ACCEPT all -- 23.4.18.18 0.0.0.0/0
3 ACCEPT all -- 23.4.18.19 0.0.0.0/0
4 ACCEPT all -- 23.4.18.21 0.0.0.0/0


Saludos

Muchas gracias Stiuvert, habia consultado en otros lados y nunca me respondieron tan claramente.  Ademas me aclaraste como encontrar yo mismo los errores.
Gracias che, espero volver a postear en este thread con otras consultas.