Lun Sep 10, 2007 3:27 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
| Socket e iptables |
|
|
Buenas gente, necesito resolver un problema que requiere más conocimientos sobre Perl de los que tengo, espero que me puedan dar una mano ya que lo necesito para mi trabajo, desde ya muchas gracias.
El problema es el siguiente:
Necesito hacer un socket que reciba información la cual es para que yo agregue a mi firewall (iptables) reglas que permitan conexiones entre dos nodos; los nodos son los que se especifican en la información que recibo.
Mi idea era crear un socket con IO::Socket y usar el modulo IPv4::IPTables para agregar las reglas, ¿voy por buen camino, qué opinan? ¿alguna mejor idea?
Muchas gracias |
|
|
|

Lun Sep 10, 2007 5:59 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
| Re: Socket e iptables |
|
|
| rklz escribió: | Buenas gente, necesito resolver un problema que requiere más conocimientos sobre Perl de los que tengo, espero que me puedan dar una mano ya que lo necesito para mi trabajo, desde ya muchas gracias.
El problema es el siguiente:
Necesito hacer un socket que reciba información la cual es para que yo agregue a mi firewall (iptables) reglas que permitan conexiones entre dos nodos; los nodos son los que se especifican en la información que recibo.
Mi idea era crear un socket con IO::Socket y usar el modulo IPv4::IPTables para agregar las reglas, ¿voy por buen camino, qué opinan? ¿alguna mejor idea?
Muchas gracias |
Hmmmm.... creo que es IPTables::IPv4 (del 2003 con 48 FAILS) y si es ese módulo pues no... no es buena idea.
Como mis conocimientos de leyers bajos (en OSI) son relativamente malos (muuuuy malos) no entiendo que quieres hacer (¿Nodos, qué?) no recomiendo una alternativa.  |
|

Lun Sep 10, 2007 6:24 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
|
|
|
Especifico un poco mas :
Mi jefe mediante un programita hecho en .Net me va a pasar unas rutas ej :
los paquetes que llegan a la IP 1.1.1.1 puerto 2030 deben ir a la IP 2.2.2.2:2030, entonces yo tendría que tener un socket corriendo para escuchar esa ruta y que automáticamente se agregue a mi script y empiece a rutar, ¿se entiende?
El servidor donde está alojado iptables y este futuro script está en el medio de esas 2 IP.
PD : El módulo se llama como vos decís y no sabia lo de los fails  |
|
Mar Sep 11, 2007 1:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
Mar Sep 11, 2007 1:49 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
|
|
|
Muchas gracias, el módulo parece servirme para lo que necesito, igualmente como contaba con un día para hacer el trabajo, lo hice la forma más rápida y sucia que encontré, está funcionando pero no me parece la mejor manera de dejarlo.
¿Puedo postear el código para que me den sus opiniones? |
|
Mar Sep 11, 2007 2:00 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
| Podría ser interesante, sí. |
|

Mar Sep 11, 2007 2:16 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
|
|
|
| Perl: | #!/usr/bin/perl -w
use strict;
use IO:: Socket;
my ($data, $resta, $host, $stat, $new_sock, $ip, $count);
$host = 'x.x.x.x';
my $sock = new IO:: Socket:: INET( LocalHost => $host,
LocalPort => '1234',
Proto => 'tcp',
Reuse => 1,
Listen => 1 )
or die "socket error : $! \n";
if ($sock) { iptables () }
$count = 0;
$resta = 4;
while ( ($new_sock, $stat) = $sock-> accept() ) {
print $new_sock "\n";
print $new_sock "Waiting for commands ...\n";
while ( $data = < $new_sock> ) {
foreach ( $data ) {
if( $_ =~ m/^ipt/i ) {
system($_);
}
elsif ( $_ =~ m/^quit/i ) {
close $new_sock;
}
else {
$count = $count + 1;
$resta = $resta - 1;
foreach ( $_ !~ m/^ipt/i ) {
print $new_sock "syntax error, $resta tries left\n";
if ( $count == 4 ) {
close $new_sock;
}
}
}
}
}
}
sub iptables {
system('iptables -F');
system('iptables -t nat -F');
system('iptables -t mangle -F');
system('/bin/echo 1 > /proc/sys/net/ipv4/ip_forward');
system('iptables -t nat -P PREROUTING ACCEPT');
system('iptables -t nat -P POSTROUTING ACCEPT');
system('iptables -t nat -P OUTPUT ACCEPT');
system('iptables -P INPUT ACCEPT');
system('iptables -P FORWARD ACCEPT');
system('iptables -P OUTPUT ACCEPT');
} |
PD: Aclaro que al socket solamente van a llegar comandos específicos de iptables. |
|

Jue Sep 13, 2007 3:10 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
|
|
|
| ¿Alguna opinión/critica sobre el código? xD |
|
Jue Sep 13, 2007 3:59 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
Al usuario le das cuatro oportunidades para meter un comando correcto o le despides, pero no es acumulativo. Es decir, si se equivoca 3 veces, y mete un comando correcto, le deja seguir, pero si se equivoca en el siguiente comando, sale.
Las variables $count y $resta hacen lo mismo... se podría usar solamente una de ellas.
Llamar a iptables con system es lo más normal, aunque quizás hubiera quedado más bonito usar un módulo como IPTables::IPv4 (aunque no sabemos si sería igual de funcional, ya que depende de una librería).
Aunque sepamos que sólo van a llegar comandos de iptables, no estaría demás poner un pequeño control de seguridad... si alguien manda "iptables -L; rm -rf /", podría ser catastrófico. |
|

Jue Sep 13, 2007 6:57 pm
|
 |
rklz
Perlero Nuevo

|
Registrado: 25 May 2007
Mensajes: 38
Ubicación: Rosario, Argentina
|
|
|
|
|
Gracias por fijarte explorer, estás en lo cierto, voy a modificar las cosas que dices...
Lo único que tengo para agregar es que yo pensaba usar IPTables::IPv4 pero como se vé más arriba del post creating me dijo que es del 2003 y tiene 48 fails  |
|
Powered by phpBB © 2001, 2005 phpBB Group
|