Necesito ayuda con una cosa. Estoy en Debian y estoy aplicando unas reglas iptables para hacer más seguro el sistema pero al hacer iptables -L está todo sin reglas y en ACCEPT.
El script es este:
#!/bin/sh
IPTABLES=/sbin/iptables
if [ ! -x $IPTABLES ]; then
exit 0
fi
if [ "$IFACE" = eth0 ]; then
# 1) Definir la norma de cada cadena básica
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
# 2) Aceptar paquetes en estado establecido y relacionado
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 4) Optativo: Registrar paquetes que van a ser desechados
#$IPTABLES -A INPUT -j LOG --log-level debug --log-prefix "Drop INPUT: "
fi
Está cogido de la página de debian chile.
He dado los permisos necesarios, primero probé haciendo un ifdown y ifup, luego reiniciar la red, y luego reinicié el sistema y nada, me manda a comer *****. Alguien sabe por qué no funciona?
He probado a poner alguna regla a mano como iptables -P FORWARD DROP y tampoco se aplica, o algo estoy yo haciendo mal.
El script está en /etc/network/if-up.d/firewall
Salu2
Este es un fragmento de uno de mis antiguos scripts.
#!/bin/sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.1.1/24
INTIF=ath0
### Normas actuales y polittcas de las cadenas
echo "[+] Estableciendo politica a las cadenas y cargando modulos..."
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
### Cargar modulos de localizacionn de conexionn
modprobe ip_conntrack
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
##### Cadena INPUT [Entrada] #####
echo "[+] Estableciendo reglas cadena de entrada INPUT..."
### Estado de las reglas
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INV " --log-ip-options --log-tcp-options
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### Reglas anti-spoofing
iptables -A INPUT -i $INTIF -s $INT_NET -j LOG --log-prefix "SPOOFED PKT "
iptables -A INPUT -i $INTIF -s $INT_NET -j DROP
### Reglas aceptadas
iptables -A INPUT -i $INTIF -p tcp -s $INT_NET --dport 23 --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
### Registro de entrada por defecto de la regla
iptables -A INPUT -j NFLOG --nflog-prefix "DROP "
No deja de ser otro sricpt mas, simplemente dile que se ejecute en el strartup del sistema y ya esta, eso es lo que hacia yo en mi Gentoo. Pero si no quieres hacerlo de esa forma, si buscaras un poco encontrarias cosas como esta.
http://serverfault.com/questions/511099/debian-ignores-etc-network-if-pre-up-d-iptables
Un saludo.
Y una duda más, si creo una máquina virtual para probar que el FW funciona, como irá por adaptador puente eth0 el firewall filtrará también ese tráfico? Es decir, primero saldrá por la eth0 y volverá a entrar para hacer ping y otras cosas al sistema real, habrá algún problema?
Intentare responder tus pregunta, por que no veas.
No te hace falta crear una maquina virtual para probar un cortafuegos, pero si la quieres crear adelante.
Iptables filtrara las conexiones o protocolos a la interfaz que tu ordenaste, para algo esta la opcion -i, esa opcion significa que esa regla solo se aplica a eth0 en tu caso.
Luego hay reglas como esta.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Que esta es "global" vamos que se aplica a todas las interfaces, ya que no especificaste alguna.
Y despues de eso intentare responder esta pregunta.
Cita de: ccrunch en 25 Mayo 2014, 21:29 PMEs decir, primero saldrá por la eth0 y volverá a entrar para hacer ping y otras cosas al sistema real, habrá algún problema?
Si tu politica OUTPUT le permite a la interfaz realizar la conexion que le pediste no habra algun problema.
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Si tienes eso establecido y una politica en OUTPUT DROP, y quieres hacer una peticion ftp o http, no funcionara ya que no estas dejando la salida a los paquetes NEW. Tendrias que hacer algo asi.
iptables -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
Entonces se dejara salir la conexion, pero claro luego tiene que entrar de nuevo, y de eso se encarga la politica INPUT, si esta no permite las conexiones entrantes a esa direccion tendras prolemas, pero para eso pusiste esta regla.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Significa que todos los paquetes con las banderas ESTABLISHED,RELATED seran aceptados, si yo realizo una peticion ftp este saldra con el NEW si el servidor remoto la acepta este me enviara otra conexion con la bandera ESTABLISHED y entonces si que podras establecer la conexion.
Pero si alguien remotamente intenta hacer una peticion ftp, este no podra ya que tu politica INPUT no aceptas los paquetes con banderas NEW. Dado que tu politica OUTPUT esta en ACCEPT no tendrias que tener problemas.
Yo si fuera tu entenderia las reglas antes de aplicar nada, y mucho menos hacer un copiar y pegar de un foro o pagina de Debian.
Un saludo.
P.D: No se si eso responde tus preguntas, si no vuelve a formularlas mejor.
Ccrunch hola , también puedes hecharle un vistazo a :
https://foro.elhacker.net/buscador-t403983.0.html
https://foro.elhacker.net/buscador-t391339.0.html
https://foro.elhacker.net/buscador-t379532.0.html
https://foro.elhacker.net/buscador-t366614.0.html
Besitos mi robotito favorito seas flexo o bender o.. :-*
Te recomiendo que ignores esos links que te paso ese usuario, sobre todo el ultimo, si no quieres quedarte mas confuso y perdido, es un sript a base de reglas encontradas por internet me apuesto algo, y es caotico como el solo.
Un saludo.
Ahora he comprobado por casualidad si se estaban aplicando y sí se han aplicado, al reiniciar y sin hacer nada. No se por qué pero ahora ya va.
Y como recomendación, qué filtros me recomendáis dejar para una estación de trabajo?
Yo he mirado esto: http://man-es.debianchile.org/cortafuego.html para estación de trabajo y no entiendo la 2ª y 3ª opción.
Lo que quiero es filtrar por todas las interfaces (solo tengo eth0 y wlan0) todo el tráfico que pasa, eliminar absolutamente todos los paquetes que yo no haya solicitado, es decir, quiero que funcione el tráfico web con un servidor con el cual yo he pedido un establecimiento de conexión, pero que nadie pueda hacerme ping, etc.
Me suena que eso lo hace IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT pero no estoy seguro.
Ahora mismo iptables luce así:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Salu2
Cita de: ccrunch en 26 Mayo 2014, 16:47 PMY como recomendación, qué filtros me recomendáis dejar para una estación de trabajo?
Yo he mirado esto: http://man-es.debianchile.org/cortafuego.html para estación de trabajo y no entiendo la 2ª y 3ª opción.
Te recomiendo un cortafuegos con politica DROP, y a partir de hay ir abriendo los protocolos que quieras, piensa que un cortafuegos en DROP es menos propenso a los "fallos" o problemas de seguridad que uno en ACCEPT.
Venga va, que la segunda regla ya te la explique antes, y la tercera queda bastante claro, todas las conexiones entrantes "conexiones nuevas" son aceptadas en todas las interfaces menos en eth0. Ignora todas esas reglas, cada maquina y red es un mundo diferente a lo mejor esas reglas no se adaptan a ti, no te hace falta nada de eso.
Cita de: ccrunch en 26 Mayo 2014, 16:47 PMLo que quiero es filtrar por todas las interfaces (solo tengo eth0 y wlan0) todo el tráfico que pasa, eliminar absolutamente todos los paquetes que yo no haya solicitado, es decir, quiero que funcione el tráfico web con un servidor con el cual yo he pedido un establecimiento de conexión, pero que nadie pueda hacerme ping, etc.
Pues como te dije antes, politica DROP y deja operativo lo que te interese, si dejas la politica en DROP esta automaticamente bloqueara los icmp, a o ser que le dijas que los acepte.
Simplemente tienes que preocuparte de abrir, es lo mejor. Si lees el fragmento de srcipt que te deje en el primer comentario lo veras.
Un saludo.
P.D: Te recomiendo que dejes los tutos, si no quieres acabar con un FW como el user de arriba.
Los tutos son para guiarme, algún día tendré que entender el funcionamiento del IPTABLES aunque me lo explicaron por encima.
El script ahora está así:
#Definir la norma de cada cadena básica
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#Aceptar paquetes en estado establecido y relacionado
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Y la salida de iptables -L es:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Qué te parece esta configuración?
Salu2
Pues mal, que quieres que te diga, ninguna regla para logear paquetes descartados, OUTPUT en ACCEPT y FORWARD sin ninguna regla.
Porque no intentas establecer la conexion con el Server? Con la politica OUTPUT en DROP.
Un saludo.
En principio no me interesaba guardar un log de paquetes descartados pero ya que lo dices te haré caso.
Forward veo que está en DROP, así que da igual que no tenga reglas porque no voy a enrutar paquetes, así que quiero descartarlos todos, o eso pienso yo.
Respecto a OUTPUT:
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Es eso a lo que te refieres?
Disculpa tantas preguntas pero con iptables lo he tomado ayer mismo, lo único que vi antes lo vi de pasadas. Si sigues viendo algo mal avísame, o si ves algún error.
Salu2
Pero si dejas asi OUTPUT no podras hacer nada, compruebalo si quieres.
Simplemente estas dejando paso a los paquetes establecidos y relacionados, y tu cuando haces una peticion al exterior OUTPUT salen con la bandera NEW.
Antes dijiste algo de http, pues seria algo asi.
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
Esta seria global para eth0 y wlan0, siempre puedes adaptarlas para cada interface destino direccion etc...
Pero no podras acceder a webs por su nombre, si no dejas paso a el puerto 53 que tendrias que saber que es el de las DNS.
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Antes de aplicar esas dos reglas intenta acceder a una web, y luego las aplicas y asi vas experimentando.
Un saludo.
P.D: No tranquilo pregunta lo que quieras, ami estos temas me gustan, sobre todo los de PF, pero si apenas hay gente que use iptables por aqui imaginate PF.
Hola, y no existe alguna opción de que no tenga que ponerlo a mano todos los puertos que quiera usar, y que se permitan los de STATE NEW o similar?
Y por último, yo pongo esas órdenes en /etc/rc.local, cuál es el funcionamiento de que cuando se ejecuta eso, la manera de cargar las órdenes, quiero decir, yo primero lo pongo todo a drop y luego voy abriendo, iptables lee rc.local o lee algún fichero suyo propio?
Salu2
Cita de: ccrunch en 27 Mayo 2014, 14:02 PM
Hola, y no existe alguna opción de que no tenga que ponerlo a mano todos los puertos que quiera usar, y que se permitan los de STATE NEW o similar?
Podrias crear una macro como hice con el interface, si tienes un grupo de instrucciones similares, puedes agrupar los puertos en un variable.
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 23 --syn -m state --state NEW -j ACCEPT
--------------------------------
PORTS = "80,23"
iptables -A OUTPUT -p tcp --dport $PORTS --syn -m state --state NEW -j ACCEPT
Esa orden vale como esas dos. Eso macro me la acepta, en OpenBSD, y me la traduce en dos, espero que ati tambien. Lo mejor de hacer macros solo tienes que modificar la variable, imaginate que tienes un FW de muchas reglas.
Pero si dejas pasar a todos los STATE NEW es como si no hicieras nada, pero que dices.
Cita de: ccrunch en 27 Mayo 2014, 14:02 PMY por último, yo pongo esas órdenes en /etc/rc.local, cuál es el funcionamiento de que cuando se ejecuta eso, la manera de cargar las órdenes, quiero decir, yo primero lo pongo todo a drop y luego voy abriendo, iptables lee rc.local o lee algún fichero suyo propio?
El funcionamiento no deja de ser como otro sricpt, puedes usar el orden que quieras mientras que lo pongas en DROP. Simplemente esta primero por orden, nada mas.
Se que iptables tenia un directorio dedicado a el, pero yo lo que hacia es como mencione antes ejecutarlo desde el inicio, en OpenBSD se inicia desde /etc/rc.
Un saludo.
Hola, me da este error al ejecutar el script:
iptables v1.4.14: invalid port/service `80,53' specified
Try `iptables -h' or 'iptables --help' for more information.
Por otra parte, creí que era algún parámetro estaba mal puesto así que busqué y cambié de sitio el --syn a esto:
iptables -A OUTPUT -p tcp --syn --dport 80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --syn --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
Al aplicar el script no me da ningún error aunque tampoco me permite ningún tráfico saliente.
Y por último, en la regla INPUT:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Por qué tengo que dejar RELATED, y no solamente ESTABLISHED?
Salu2
Cita de: ccrunch en 27 Mayo 2014, 20:31 PMiptables v1.4.14: invalid port/service `80,53' specified
Try `iptables -h' or 'iptables --help' for more information.
Como pensaba esas macros no son aceptadas por iptables, busca la equivalencia.
Cita de: ccrunch en 27 Mayo 2014, 20:31 PMPor otra parte, creí que era algún parámetro estaba mal puesto así que busqué y cambié de sitio el --syn a esto:
iptables -A OUTPUT -p tcp --syn --dport 80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --syn --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
Al aplicar el script no me da ningún error aunque tampoco me permite ningún tráfico saliente.
Vamos a ver, si fuera un error de sintaxis el iptables te lo diria como el ejemplo de la macro de arriba.
Por cierto, creo que no viste bien las reglas, tienes que dejar el trafico del puerto 53 (DNS) salir con el protocolo UDP, este servicio usa los dos protocolos, este servicio depende del caso usa TCP claro que no te lo voy a explicar todo.
Yo con esta configuracion puedo navegar.
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
##### Cadena INPUT [Entrada] #####
echo "[+] Estableciendo reglas cadena de entrada INPUT..."
### Estado de las reglas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##### Cadena OUTPUT [Salida] #####
echo "[+] Estableciendo reglas cadena de entrada OUTPUT..."
### Estado de las reglas
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Cita de: ccrunch en 27 Mayo 2014, 20:31 PMY por último, en la regla INPUT:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Por qué tengo que dejar RELATED, y no solamente ESTABLISHED?
Con esta configuracion no te haria falta esa bandera, la necesitarias para transferir datos con FTP, errores de ICMP, conexiones nuevas pero ligadas a las existentes.
Un saludo.
Buenas, ahora todo va bien, este es el resultado:
# Definir la norma de cada cadena básica
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Input
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Output
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 2096 --syn -m state --state NEW -j ACCEPT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:httpflags: FIN,SYN,RST,ACK/SYN state NEW
ACCEPT udp -- anywhere anywhere udp dpt:domain state NEW
ACCEPT tcp -- anywhere anywhere tcp dpt:httpsflags: FIN,SYN,RST,ACK/SYN state NEW
ACCEPT tcp -- anywhere anywhere tcp dpt:2096flags: FIN,SYN,RST,ACK/SYN state NEW
Lo que me extraña ahora es que al arranque no le he permitido el tráfico DHCP (que yo sepa funciona por el puerto 67 con TCP&UDP) y sin embargo al arranque sí que coge IP.
Por lo demás todo bien.
Cómo lo ves ahora?
Salu2
Disculpa si te parezco algo estupido, pero porque no investigas tu.
Y bueno sobre que me parece el firewall, pues si no se requiere ninguna cosa especial el firewall se torna basico, simplemente usalo como algo de estudio.
Cualquier cosa ya sabes, pero no voy hacerte yo el trabajo.
Un saludo.
CitarDisculpa si te parezco algo estupido, pero porque no investigas tu.
No tranquilo, sé lo que quieres decir. Lo que pasa es que si alguien no me lo explica por mucho que busque la mayoría de cosas no las entenderé.
Citar
Y bueno sobre que me parece el firewall, pues si no se requiere ninguna cosa especial el firewall se torna basico, simplemente usalo como algo de estudio.
Cualquier cosa ya sabes, pero no voy hacerte yo el trabajo.
Un saludo.
El firewall es para que nadie pueda acceder a mi pc ni me pueda hacer ping o que sepa que estoy en la red, y aunque por una remota posibilidad lograrar infectar debian, no pudieran enviar datos a sus servidores destino, a no ser que sea por http.
Salu2
Siempre tienes mas opciones, pero para un FW para un equipo de estacion de trabajo cosas como la regla de http estan bien, puedes dejar paso a paginas o mejor dicho direcciones como por ejemplo esta pagina, pero seria muy restrictivo, ya que no podrias navegar libremente.
Por ejemplo en mi sricpt de PF, solamente dejo salida a las direcciones que me interesa, pero claro no es una simple estacion de trabajo.
Siempre puedes mirar un poco el manual, ya te estoy dando pistas.
Un saludo.