Página 1 de 1

Administración de puertos

NotaPublicado: 2012-05-16 17:35 @774
por jose santiago
¿Qué tal?

Quería saber si hay alguna forma de realizar un script para administrar los puertos de mi PC. He instalado iptables pero lo quiero hacer desde un CGI Perl.

Re: Administración de puertos

NotaPublicado: 2012-05-16 17:42 @779
por explorer
Hay un "pequeño" problema...

Para lograr eso, el programa debe estar a nombre del root. O que el root le dé permisos setuid para que el usuario que ejecuta el servidor web -y por ende, el cgi- adopte la personalizar del root y pueda ejecutar las iptables.

Una vez superado ese escollo, podrás usar las iptables desde dentro del cgi usando qx() o system() (yo tengo algunos hechos así), o con alguno de los módulos Perl que manejan iptables, como IPTables::ChainMgr.

Re: Administración de puertos

NotaPublicado: 2012-05-16 19:06 @837
por jose santiago
Vi los post anteriores y veo que IPTables::IPV4 es un buen módulo, pero me marca el siguiente error al instalarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CPAN [4]> install IPTables::IPv4
Ejecución de instalación para el módulo de "IPTables :: IPv4"
Ejecución  hacer para D/DP/DPATES/IPTables-IPv4-0.98.tar.gz
   Ya se ha desenvuelto en el directorio / home/santi/.local/share/.cpan/build/IPTables-IPv4-0.98-T5DMak
No se pudo establecer: Error desconocido
Ejecución de hacer la prueba
   No se puede probar sin marca exitosa
Ejecutar make install
   Haga había regresado mal estado, instalación parece imposible
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Re: Administración de puertos

NotaPublicado: 2012-05-16 19:27 @852
por explorer
No sé si sigue siendo un buen módulo, ya que la última versión es del 18 de agosto del 2003.

Y tiene 10 mensajes de error y una anotación.

Prueba a instalarlo según indica el README (los cuatro famosos pasos). Así saldrán mejor los errores.

Podría ser que la biblioteca libiptc incluida en la distribución fuese demasiado vieja para los sistemas actuales. O que tu sistema no tuviera un compilador de C. O que la está intentando instalar como un usuario y no como root.

Re: Administración de puertos

NotaPublicado: 2012-05-16 19:41 @862
por jose santiago
Bueno, como simplemente quiero transportar mis líneas iptables a un script Perl, me convendría más usar un cgi usando qx() o system(), como usted me lo sugiere. ¿Los privilegios al script los puedo dar con:
ls -lh archivo.cgi?

La verdad, desconozco la forma de usar iptables con qx() o system(). Quiero pensar que es algo como programación híbrida. No encontré tutoriales sobre ello.

Re: Administración de puertos

NotaPublicado: 2012-05-17 06:51 @327
por explorer
jose santiago escribiste:¿Los privilegios al script los puedo dar con: ls -lh archivo.cgi?
Los permisos de un archivo se cambian con el comando chmod. Y la propiedad de usuario y grupo, con chown.

jose santiago escribiste:La verdad, desconozco la forma de usar iptables con qx() o system(). Quiero pensar que es algo como programación híbrida. No encontré tutoriales sobre ello.
No es muy complicado...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $estado = system('/sbin/iptables', '-A INPUT -s 183.7.121.141 -j DROP');
  2.  
  3. # líneas opciones para ver el resultado de la ejecución:
  4. if ($? == -1) {
  5.     print "Falló la ejecución: $!\n";
  6. }
  7. elsif ($? & 127) {
  8.     printf "la ejecución murió con señal %d, %s coredump\n",
  9.            ($? & 127),  ($? & 128) ? 'con' : 'sin';
  10. }
  11. else {
  12.     printf "la ejecución terminó con el valor %d\n", $? >> 8;
  13. }
  14.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Las siguientes líneas son un extracto de un sistema mío, donde filtro a los pesados que quieren abusar del sistema de correo (spam).
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ### Activar las reglas de iptables, sólo si no están ya puestas
  2. my @iptables = grep { /^(?:DROP|ACCEPT).*? recent: / } qx(iptables -L -n);
  3.  
  4. # DROP Correo
  5. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 36000 --name SPAM    -j DROP") unless @iptables ~~ /SPAM/;
  6. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 36000 --name RELAY   -j DROP") unless @iptables ~~ /RELAY/;
  7. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 36000 --name NOUSER  -j DROP") unless @iptables ~~ /NOUSER/;
  8. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 360   --name NOAUTH  -j DROP") unless @iptables ~~ /NOAUTH/;
  9. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 36000 --name BADCHR  -j DROP") unless @iptables ~~ /BADCHR/;
  10. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,465   -m recent --update --seconds 36000 --name MANYCN  -j DROP") unless @iptables ~~ /MANYCN/;
  11. # ACCEPT Correo
  12. system("iptables -I INPUT -i eth0 -p tcp   -m multiport --dport 25,110,143,465,993,995   -m recent --update --name LEGAL   -j ACCEPT") unless @iptables ~~ /LEGAL/;
  13. # DROP incondicional
  14. system("iptables -I INPUT -i eth0 -p tcp                                 -m recent --update --seconds 36000 --name BLOCK   -j DROP") unless @iptables ~~ /BLOCK/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en tu propio ordenador en perldoc perlop, y en la Web (traducido), busca por 'qx'.

Más información en tu ordenador, en perldoc -f system.

Re: Administración de puertos

NotaPublicado: 2012-05-17 21:21 @931
por jose santiago
He descargado el módulo IPTables::ChainMgr. Encontré líneas para analizar el tráfico de puerto. No sé si mi script está correcto pero el único error que marca es la ubicación del módulo, y ya lo he instalado con cpan.

#!/usr/lib/perl

use IPTables::ChainMgr;

my $ipt_bin = '/sbin/iptables';

my %opts = (
'iptables' => $ipt_bin,
'iptout' => '/tmp/iptables.out',
'ipterr' => '/tmp/iptables.err',
'debug' => 0,
'verbose' => 0,


'ipt_alarm' => 5, # tiempo máximo de ejecución
'ipt_exec_style' => 'waitpid'.
'ipt_exec_sleep' => 1.

# la línea que encontré para ver el tráfico del puerto es:

($rv, $rule_num) = $ipt_obj->find_ip_rule('fe80::200:f8ff:fe21:67cf', '0:0:aa::/64',
'filter', 'INPUT', 'ACCEPT', {'normalize' => 1, 'protocol' => 'tcp',
's_port' => 0, 'd_port' => 80});

# para cerrar el tráfico es

($rv, $rule_num) = $ipt_obj->find_ip_rule('10.1.2.0/24', '192.168.1.2',
'filter', 'INPUT', 'REJECT', {'normalize' => 1});

);

¿Alguna ayuda de favor para echar a andar mi script?

Re: Administración de puertos

NotaPublicado: 2012-05-17 21:35 @941
por explorer
Sin ver el error es difícil decir qué pasa.

Para saber si un módulo está bien instalado, basta con ejecutar

perl -MIPTables::ChainMgr -e 1

Si no sale nada, es que Perl sí encuentra el módulo.

Para saber si un programa está bien escrito, basta con ejecutar

perl -c programa.pl

Perl comprobará la sintaxis, y si ve algo raro, lo dirá.

Re: Administración de puertos

NotaPublicado: 2016-09-18 18:30 @812
por memrobles
explorer escribiste:Hay un "pequeño" problema...

Para lograr eso, el programa debe estar a nombre del root. O que el root le dé permisos setuid para que el usuario que ejecuta el servidor web -y por ende, el cgi- adopte la personalizar del root y pueda ejecutar las iptables.

Una vez superado ese escollo, podrás usar las iptables desde dentro del cgi usando qx() o system() (yo tengo algunos hechos así), o con alguno de los módulos Perl que manejan iptables, como IPTables::ChainMgr.



explorer: ¿y cómo haces para dar permisos al comando system() cuando se ejecute desde el CGI?

Este es mi script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $value = qx(iptables -L -n| grep 113.128.128.11 | wc -l);
  3. #print $va<lue;
  4. if ($value != 0)
  5. {
  6. $status="bloqueada";
  7. }
  8. else
  9. {
  10. $status="no bloqueada";
  11. }
  12.  
  13.  
  14. # hello.pl -- my first perl script!
  15. print "Content-type: text/html\n\n";
  16. print "<H1> $value</H1>\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



[Sun Sep 18 18:08:54.627114 2016] [cgi:error] [pid 13049] [client m.i.i.p:49150] AH01215: iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
[Sun Sep 18 18:08:54.627145 2016] [cgi:error] [pid 13049] [client m.i.i.p:49150] AH01215: Perhaps iptables or your kernel needs to be upgraded.

Re: Administración de puertos

NotaPublicado: 2016-09-19 15:46 @699
por explorer
El problema es que para ejecutar iptables... necesitas ser root (es decir, el usuario web es root), o que el programa esté a nombre de root, o que el programa, estando a nombre de root, tiene el permiso setuid para que lo pueda ejecutar el usuario web.

Y aún así... el servidor web se puede negar a ejecutarlo.

Para que quede claro:

  • el programa CGI lo va a ejecutar el mismo usuario que está ejecutando el servidor web (que se llamará www, www-data, httpd, apache, apache2 o apache4). Entonces... ese programa debe tener permisos de ejecución para ese usuario. Y eso se consigue de varias formas distintas:
    • el programa está a nombre (propietario) del usuario web
    • el programa tiene permisos de ejecución para el grupo de usuarios al que también pertenece el usuario web
    • el programa tiene permisos de ejecución para todo el mundo
    • el programa tiene activado el indicador setuid para que, aun perteneciendo a un usuario, al ejecutarse, obtiene la personalidad de otro usuario.
    Desde luego, lo más cómodo es el punto 3: chmod 775 cgi.pl
  • pero... aquí tienes un problema: el iptables requiere que sea ejecutado por el usuario root (eso es lo que te está diciendo el mensaje de error). Entonces... solo queda dos opciones:
    • el programa tiene como propietario el usuario root (pero puede haber problemas. Ver más abajo)
    • lo mismo que antes: el propietario es el usuario root, pero tiene activado el bit setuid para permitir que el usuario web lo pueda ejecutar con permisos de root.
Te comentaba que podría haber un problema, y es que el servidor web puede tener activado el modo de seguridad, y darse cuenta de que el programa a ejecutar está a nombre del root, por lo que no lo ejecutará.

En ese caso, no te queda más solución que adoptar la solución de ejecutarlo por medio de SuEXEC. Aquí hay un buen resumen (a partir de la sección How To Enable SuExec).

PERO... si está puesto con usuario root, SuEXEC NO lo va a ejecutar nunca (ver punto 7 del enlace de SuEXEC).

La solución es: desactivar el modo de seguridad del servidor web. Puede ser tan sencillo como desinstalar el SuEXEC. Luego, cambias el propietario del programa a root:

chown root.root cgi.pl

y le das permisos 755

chmod 755 cgi.pl

para que lo puede ejecutar todo el mundo. Y listo.

Es obvio, advertir, que permitir que el servidor web ejecute un programa como root, es tremendamente peligroso.

Una cosilla... ¿Te has dado cuenta de que no estás imprimiendo el valor de la variable $status?