J’utilise un petit serveur VPN PPTP pour que mes amis et moi puissions facilement échanger des fichiers ou jouer ensemble en réseau 🙂 C’est très facile à mettre en place aussi bien coté serveur en installant le paquet pptpd, que coté client car c’est nativement supporté par Windows.
Ce module me permet d’afficher la liste des personnes qui sont connectées à mon serveur VPN PPTP.
Je ne détail pas dans cet article comment installer et configurer PPTPD. Voici un tutoriel qui vous aidera à mettre en place ce type de VPN : https://help.ubuntu.com/community/PPTPServer
Le serveur pptpd étant installé sur ma gateway, il faut procéder de la même manière que pour le module graphique de la bande passante pour transférer les données sur le Pi en utilisant netcat. La seule chose de nouveau ici est la commande last qui permet de récuppérer les informations de connexion des clients du VPN.
Transférer les données vers le Pi
Côté Pi (serveur netcat) :
#!/bin/bash ### BEGIN INIT INFO # Provides: nc_vpn_srv # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: vpn for Jarvis # Description: Enable service provided by daemon. ### END INIT INFO dst_port=12346 dst_dir=/home/jarvis/vpn dst_file=vpn_oberon.log nc_vpn() { while [ "true" ] do nc -q 1 -u -l 12346 > $dst_dir/$dst_file < /dev/null sleep 5 done } case "$1" in stop) echo " Stoping vpn for Jarvis..." killall vpn killall nc ;; start) echo " Starting vpn for Jarvis..." nc_vpn& exit 0 ;; *) exit 1 ;; esac exit 0
Côté gateway (client netcat) :
#! /bin/bash ### BEGIN INIT INFO # Provides: nc_vpn_clt # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: vpn for Jarvis # Description: Enable service provided by daemon. ### END INIT INFO src_port=8889 dst_port=12346 dst_host=10.0.0.1 nc_vpn() { while [ "true" ] do last | grep ppp | grep "logged in" | nc -q 1 -p $src_port -u $dst_host $dst_port sleep 5 done } case "$1" in stop) echo " Stoping vpn for Jarvis..." killall vpn killall nc ;; start) echo " Starting vpn for Jarvis..." nc_vpn& exit 0 ;; *) exit 1 ;; esac exit 0
Excécutez ces scripts au démarrage du système en les placants dans le répertoire /etc/init.d puis exécutant la commande suivante :
update-rc.d nom_du_script.sh defaults
index.php
Une simple <div> suffit car nous voulons simplement afficher une liste d’utilisateurs :
<div id="vpn"></div>
style.css
Un petit peu de mise en forme pour faire joli 🙂
/* vpn */ div#vpn { left : 550px; bottom : 10px; position : absolute; overflow : hidden; background-color : rgba(0, 0, 0, 1); color : #FFF; } td.vpn { text-align : left; font-size : 30px; padding : 5px; } img.vpn { width : 20px; height : 20px; }
javascript.js
Une simple requête AJAX permet de récupérer les données à afficher.
/* VPN */ var vpn_timeout; function vpn () { $.ajax({ async : false, type: "GET", url: "./ajax.php", data: "block=vpn", success: function(html){ $("#vpn").html(html); } }); vpn_timeout = setTimeout("vpn()", 5000); }
ajax.php
Rien de particulier pour ce module :
///////////////////////////////////////////////// // VPN PPTPD ///////////////////////////////////////////////// if($block == 'vpn'){ echo vpn(); }
inc.php
Deux fonctions sont nécessaires pour ce module :
- vpn_parseData() : parse le fichier envoyé à travers netcat
- vpn() : créé un tableau HTML avec les noms des utilisateurs connectés
///////////////////////////////////////////////// // VPN PPTPD ///////////////////////////////////////////////// function vpn () { $datas = vpn_parseData ("/home/jarvis/vpn/vpn_oberon.log"); $html = ''; if(sizeof($datas) > 0){ $html .= '<table cellspacing="0px">'; foreach($datas as $data){ $html .= '<tr>'; $html .= '<td valign="middle"><img class="vpn" src="pict/vpn.png"></td><td class="vpn">'.$data[0].'</td>'; $html .= '</tr>'; } $html .= '</table>'; } return $html; } function vpn_parseData ($stat_file) { $datas = array(); if(filemtime($stat_file) < time()-10){return $datas;} $stats = fopen($stat_file, 'r'); while (($line = fgets($stats)) !== false) { $explode_line = str_word_count($line, 1, "0123456789."); $datas[] = $explode_line; } fclose($stats); return $datas; }
Et voilà pour ce dernier module qui s’avère très simple 🙂