[FUGSPBR] VPN IPSEC com adsl em uma das pontas (com ip dinamico)

Pedro Fernando pedrof em marlin.com.br
Qua Jan 28 20:16:31 BRST 2004


Bom, depois de pesquisar na net, achei uma solucao para isso em python ( so nao lembro onde) mas como eu nao sei nada de python, resolvi pegar a ideia e passar pra perl ( que eu entendo  pouco mais da pra quebrar o galho)

Bom, eu nao sou programador e nao gosto de programar. sei que a solucao eh meio feia, mas funciona  entao resolvi postar aqui, quem sabe alguem melhora o  codigo ...

A solucao eh composta de um modulo server e outro client, eh feito via udp e nao tem muita seguranca, mas como eh so pra passar um ip.

esse script ainda tem que ser alterado pra refletir seus enderecos, mas ja da pra ter uma ideia boa ....


client
-------------------- cut here -------------------------------------
#!/usr/local/perl

use IO::Socket::INET;

$port = "4884";
$server = 'xxx.xxx.xxx.xxx';

$MySocket=new IO::Socket::INET->new(PeerPort=>$port,Proto=>'udp',PeerAddr=>$server) || die "Server not available" ;
$novoip=`/sbin/ifconfig tun0 | grep "inet " | cut -d " " -f 2`;
$password = "freebsd";

$MySocket->send($password);
$MySocket->recv($resposta, 128);
if ($resposta eq "ok")
{
$MySocket->send($novoip);
exit 1;
}
else
{
exit 1;
}

--------------------cut here ------------------------

server

--------------------cut here ---------------------

#!/usr/local/bin/perl
use IO::Socket::INET;

# Create a new socket
$port = "4884";
$dmy = `date \"+%d-%m-%Y as %H:%M\"`;
$MySocket=new IO::Socket::INET->new(LocalPort=>$port,Proto=>'udp');

while(1)
{
        $MySocket->recv($challenge,128);

        $password = "freebsd";

        if ($challenge eq $password)
        {
                $MySocket->send("ok");
                $MySocket->recv($ipaddr,128);
                print $ipaddr;
                chomp $ipaddr;
                geraipsec();
                geravpn();
                geralog();
                restartvpn();
        }
        else
        {
                $MySocket->send("Erro");
        }
}

sub geraipsec
{
open (ARQ, "> /etc/ipsec.conf") || die "Nao consegui abrir o arquivo";
print ARQ "/usr/sbin/setkey -c spddelete 192.168.0.0/24 192.168.1.0/24 any -P out;\n";
print ARQ "/usr/sbin/setkey -c spddelete 192.168.1.0/24 192.168.0.0/24 any -P in;\n";
print ARQ "spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/ip_interno_do_server-$ipaddr/require;\n";
print ARQ "spdadd 192.168.1.0/24 192.168.0.0/24 any -P in  ipsec esp/tunnel/$ipaddr-ip_interno_do_server/require;\n";
close ARQ;

}

sub geravpn
{
open (ARQ, "> /usr/local/etc/rc.d/vpn.sh") || die "Nao consegui abrir o arquivo";
print ARQ "/sbin/ifconfig gif0 destroy\n";
print ARQ "/sbin/ifconfig gif0 create\n";
print ARQ "/sbin/ifconfig gif0 tunnel ip_externo_do_server $ipaddr\n";
print ARQ "/sbin/ifconfig gif0 inet ip_interno_do_server ip_interno_do_adsl netmask 255.255.255.255\n";
print ARQ "/usr/sbin/setkey -f /etc/ipsec.conf\n";
close ARQ;

}

sub geralog
{
open (ARQ, ">>/var/log/vpn.log") || die "nao consegui abrir o arquivo";
print ARQ " VPN  - reiniciada com o IP $ipaddr em $dmy";
print ARQ "--------------------------------------------------------------------------\n";
close ARQ;
}

sub restartvpn
{
system `/usr/local/etc/rc.d/vpn.sh`;
}

_______________________________________________________________
Sair da Lista: http://lists.fugspbr.org/listinfo.cgi
Historico: http://www4.fugspbr.org/lista/html/FUG-BR/



Mais detalhes sobre a lista de discussão freebsd