Comment faire fonctionner un outils propriétaire tel que snx (SSL Network Extender de Checkpoint) sur debian ?
Il est très pratique et a la mode de créer des VPN en s’appuyant sur la technologie HTTPS, le problème c’est sans windows vous ne pouvez pas utiliser le composant activeX.
Check point fournit un exécutable(snx) qui crée ce tunnel en utilisant le module tun.ko (Universal TUN/TAP device driver).
La commande snx pose trois problèmes :
Résultat en lançant la commande fraîchement installée on a :
$ /usr/bin/snx /usr/bin/snx: symbol lookup error: /usr/bin/snx: undefined symbol: cerr
D’autre part la création du VPN doit être la plus simple possible pour accéder a l’information le plus rapidement possible, surtout si l’on se déplace souvent. Il faut donc pouvoir faire des profiles de connexion au VPN.
La modification faite par snx de resolv.conf détruit l’utilisation de resolvconf.
Pour résoudre ce problème il faut avoir installer la bonne version de la librairie et simplement de la surcharger avant l’exécution de la commande avec LD_PRELOAD (Faire attention avec les setuid-bit).
$ /usr/bin/snx
/usr/bin/snx: symbol lookup error: /usr/bin/snx: undefined symbol: cerr
$ dpkg -S /usr/lib/libstdc++-libc6.2-2.so.3
libstdc++2.10-glibc2.2: /usr/lib/libstdc++-libc6.2-2.so.3
# LD_PRELOAD=/usr/lib/libstdc++-libc6.2-2.so.3 snx -h
Check Point's Linux SNX
build 600000013
usage: snx -s <server> {-u <user>|-c <certfile>} [-l <ca dir>] [-p <port>] [-r] [-g] [-e <cipher>]
run SNX using given arguments
snx -f <cf> run the snx using configuration file
snx run the snx using the ~/.snxrc
snx -d disconnect a running SNX daemon
-s <server> connect to server <server>
-u <user> use the username <user>
-c <certfile> use the certificate file <certfile>
-l <ca dir> get trusted ca's from <ca dir>
-p <port> connect using port <port>
-g enable debugging
-e <cipher> SSL cipher to use: RC4 or 3DES
Pour éviter de taper a chaque fois les identifiants de connexion on utilisera le module perl Expect, d’autre par on détournera l’utilisation du fichier de configuration de snx pour y insérer les mots de passe :
server vpn-server.enterprise.com username vpn_username #password vpn_password proxy_name proxy_server.other-enterprise.com proxy_port 8081 proxy_user proxy_username #proxy_pass proxy_password
Les lignes en commentaire ne seront pas lu par snx mais par le script en perl et utilisera ses données pour les injecter dans la partie interactive.
Ce script devra être utilisé en root (pour créer l’interface virtuelle).
Exemple type de fichier de profile/configuration (snxrc_work) :
server 192.168.1.254 username my_username #password my_password
# /path/to/snx_wraper.pl /path/to/snxrc_work Check Point's Linux SNX build 600000013 Please enter your password: Send password SNX - connected. Session parameters: =================== Office Mode IP : 183.3.23.234 DNS Server : 192.168.1.243 DNS Suffix : mydomain.com Timeout : 8 hours
# /path/to/snx_wraper.pl -d SNX - Disconnecting... done.
Il est possible de modifier /etc/network/interface pour créer le VPN tout de suite après que l’interface réseau ait été configuré.
/etc/network/interface:
iface eth0 inet dhcp
post-up /path/to/snx_wraper.pl /path/to/snxrc_work
pre-down /path/to/snx_wraper.pl -d
snx_wraper.pl:
#!/usr/bin/perl -w use Expect; #hash globale my $h = {}; #Actions Handlers sub handle_password { my $fh = shift; print "Send password\n"; $fh->send($h->{password}, "\n"); exp_continue; } sub handle_proxy_pass { my $fh = shift; print "Send proxy pass\n"; $fh->send($h->{proxy_pass}, "\n"); exp_continue; } my $handlers = [ [qr'Please enter your password:' => \&handle_password], [qr'Please enter the password for proxy - [0-9.]+' => \&handle_proxy_pass], [timeout => sub { print "Timeout !!!\n" }], ]; #Additionnal snx's config file parsing sub parse_cfgfile { open CFG, shift or die "$!"; while (<CFG>) { chomp; if (/^#password\s(.*)$/) { $h->{password} = $1; } if (/^#proxy_pass\s(.*)$/) { $h->{proxy_pass} = $1; } } close CFG; } #Config file is present ? Yes do somme override my $cfg_file = shift; if ( -r $cfg_file ) { unshift @ARGV, "-f $cfg_file"; parse_cfgfile($cfg_file); } else { unshift @ARGV, $cfg_file; $cfg_file = undef; } #Control program running my $snx_cmd = 'LD_PRELOAD=/usr/lib/libstdc++-libc6.2-2.so.3 snx'; $snx_cmd = join(' ', $snx_cmd, @ARGV); my $snx = Expect->spawn($snx_cmd) or die "Cannot spawn $snx_cmd: $!\n"; $snx->expect(10, @$handlers); #Post action on disconnect if ($ARGV[0] eq '-d') { #Really kill snx system('killall -9 snx'); #Handle resolvconf if ( -r '/etc/resolvconf/run/resolv.conf') { system('rm /etc/resolv.conf ; ln -s /etc/resolvconf/run/resolv.conf /etc'); } }