Código:
#! /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).