Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: WHK en 9 Mayo 2015, 06:07 am



Título: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: WHK en 9 Mayo 2015, 06:07 am
Hola, actualmente en CentOS para denegar el acceso a una ip via iptables lo hago así:

Código:
# iptables -I INPUT -s 1.2.3.4 -j DROP && service iptables save

Pero, como hago para que esa ip quede bloqueada para todos los puertos excepto el 22? ya que si por algún error me autobaneo no quiero quedar sin acceso a mi propio servidor :-/ a pesar de que el baneo es temporal deberia esperar mucho antes de poder acceder.

Tampoco me sirve crear una regla que diga que si es mi ip entonces que no me banee ya que mi ip es dinámica a menos que entre via tunnel por otro servidor a modo de rescate pero no cuento con ese segundo servidor.

Por ahi vi una regla con el argumento --destination-port pero como le indico que son todos menos el 22?
Puedo crear una regla que prohiba todo el acceso y luego que permita el acceso a esa misma ip al puerto 22? (se me acaba de ocurrir xDDDD)


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: WHK en 9 Mayo 2015, 06:13 am
Listo, funcionó :D

Código:
# iptables -I INPUT -p tcp -s 1.2.3.4 -j DROP && \
iptables -I INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT && \
service iptables save


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: MinusFour en 9 Mayo 2015, 06:34 am
Mucho cuidado con el orden de las reglas, volver a insertar la regla con -I te puede dejar sin conexion. Lo mejor seria dejar la regla con el ACCEPT siempre al inicio y usar iptables -A para agregar la regla al final de la tabla. Tambien puedes dejar una regla para no cortar conexiones establecidas. De esta forma, mientres estes logueado por ssh no te tira.

Código
  1. sudo iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  2. # despues agregar reglas, iptables -A
  3. sudo iptables -A INPUT -s x.x.x -j DROP

Mucho cuidado tambien guardando las reglas de iptables. Si reinicias el sistema puedes resetear las reglas de iptables y puedes recuperar rapidamente la conexion. Tecnicamente no es tan riesgoso como cambiar la chain policy a DROP pero es igual de frustrante porque tendrias que obtener una nueva IP.


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: WHK en 9 Mayo 2015, 06:36 am
Gracias por el consejo, no sabía que estas reglas se eliminaban al reinicio del sistema, esto pasa a pesar de que guardo las reglas con service iptables save?


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: MinusFour en 9 Mayo 2015, 14:23 pm
Gracias por el consejo, no sabía que estas reglas se eliminaban al reinicio del sistema, esto pasa a pesar de que guardo las reglas con service iptables save?

No, si guardas las reglas de iptables, estas persisten a través de reinicios del sistema. Mi punto es que si te quedaste fuera del sistema por una regla de iptables puedes reiniciar el equipo remotamente y volver a conectarte sin problemas. Si guardas las reglas vas a tener que cambiar de ip, acceder al equipo físicamente o si es una instancia controlada por un servicio web usar una shell de rescate, reinstalar el sistema nuevamente, o levantar un ticket.

En fin, hay formas de recuperar el sistema. Mi punto es que si no estas seguro que las reglas te van a limitar el acceso completamente, es mejor que no las guardes.


Título: Re:
Publicado por: yum-kax en 9 Mayo 2015, 16:08 pm
WHK, jaja tu forma de plantear la duda y responderte me hizo acordar a esto..

http://www.rubberduckdebugging.com/

No es solo para programación, sino mas bien es un debugging de ideas!
Te recomiendo tenerlo frente a tu pc en todo momento! :)


Título: Re:
Publicado por: engel lex en 9 Mayo 2015, 16:21 pm
WHK, jaja tu forma de plantear la duda y responderte me hizo acordar a esto..

http://www.rubberduckdebugging.com/

No es solo para programación, sino mas bien es un debugging de ideas!
Te recomiendo tenerlo frente a tu pc en todo momento! :)

excelente! XD


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: cpu2 en 9 Mayo 2015, 19:49 pm
No es mejor, establecer una politica DROP en INPUT y luego dejar paso a las direcciones y puertos convenientes?

Código
  1. iptables -F
  2. iptables -X
  3. iptables -P INPUT DROP
  4.  
  5. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  6.  
  7. iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 --syn -m state --state NEW -j ACCEPT

Un saludo.


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: MinusFour en 10 Mayo 2015, 02:31 am
No es mejor, establecer una politica DROP en INPUT y luego dejar paso a las direcciones y puertos convenientes?

Código
  1. iptables -F
  2. iptables -X
  3. iptables -P INPUT DROP
  4.  
  5. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  6.  
  7. iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 --syn -m state --state NEW -j ACCEPT

Un saludo.


El objetivo parece ser denegar a algunos, no permitir a algunos.


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: cpu2 en 10 Mayo 2015, 03:03 am
Lo se, simplemente dije esto porque seguro que tiene una politica en ACCEPT, desde mi punto de vista y desde el de mucha gente, es mucho mejor tener una politica en DROP, para lo que el quiere hacer.

No colocar un DROP a 1.2.3.4 y luego crear otra con un ACCEPT y el puerto.

Solo dije una recomendacion ya se que el problema no va de eso, la proxima no digo nada.

Un saludo.


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: WHK en 10 Mayo 2015, 03:51 am
Genial!, creo que tengo un pato de goma de mi hijo en el baño xD pero si comienzo a usarlo entonces me voy a ahorrar mas de la mitad de los post en el foro y la gente que pueda tener los mismos problemas no va a encontrar una respuesta :P

Me sale mas fácil hacer un barco de papel, lo pondré al lado de mi monitor.

Al final el baneo lo hice baneando la ip por completo y luego habilitandole el acceso al puerto 22 y finalmente guardando las reglas y al final una tarea programada para eliminar las reglas.

Código
  1. <?php
  2. 'sudo iptables -I INPUT -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' -j DROP && '.
  3. 'sudo iptables -I INPUT -p tcp -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' --dport 22 -j ACCEPT && '.
  4. 'sudo service iptables save && '.
  5. 'echo "sudo iptables -D INPUT -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' -j DROP ; sudo iptables -D INPUT -p tcp -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' --dport 22 -j ACCEPT ; sudo service iptables save;" | sudo at now + '.(int)$unban_minutes.' minutes'
  6. );


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: MinusFour en 10 Mayo 2015, 04:10 am
Lo se, simplemente dije esto porque seguro que tiene una politica en ACCEPT, desde mi punto de vista y desde el de mucha gente, es mucho mejor tener una politica en DROP, para lo que el quiere hacer.

No colocar un DROP a 1.2.3.4 y luego crear otra con un ACCEPT y el puerto.

Solo dije una recomendacion ya se que el problema no va de eso, la proxima no digo nada.

Un saludo.

No digo que una política DROP no sea mejor, es la manera en la que planteaste la solución. Si puedes usar una política DROP, pero tienes que agregar reglas ACCEPT para tus puertos.

Si usas una politica DROP:
Código
  1. iptables -P INPUT DROP
  2. iptables -A INPUT -i lo -j ACCEPT
  3. iptables -A INPUT -s 1.2.3.4 -j ACCEPT
  4. iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  5. iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT
  6. iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 80 -j ACCEPT

Pero las reglas para banear las vas a tener que insertar a partir del indice 3.

Código
  1. sudo iptables -I INPUT 3 -s x.x.x.x -j DROP

Si pones tus reglas al principio de la tabla puedes perder la conexion porque el DROP pasa antes que el ACCEPT. Si pones tus reglas al final de la tabla el ACCEPT del puerto 80 hace ACCEPT antes que llegue a los drops del puerto 80. Es decir la gente que baneaste puede seguir accediendo al sistema atraves de los puertos que habilitaste.

Si usas una poltica ACCEPT:

Código
  1. iptables -P ACCEPT
  2. iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3. iptables -A INPUT -s 1.2.3.4 -j ACCEPT

Para banear gente, simplemente agregas al final de la tabla tu regla:

Código
  1. sudo iptables -A INPUT -p tcp -s x.x.x.x -j DROP

En ambos casos:

1.2.3.4 viene siendo tu ip.
x.x.x.x viene siendo la ip que quieres banear.

La diferencia entre las dos politicas, es que usando una politica DROP es mas restrictiva.
Genial!, creo que tengo un pato de goma de mi hijo en el baño xD pero si comienzo a usarlo entonces me voy a ahorrar mas de la mitad de los post en el foro y la gente que pueda tener los mismos problemas no va a encontrar una respuesta :P

Me sale mas fácil hacer un barco de papel, lo pondré al lado de mi monitor.

Al final el baneo lo hice baneando la ip por completo y luego habilitandole el acceso al puerto 22 y finalmente guardando las reglas y al final una tarea programada para eliminar las reglas.

Código
  1. <?php
  2. 'sudo iptables -I INPUT -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' -j DROP && '.
  3. 'sudo iptables -I INPUT -p tcp -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' --dport 22 -j ACCEPT && '.
  4. 'sudo service iptables save && '.
  5. 'echo "sudo iptables -D INPUT -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' -j DROP ; sudo iptables -D INPUT -p tcp -s '.escapeshellarg($_SERVER['HTTP_WIM_REAL_IP']).' --dport 22 -j ACCEPT ; sudo service iptables save;" | sudo at now + '.(int)$unban_minutes.' minutes'
  6. );

Yo pense que querias agregar solo una regla para que no te banee a ti. En lugar de agregar la regla que permite acceso al SSH por cada IP, mejor simplemente agrega una regla para permitir acceso SSH al principio de la tabla:

Código
  1. iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Igual si los baneas, les estas permitiendo acceso SSH asi que es mejor dejar el acceso abierto a SSH en lugar de agregar una regla nueva por cada IP.


Título: Re: Denegar acceso a todos los puertos menos uno en iptables
Publicado por: WHK en 10 Mayo 2015, 04:22 am
Buena idea, no se me había ocurrido :P