[AYUDA] Mi primer firewall iptables

Iniciado por danny920825, 6 Abril 2016, 21:07 PM

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

danny920825

Hola a todos los que me leen. Llevo el dia entero leyendo un muy buen tutorial sobre iptables, que es cada cosa y como configurar cada elemento dentro del mismo. Al final me decidi a crear el mio propio apoyandome claro está en ese tutorial ya que no me lo aprendi todo de memoria. Cuando finalicé, lo sustitui por el que tengo (otro script en iptables que hizo un amigo y esta genial) y no funciona bien. Lo hice por funciones para poder darle las opciones start, stop, restart y open. El supuestamente trabaja bien, pero si le doy start, todas las conexiones dan time out. Si lo pongo en open si trabaja pero a nadie la gusta tener un firewall "ABIERTO". A continuacion les adjunto el codigo a ver si alguien me ayuda por favor.


#! /bin/bash

# /etc/init.d/firewall
#
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $network
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Firewall configuration
### END INIT INFO

#LOCAL SERVERS
CORREO=192.168.21.3 # CORREO
DNS=192.168.21.2 # DNS
ADMIN=192.168.21.5 # Informatico
FIREWALL=192.168.21.1 # Firewall (esta pc)
WIFI=192.168.21.7 # PC Virtual de Pruebas

LAN=192.168.21.0/24

# INTERFACES
LANIF=eth1
WANIF=eth0

# DIRECCIONES IP
WANIP2=xxx.xxx.xxx.xxx
WANIP3=xxx.xxx.xxx.xxx

ANY=0.0.0.0/0

#Variable para los comentarios
com="-m comment --comment"

refrescar_reglas()
{
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F -t nat
}

#ESTABLECE POLITICA POR DEFECTO COMO PERMISIVA, LO QUE NO SE DENIEGUE

EXPLICITAMENTE SE DEJA PASAR
politica_accept()
{
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}

#ESTABLECE POLITICA POR DEFECTO COMO CERRADA, LO QUE NO SE PERMITA EXPLICITAMENTE

SE DENIEGA
politica_descartar()
{
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
}

conexion_establecida()
{
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

}

localhost()
{
iptables -A INPUT -i lo -j ACCEPT -m comment --comment "Trafico Localhost IN"
iptables -A INPUT -i $LANIF -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT -m comment --comment "Trafico Localhost OUT"
}

ssh()
{
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j

ACCEPT $com "SSH DESDE LAN"
}

ping_icmp()
{
iptables -A INPUT -i eth1 -p icmp -j ACCEPT
}

#NATEOS
##################################################################################

########################################################################
route()
{
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s $CORREO -o $WANIF -j SNAT --to-source $WANIP2
iptables -t nat -A POSTROUTING -s $DNS -o $WANIF -j SNAT --to-source $WANIP2
iptables -t nat -A POSTROUTING -s $WIFI -o $WANIF -j SNAT --to-source $WANIP2
iptables -t nat -A POSTROUTING -s $ADMIN -o $WANIF -j SNAT --to-source $WANIP2
}
#PORT FORWARDING
port_forwarding()
{
iptables -t nat -A PREROUTING -d $WANIP2 -p tcp -m multiport --dports 25,587 -m

state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination $CORREO
}
#FORWARDING
forwarding()
{
#Admin
iptables -A FORWARD -s $ADMIN -j ACCEPT
iptables -A FORWARD -d $ADMIN -j ACCEPT

#DNS
iptables -A FORWARD -s $DNS -p tcp -m multiport --dports 53,953 -j ACCEPT
iptables -A FORWARD -d $DNS -p tcp -m multiport --dports 53,953 -j ACCEPT
iptables -A FORWARD -s $DNS -p udp -m multiport --dports 53,953 -j ACCEPT
iptables -A FORWARD -d $DNS -p udp -m multiport --dports 53,953 -j ACCEPT
iptables -A FORWARD -s $DNS -p icmp -j ACCEPT
iptables -A FORWARD -d $DNS -p icmp -j ACCEPT


#SMTP,DNS,WEBMAIL IN AND OUT
iptables -A FORWARD -d $CORREO -j ACCEPT
iptables -A FORWARD -s $CORREO -j ACCEPT

#WIFI
iptables -A FORWARD -s $WIFI -j ACCEPT
}

##################################################################################

########################################################################

ancho_banda()
{
# HACEMOS LIMPIEZA
# BORRAMOS TODAS LAS REGLAS ANTERIORES
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root

#CLASE QUE REPRESENTA LA SALIDA DE PAQUETES, A 64Kbit (ESTO ES PARA EL CORREO)
tc qdisc add dev eth0 root handle 1:0 htb default 99
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 128Kbit ceil 128Kbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 64Kbit ceil 70Kbit prio 2
tc qdisc add dev eth0 parent 1:11 handle 10: sfq perturb 10

#CLASE QUE REPRESENTA LA ENTRADA DE PAQUETES, A 64Kbit (ESTO ES PARA EL CORREO)
tc qdisc add dev eth1 root handle 2:0 htb default 99
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 128Kbit ceil 128Kbit
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 64Kbit ceil 70Kbit prio 2
tc qdisc add dev eth1 parent 2:11 handle 20: sfq perturb 10

#EL TRAFICO ENTRANTE SERA DE LA CLASE 2 Y LA SALIDA DE LA CLASE 1
iptables -t mangle -I POSTROUTING -o eth0 -p tcp -s $CORREO -j CLASSIFY --set-

class 1:11
iptables -t mangle -I POSTROUTING -o eth0 -p tcp -d 10.0.0.2 -j CLASSIFY --set-

class 2:11
}

flags()
{
#NO SE ACEPTAN PAQUETES CON flags DE URGENTE, FINALIZADO NI EMPUJE
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP

#LOS QUE NO TIENEN flags QUE NO ENTREN
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

#LOS PAQUETES DE UNA NUEVA CONEXION DEBEN SER SYN
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

#PAQUETES INCOMPLETOS TAMPOCO QUEREMOS
iptables -A INPUT -f -j DROP

# LAS CONEXIONES QUE NO PERTENEZCAN AL SISTEMA SE BOTAN
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
}

dns()
{
iptables -A OUTPUT -o $WANIF -s $WANIP2 -p udp --dport 53 -m state --state

NEW,RELATED,ESTABLISHED -j ACCEPT -m comment --comment "CONSULTAS DNS DESDE

GATEWAY"
}

ftp()
{
iptables -A OUTPUT -o $WANIF -m multiport -p tcp --dports 20:21,1024:65535 -m

state --state NEW,RELATED,ESTABLISHED -j ACCEPT
}

case "$1" in
start)
refrescar_reglas
flags
politica_descartar
conexion_establecida
ancho_banda
dns
ssh
ping_icmp
ftp
route
forwarding
port_forwarding
echo "FIREWALL ACTIVO"
;;
open)
refrescar_reglas
politica_accept
route
forwarding
echo "MODO ENRUTADOR Y TRADUCCION IP ¡ABIERTO!"
;;
stop)
refrescar_reglas
politica_accept
route
forwarding
port_forwarding
echo "FIREWALL DETENIDO!!! CUIDADO"
;;
restart)
echo "REINICIANDO"
$0 stop
$0 start
;;
*)
echo "Usar Start|Stop|Open|restart"
esac

exit 0


Trate de tenerlo lo mas comentado posible para que se entienda (mas por mi que por otra cosa, para no perderme).
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

andavid

Me parece que esto tiene mas pinta de ir en el subforo de LINUX que aca.


Stakewinner00

#2
si no recuerdo mal con "iptables -F" ya borras todo, no hace falta hacerlo con el INPUT OUTPUT etc,

"#LOS PAQUETES DE UNA NUEVA CONEXION DEBEN SER SYN
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"

Según vi hace tiempo no es recomendable,
Citar"You require NEW packets to have SYN. This will break if a TCP connection is continued after the respective state in iptables already timed out. Not sure what the default timeouts are, but some netfilter guy warned about it."
fuente: http://security.stackexchange.com/questions/4603/tips-for-a-secure-iptables-config-to-defend-from-attacks-client-side

echo 1 > /proc/sys/net/ipv4/ip_forward
Eso lo puedes meter en /etc/sysctl.conf, net.ipv4.ip_forward = 1

Para no tener que esperar el timeout igual podrías cambiar de DROP a REJECT para mandar un paquete avisando que no se puede conectar, luego puedes comentar todas las funciones menos una luego comentas todas menos 2 hasta que descubras que regla en concreto es la que causa el problema.

Como recomendación, intenta mantenerlo lo más simple y sencillo posible,

danny920825

Gracias, eso es lo que haré. Ir probando una por una. Lo que pensaba que tenia algun error de sintaxis o algo asi. Y gracias por la ayuda con la flags, no habia leido sobre esa recomendacion. Gracias por todo. Ya comentaré sobre la solucion y cual era el problema.
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

danny920825

Stakewinner00 Al parecer el problema estaba en la flags:
"#LOS PAQUETES DE UNA NUEVA CONEXION DEBEN SER SYN
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"

porque la comenté y al momento funcionó todo lo demas. Gracias por el aporte sobre las flags y sobre "iptables -F" para borrar todas las reglas. Has sido de mucha ayuda. No habia respondido antes porque necesitaba el internet de forma permanente y no podia probar. Asi que propongo a los moderadores cerrar el tema
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno