Estuve un tiempo pensando en dos cosas respecto a esto de iptables: la mayoría de los que buscan estos tutoriales son principiantes y segundo muchos buscan ya algo medianamente sencillo y ya elaborado.
Este ejemplo es para un servidor web, pero puedes fácilmente agregar mas reglas y adaptarlo a tus necesidades.
Cuando vean «x» cambien por sus ip’s
#!/bin/bash
#Limpiamos tablas
iptables -F
iptables -X
# Limpiamos NAT
iptables -t nat -F
iptables -t nat -X
# tabla mangle para cosas como PPPoE, PPP, and ATM
iptables -t mangle -F
iptables -t mangle -X
# Politicas Pienso que este es la mejor forma para principiantes y
# aun así no esta mal, te explico output(salida) todo porque son conexiones
# salientes, input descartamos todo, y ningun servidor debería hacer forward.
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Intranet LAN
intranet=eth0
#Extranet wan
extranet=eth1
# Keep state. Todo lo que ya esta conectado (establecido) lo dejamos asi
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Loop device.
iptables -A INPUT -i lo -j ACCEPT
# http, https, no especificamos la interfaz por que
# queremos que sea por todas
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ssh solo internamente y desde este rango de ip's
iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet --dport 7659 -j ACCEPT
# monitoreo por ejemplo si tienen zabbix o algun otro servicio snmp
iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet --dport 10050 -j ACCEPT
# icmp, ping bueno es decisión tuya
iptables -A INPUT -p icmp -s 192.168.x.x/24 -i $intranet -j ACCEPT
#mysql con postgres es el puerto 5432
iptables -A INPUT -p tcp -s 192.168.x.x --sport 3306 -i $intranet -j ACCEPT
#sendmail bueeeh si quieres enviar algún correo
#iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
#Anti-SPOOFING 09/07/2014
#
SERVER_IP="190.x.x.x" # server IP - la ip wan real de tu servidor
LAN_RANGE="192.168.x.x/21" # Rango LAN de tu red o de tu vlan
# Ip's que no deberian entrar por la extranet nunca, es usar un poco de
# lógica si tenemos una interfaz netamente WAN no debería jamas entrar
# trafico tipo LAN por esa interfaz
SPOOF_IPS="0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16"
# Acción por defecto - que se realizara cuando haga match alguna regla
ACTION="DROP"
# Paquetes con la misma ip de mi servidor por la wan
iptables -A INPUT -i $extranet -s $SERVER_IP -j $ACTION
#iptables -A OUTPUT -o $extranet -s $SERVER_IP -j $ACTION
# Paquetes con el Rango LAN por la wan, lo coloco así por si tienes
# alguna red particular, pero esto es redundante con la siguiente
# regla dentro del bucle "for"
iptables -A INPUT -i $extranet -s $LAN_RANGE -j $ACTION
iptables -A OUTPUT -o $extranet -s $LAN_RANGE -j $ACTION
## Todas las Redes SPOOF no permitidas por la wan
for ip in $SPOOF_IPS
do
iptables -A INPUT -i $extranet -s $ip -j $ACTION
iptables -A OUTPUT -o $extranet -s $ip -j $ACTION
done
Como siempre espero sus comentarios, permanezcan sintonizados en este blog, Gracias
12 comentarios, deja el tuyo
Me sirve para seguir aprendiendo un poco mas gracias copiado.
de nada, me alegro de ser de ayuda
Lo siento mucho, pero tengo dos preguntas (y una de regalo 😉 ):
¿Llegaría con esta configuración para tener Apache funcionando y cerrar el resto salvo SSH?
#Limpiamos tablas
iptables -F
iptables -X
Limpiamos NAT
iptables -t nat -F
iptables -t nat -X
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
ssh solo internamente y desde este rango de ip’s
iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet –dport 7659 -j ACCEPT
Segunda pregunta: ¿Es el 7659 el puerto que se usa en SSH en este ejemplo?
Y tercera y última: ¿en qué archivo debe guardarse esta configuración?
Muchas gracias por el tutorial, es una pena que sea tan novato y no pueda aprovecharlo bien.
esta es la regla que necesitas para http de apache
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
pero también necesitas declarar las políticas por defecto de drop (esta en el script)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
y esta por que si estas remoto, te va a botar.
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
si 7659 es el puerto de ese ssh en el ejemplo, por defecto es 22, aunque te recomiendo cambiar a un puerto «no bien conocido»
hombre no se, como tu quieras… firewall.sh y lo colocas en rc.local (sh firewall.sh) para que se ejecute automatico, depende de que sistema operativo tengas existen archivos donde puedes colocar las reglas directamente.
Eii bro muy bueno tu script, analizandolo ….sabes como podria denegar todas la peticiones de mis usuarios a un sitio web especifico?…. pero este sitio web tiene mucho servidores ….
Te recomiendo otras opciones:
1) Puedes crear una zona falsa en tu dns…
2) Puedes colocar un proxy con acl
sin embargo
Por iptables puedes asi… no siempre es la mejor opción(existen mas formas)
iptables -A INPUT -s blog.desdelinux.ne -j DROP
iptables -A OUTPUT -d blog.desdelinux.net -j DROP
Cuéntame si funciono
Gracias por la respuesta, todo aclarado. Lo del puerto lo preguntaba porque me extrañó usar el 7659, ya que los puertos privados empiezan en el 49152, y podría interferir con algún servicio o algo.
De nuevo, gracias por todo, ¡así da gusto!
Saludos.
BrodyDalle como puedo ponerme en contacto con usted? Muy interesante su script.
soulofmarionet_1@hotmail.com
La ante última línea «iptables -A OUTPUT -o $extranet -s $ip -j $ACTION» está para evitar que tu propia máquina haga spoofing? ¿o es posible que ingrese algún paquete envenenado y pueda salir con ese source envenenado y por eso también se incluye la regla con OUTPUT?
Muchas gracias por la aclaración!!!
este es mi propio script de iptables, es muy completo:
# franes.iptables.airoso
# doc.iptables.airoso: iptables para legacy y para nft
#
# puertos del firewall
###########################
#!/bin/bash
#
# limpia la pantalla
############################### inicio de /etc/f-iptables/default.cfg |||||
clear
# deja una linea en blanco
echo
export si=»» no=»echo off»
# las variables que puedes cambiar para permitir acceso
###################### variables para modificar con $si o $no
export hayexcepciones=»$no»
# hayexcepciones: $si para permitir host excepcioneles y $no para desactivar
export hayping=»$no»
# hayping: $si para permitir los pings a terceros y $no para denegar
export haylogserver=»$no»
# haylogeosserver: $si para poder logear tcp $no para no poder logear tcp
######
###################### variables a modificar añadiendo «,» o con rangos de «:»
export excepciones=»baldras.wesnoth.org»
# excepciones permitir a uno o a varios host desde el firewall o sin valor
export logserver=discard,ipp,dict,ssh
# puertos servidor tcp a los que se guarda un log cuando entran paquetes
export redserver=0/0
# redserver: la red para puertos servidores preferible red local o varias ips
export redcliente=0/0
# redcliente: la red para puertos clientes preferible todas las redes
export servidortcp=discard,ipp,dict,6771
# servidortcp: los puertos servidores tcp especificados
export servidorudp=discard
# servidorudp: los puertos servidores udp especificados
export clienteudp=domain,bootpc,bootps,ntp,20000:45000
# clienteudp: los puertos clientes udp especificados
export clientetcp=domain,http,https,ipp,git,dict,14999:15002
# clientetcp: los puertos clientes tcp especificados
############################## fin de /etc/f-iptables/default.cfg |||||
############################### fin de variables para modificar
export firewall=$1 variables=$2
if [ «$variables» = «$NULL» ]; then source /etc/f-iptables/default.cfg;
else source /etc/f-iptables/$2; fi
############################### o va sobreescribir las variables con un archivo.cfg
############################################################################################
export firewall=$1 export variables=$2
########################################## variables automaticas del sistema
if [ «$firewall» = «desconectado» ]; then echo FIREWALL DESCONECTADO;
export activarservidor=»$no» activarcliente=»$no» mojado=»$no»;
elif [ «$firewall» = «cliente» ];then echo FIREWALL CLIENTE;
export activarservidor=»$no» activarcliente=»» mojado=»$no»;
elif [ «$firewall» = «servidor» ]; then echo FIREWALL SERVIDOR;
export activarservidor=»» activarcliente=»$no» mojado=»$no»;
elif [ «$firewall» = «clienteyservidor» ]; then echo FIREWALL CLIENTE Y SERVIDOR;
export activarservidor=»»; export activarcliente=»»;export mojado=»$no»;
elif [ «$firewall» = «permisivo» ]; then echo FIREWALL PERMISIVO;
export activarservidor=»$no» activarcliente=»$no» mojado=»»;
else
$comprueba sudo echo iptables-legacy:
$comprueba sudo iptables-legacy -v -L INPUT
$comprueba sudo iptables-legacy -v -L OUTPUT
$comprueba sudo echo iptables-nft:
$comprueba sudo iptables-nft -v -L INPUT
$comprueba sudo iptables-nft -v -L OUTPUT
echo _____parmetros____ $0 $1 $2
echo «lanza sin parametros es para listar iptables.»
echo «El primer parametro (activar iptables): desconectado o cliente o servidor o clienteyservidor o permisivo.»
echo «El segundo parametro: (opcional): el archivo.cfg por defecto elige /etc/f-iptables/default.cfg»
echo «Las configuraciones de las variables: » $(ls /etc/f-iptables/)
exit 0; fi
################
echo
echo Lanza $0 desconectado o cliente o servidor o clienteyservidor o permisivo o variables o sin usar parametro para listar iptables.
echo El archivo $0 contiene algunas variables editables dentro.
################################ las anteriores variables activadas
################################
echo configurando las variables de iptables
echo variables activadas
echo
############################ las reglas de iptables
echo Configurando iptables-legacy
sudo /usr/sbin/iptables-legacy -t filter -F
sudo /usr/sbin/iptables-legacy -t nat -F
sudo /usr/sbin/iptables-legacy -t mangle -F
sudo /usr/sbin/ip6tables-legacy -t filter -F
sudo /usr/sbin/ip6tables-legacy -t nat -F
sudo /usr/sbin/ip6tables-legacy -t mangle -F
sudo /usr/sbin/ip6tables-legacy -A INPUT -j DROP
sudo /usr/sbin/ip6tables-legacy -A OUTPUT -j DROP
sudo /usr/sbin/ip6tables-legacy -A FORWARD -j DROP
sudo /usr/sbin/iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$haylogserver sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –dports $logserver -j LOG > /dev/null
$hayexcepciones sudo /usr/sbin/iptables-legacy -A INPUT -s $excepciones -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-legacy -A INPUT -p udp -m multiport –dports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –dports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-legacy -A INPUT -p udp -m multiport –sports $clienteudp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –sports $clientetcp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$hayping sudo /usr/sbin/iptables-legacy -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT > /dev/null
sudo /usr/sbin/iptables-legacy -A INPUT -j DROP > /dev/null
sudo /usr/sbin/iptables-legacy -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$hayexcepciones sudo /usr/sbin/iptables-legacy -A OUTPUT -d $excepciones -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-legacy -A OUTPUT -p udp -m multiport –sports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-legacy -A OUTPUT -p tcp -m multiport –sports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-legacy -A OUTPUT -p udp -m multiport –dports $clienteudp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-legacy -A OUTPUT -p tcp -m multiport –dports $clientetcp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$hayping sudo /usr/sbin/iptables-legacy -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT > /dev/null
sudo /usr/sbin/iptables-legacy -A OUTPUT -j DROP
sudo /usr/sbin/iptables-legacy -A FORWARD -j DROP
echo iptables-legacy activado
echo
echo Configurando iptables-nft
sudo /usr/sbin/iptables-nft -t filter -F
sudo /usr/sbin/iptables-nft -t nat -F
sudo /usr/sbin/iptables-nft -t mangle -F
sudo /usr/sbin/ip6tables-nft -t filter -F
sudo /usr/sbin/ip6tables-nft -t nat -F
sudo /usr/sbin/ip6tables-nft -t mangle -F
sudo /usr/sbin/ip6tables-nft -A INPUT -j DROP
sudo /usr/sbin/ip6tables-nft -A OUTPUT -j DROP
sudo /usr/sbin/ip6tables-nft -A FORWARD -j DROP
sudo /usr/sbin/iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$haylogserver sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –dports $logserver -j LOG > /dev/null
$hayexcepciones sudo /usr/sbin/iptables-nft -A INPUT -s $excepciones -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-nft -A INPUT -p udp -m multiport –dports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –dports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-nft -A INPUT -p udp -m multiport –sports $clienteudp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –sports $clientetcp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$hayping sudo /usr/sbin/iptables-nft -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT > /dev/null
sudo /usr/sbin/iptables-nft -A INPUT -j DROP > /dev/null
sudo /usr/sbin/iptables-nft -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$hayexcepciones sudo /usr/sbin/iptables-nft -A OUTPUT -d $excepciones -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-nft -A OUTPUT -p udp -m multiport –sports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarservidor sudo /usr/sbin/iptables-nft -A OUTPUT -p tcp -m multiport –sports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-nft -A OUTPUT -p udp -m multiport –dports $clienteudp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$activarcliente sudo /usr/sbin/iptables-nft -A OUTPUT -p tcp -m multiport –dports $clientetcp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
$hayping sudo /usr/sbin/iptables-nft -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT > /dev/null
sudo /usr/sbin/iptables-nft -A OUTPUT -j DROP
sudo /usr/sbin/iptables-nft -A FORWARD -j DROP
echo iptables-nft activado
echo
$mojado sudo /usr/sbin/iptables-legacy -F > /dev/null
$mojado sudo /usr/sbin/iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-legacy -A INPUT -m state –state established -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-legacy -A INPUT -j DROP > /dev/null
$mojado sudo /usr/sbin/iptables-legacy -A OUTPUT -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-legacy -A FORWARD -j DROP > /dev/null
$mojado sudo /usr/sbin/iptables-nft -F > /dev/null
$mojado sudo /usr/sbin/iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-nft -A INPUT -m state –state established -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-nft -A INPUT -j DROP > /dev/null
$mojado sudo /usr/sbin/iptables-nft -A OUTPUT -j ACCEPT > /dev/null
$mojado sudo /usr/sbin/iptables-nft -A FORWARD -j DROP > /dev/null
##########################
echo has lanzado $0 $1 $2
# sale del script
exit 0
c’omo haría para poner una regla si este firewall lo usara para mi gateway y tuviera un squid dentro de la LAN???