Installare un server VPN con OpenVPN su Ubuntu Server

Qualche giorno fa, a lavoro ho configurato il mio primo server vpn. Avevamo la necessità di accedere alla rete dell’ufficio anche dall’esterno. Insomma ci avrebbe fatto comodo essere “virtualmente” in ufficio quando fisicamente non è possibile. Avevo ricevuto consigli in merito a queste necessità, e mi era stato detto che come OpenVPN non ce n’erano molti. Ovviamente Open VPN è un software gratuito e multipiattaforma, aveva quindi tutti i prerequisiti necessari per piacermi.

Diciamo che prima di intraprendere il lavoro ho perso qualche minuto a cercare la documentazione necessaria, che mi avrebbe accompagnato durante il cammino.

Inizialmente avevo preso un pc davvero modesto (con processore AMD Duron, qualcosa di simile al Sempron ma un po’ più vecchio ;-) ) con 40 ghiga di disco e 512 Mb di ram SO DIMM, credendo di usarlo come test per la macchina vera. Ovviamente ho installato Ubuntu server come sistema operativo, scaricando l’ultima versione (10.04) siccome è un LTS. Nell’installazione del S.O. non c’è stato alcun inghippo, oramai queste ultime versioni sono una pacchia, filano dritte dritte in pochi minuti verso il traguardo ;-).

Una volta installato Ubuntu ho seguito il wiki in inglese per la corretta installazione di open vpn. Come prima passo, la guida consiglia di configurare un bridge sulla scheda ethernet per consentire al segmento LAN di essere connesso al segmento WAN, consentendo (se si vuole) di filtrare i pacchetti che li attraversano con un firewall. Per fare ciò basta installare un pacchetto chiamato bridge-utils con il comando:

sudo apt-get install bridge-utils

Fatto ciò si deve editare il file di configurazione della rete con il comando:

sudo vim /etc/network/interfaces

modificarlo come segue:

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Così facendo si assegna il bridge all’interfaccia eth0 con l’ip 192.168.0.10.

Adesso potete riavviare il servizio networking:

sudo /etc/init.d/networking restart

(per evitare di dover digitare sempre il comando sudo davanti ad ogni comando vi consiglio di digitare sudo su una volta per tutte)

Ora possiamo passare all’installazione vera e propria di OpenVPN:

apt-get install openvpn

Finita l’installazione del pacchetto creiamo una cartella che conterrà i programmi per generare le chiavi e le chiavi stesse:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/
mv /etc/openvpn/2.0 /etc/openvpn/easy-rsa

Dopodichè editiamo il file vars in modo da modificare le seguenti linee con le informazioni che ci riguardano:

export KEY_COUNTRY="US"
export KEY_PROVINCE="NC"
export KEY_CITY="Winston-Salem"
export KEY_ORG="Example Company"
export KEY_EMAIL="steve@example.com"

Salvate il file e chiudetelo. Accertandovi di essere loggati come utente di root, iniziate la procedura di generazione delle chiavi:

cd /etc/openvpn/easy-rsa/
source ./vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
cd keys
openvpn --genkey --secret ta.key
cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Ora che abbiamo generato le chiavi e i certificati per il server procediamo a generare quelli per il client (basterà ripetere la prossima procedura modificando l’identificativo del client per generare altre chiavi/certificati):

cd /etc/openvpn/easy-rsa/
source vars
./pkitool client1

Copiate ora sul client i file:

  • /etc/openvpn/ca.crt
  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key
  • /etc/openvpn/ta.key

Ora non ci resta che editare i file di configurazione per server e client (partiamo da una configurazione di esempio):

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz
vim /etc/openvpn/server.conf

Accertatevi di correggere le seguenti linee con i vostri dati:

local 192.168.0.10
dev tap0
script-security 3
up "/etc/openvpn/up.sh br0"
down "/etc/openvpn/down.sh br0"
proto tcp
;server 10.8.0.0 255.255.255.0
server-bridge 192.168.0.10 255.255.255.0 192.168.0.100 192.168.0.110
push "route 192.168.0.1 255.255.255.0"
tls-auth ta.key 0 # This file is secret
user nobody
group nogroup
cipher AES-256-CBC

La voce local sarà quella corrispondente all’indirizzo del vostro bridge, come la prima voce accanto a server-bridge. La seconda voce di server-bridge sarà la subnet mask mentre la terza e la quarta sarà il range di ip che openvpn assegnerà ai client che si connetteranno alla rete.
Il comando push “route… servirà per creare una rotta sugli indirizzi della LAN.
Fatto ciò, creiamo i due script per l’avvio e la chiusura dell’interfaccia virtuale (la tap0 che vedete nel file di configurazione). Creiamo il file up.sh come segue:

vim /etc/openvpn/up.sh
#!/bin/sh
BR=$1
DEV=$2
MTU=$3
/sbin/ifconfig $DEV mtu $MTU promisc up
/usr/sbin/brctl addif $BR $DEV

e il file down.sh così:

vim /etc/openvpn/down.sh
#!/bin/sh
BR=$1
DEV=$2
/usr/sbin/brctl delif $BR $DEV
/sbin/ifconfig $DEV down

Rendiamoli eseguibili:

chmod 755 /etc/openvpn/down.sh
chmod 755 /etc/openvpn/up.sh

Ora che il server è correttamente configurato, possiamo dare una riavviata al servizion openvpn:

/etc/init.d/openvpn/restart

Adesso passiamo al file di configurazione del client:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn

Il quale dovrà contenere:

dev tap
proto tcp
remote 192.168.0.10 1194
cert client1.crt
key client1.key
tls-auth ta.key 1
cipher AES-256-CBC

Ora copiate nella cartella di configurazione del client il file appena editato (chiamatelo client1.conf o client1.ovpn). Ovviamente si presuppone che i file delle chiavi e dei certificati siano nella stessa cartella di quest’ultimo file (sul client). Riavviate anche qui openvpn e il gioco è quasi fatto. Dico quasi perchè per potervi connettere al server dall’esterno dovrete dire al vostro router di aprirvi la porta 1194 e reindirizzare il traffico proveniente dall’esterno verso l’ip 192.168.0.10 (quello del bridge).

Ora siete davvero pronti per collegarvi dall’esterno alla vostra LAN (così com’è stato configurato openvpn non è possibile accedere da dentro la LAN alla vpn appena creata).

Spero di non aver dimenticato niente! ;-)

Che ve ne pare?

Differenze tra il tipo char e il varchar in MySQL

Prosegue il mio lavoro insieme a MySQL, ormai lo sto usando intensamente in molti programmi non solo in php, ma anche nella programmazione in java.

Usandolo così massicciamente sto continuando a scoprire cose interessanti. Probabilmente quella di cui vi parlo oggi, non è una novità per qualcuno, ma credo sia bene chiarirla per chi non lo sapesse.

Qualche giorno fa stavo lavorando su un database che non ho creato io e mi sono imbattuto in un campo CHAR. Subito non ci ho fatto caso, ma poi mi è venuto in mente che di solito quando devo dichiarare un campo stringa, uso il tipo VARCHAR. Mi sono così documentato un po’, cercando su google ho trovato diverse spiegazioni su forum, ma come sapete di quello che viene detto sui forum è sempre meglio non fidarsi troppo. Ho fatto quindi direttamente riferimento alla guida ufficiale MySQL (in inglese) e ho scoperto quello che mi interessava.

Innanzitutto prima di MySQL 5.0.3 sia il tipo char sia il varchar potevano essere dimensionati da 0 a 255 caratteri. Da MySQL 5.0.3 in poi il tipo varchar supporta lunghezza da 0 a 65535 caratteri. Oltre a questa differenza di dimensionamento c’è un’altra sostanziale differenza: quando dimensionate un campo con il tipo char, ad esempio char(4) verrà effettivamente occupato spazio per 4 caratteri, anche se il valore che inserirete nel campo sarà di un solo carattere. Lo spazio rimanente verrà riempito con degli spazi. A differenza del char, il varchar invece utilizza solamente lo spazio necessario, richiesto dal valore inserito nel campo più un byte (non sono riuscito a trovare il motivo, ma credo sia il famoso “tappo” in stile C).

Riepilogando quindi:

Valore CHAR(4) Spazio richiesto
VARCHAR(4) Spazio richiesto
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Per finire, come si può vedere nell’ultima riga dell’esempio, per tutti e due i tipi, se il valore supera la lunghezza effettiva dichiarata, esso verrà troncato.

In sostanza se sapete che nel campo che state dichiarando dovrete inserire valori sempre della stessa lunghezza, senza eccezioni, potrebbe essere intelligente dichiararlo char mentre invece se, come succede nella stragrande maggioranza dei casi, il campo che state dichiarando conterrà stringhe generiche, allora vi converrà utilizzare il tipo varchar.

Google ti aiuta anche a trovare lavoro…

Sei disoccupato o non riesci a trovare il lavoro dei tuoi sogni? Vuoi a tutti costi tentare di essere assunto nel posto di lavoro che sogni da anni? Google può essere l’unico elemento che ti serve per realizzare i tuoi desideri! ;-)

Un trentenne americano, stanco di inviare curriculum a tutte le aziende pubblicitarie di New York senza ricevere risposta, si è inventato un modo tutto suo per arrivare direttamente al direttore creativo, saltando a piè pari tutti i vari uffici di risorse umane e reclutamento. Come ha fatto?

Ha investito 6 dollari ed ha acquistato il Top Spot di Google (il primo risultato delle ricerche di Google, quello in giallo per intenderci) dei nomi di alcuni dei più famosi direttori creativi di studi pubblicitari newyorkesi, inserendo questa frase:

Googleggiare con il tuo nome è davvero divertente, ma anche assumermi è altrettanto divertente

Ovviamente, visto che siamo qui a parlarne, questa nuova trovata pubblicitaria ha avuto successo e poco dopo Alec Brownstein ha ricevuto le chiamate che aspettava. Ha pagato il Top Spot per 5 nomi, e ha ricevuto 4 telefonate per proposte di colloqui. Di queste 4, 2 sono diventate offerte di lavoro e lui ha finalmente ottenuto il lavoro che voleva presso lo studio di New York della Y&R una multinazionale specializzata in pubblicità.

La trovata geniale è stata aiutata anche dal narcisismo delle persone, ma in fondo chi di voi non ha mai provato a googleggiarsi? ;-P

Includere jQuery nel proprio tema wordpress

Il titolo potrebbe farvi pensare che questo post potrebbe essere inutile… Infatti il metodo più semplice per usare jQuery in un tema per wordpress è quello di inserire una nuova sorgente per uno script javascript con il tag:

<script type="text/javascript" src="......./jquery.js"></script>

Inizialmente il tutto potrebbe anche funzionare e non è detto che possa filare tutto liscio senza crearvi nessun fastidio.

I problemi però potrebbero iniziare quando deciderete di includere un plugin nel vostro blog.

Infatti molti plugin di wordpress richiedono un framework javascript (non necessariamente jQuery) per funzionare. WordPress include già il file .js di jQuery e quando un plugin lo richiede, il sistema include già lo script.

Per questo il modo più semplice è sicuro di inserire jQuery nel proprio tema è quello di inserire nel file header.php sopra il richiamo della funzione wp_head():

wp_enqueue_script("jquery");
wp_head();

Ora wordpress includerà il file javascript di jQuery, ma bisogna ancora compiere un passo per poter essere sicuri di aver risolto tutti i problemi. Se fossero necessarie altre librerie javascript diverse da jQuery, quest’ultimo potrebbe andare in conflitto, perciò risolviamo il problema con queste istruzioni javascript:

var $jQ = jQuery.noConflict();

$jQ(document).ready(function(){
       alert("Hello World!");
});

Se avrete fatto tutto come si deve, al caricamento della pagina apparirà una finestra di avviso con scritto Hello World! ;-)

Servire dinamicamente le immagini con php, Mysql e Imagick

Nessuno se ne sarà accorto ed effettivamente è un po’ impossibile notarlo se uno non lo sa ;-)

Ormai da una settimana però ho messo in funzione uno strumento “self-made” per la gestione delle immagini del mio blog.

Spulciando un po’ più attentamente google webmaster tools tra le funzioni sperimentali ho trovato un prestazioni del sito

In questa sezione google presenta un’analisi delle prestazioni del proprio sito (in termini di tempo e kilobyte di dati) e fornisce consigli su come ridurre i tempi di caricamento.

Siccome il mio hosting mi limita lo spazio web, utilizzavo un piccolo escamotage per caricare le foto del blog: le caricavo su picasa e sfruttavo i server di google per fornirle. Webmaster tools mi consigliava però di ridurre al minimo le ricerche DNS e infatti molto spesso le foto venivano reperite da diversi server di picasa. Tutto ciò contribuiva ad incrementare il tempo di caricamento del sito per cui ho preso la decisione di darmi da fare :-P

Come detto, il mio hosting mi limita lo spazio web, ma non ho limiti per quanto riguarda il db MySQL, per cui ho deciso di realizzare una mini-applicazione in php per salvare le immagini su database e servirle dinamicamente. Tutto questo con due funzioni che sfruttano la classe Imagick (installata sul server dove risiede il mio dominio).

Il concetto si basa in sostanza su tre pagine.

La prima sarà un form per far scegliere all’utente l’immagine da uploadare:

<form action="....." method="POST" enctype="multipart/form-data">.....</form>

La seconda, una pagina che riceve il parametro con l’immagine e la salva nel database:

il file è contenuto nell’array

$_FILES['image']['tmp_name']

dove image è il nome del parametro ricevuto via POST.

Qui ci servirà la prima funzione che sfrutterà la classe Imagick:

        public static function prepare_image($file){
		$img=new Imagick();
		$handler=fopen($file,'r');
		$ret=null;
		if(!feof($handler)){
			$fstr=fread($handler,filesize($file));
			$img->readImageBlob($fstr);
			/*Richiamo il metodo resize*/
			$img->setFormat('jpg');
			$img->setImageCompression(Imagick::COMPRESSION_JPEG);
			$img->setImageCompressionQuality(100);
			$ret=addslashes($img->getImageBlob());
			$img->destroy();
		}
		fclose($handler);
		return $ret;
	}

Dove la variabile $file sarà il contenuto dell’array di cui parlavamo prima. A questo punto potremo salvare il valore restituito dalla funzione nel database (il campo dovrà essere di tipo blob o meglio ancora longblob).

Fatto ciò possiamo passare alla terza pagina, quella che servirà l’immagine letta dal db.

Quest’ultima dovrà ricevere come parametro l’id dell’immagine da leggere sul db. La query la lascio fare a voi, io vi spiego la seconda funzione che ci servirà ;-) (molto più “leggera” della prima):

        public static function get_image_from_blob($blob){
		 $img=new Imagick();
		 $img->readImageBlob($blob);
		 $img->setFormat('jpg');
		 return $img;
	}

In questo caso il parametro $blob sarà il valore blob letto dal db, e la funzione ci restituirà l’immagine. A questo punto non vi resta che stampare l’immagine:

header('Content-Type: image/jpeg);
echo $img;

Abbastanza semplice no?
E dopo la prima settimana di utilizzo lascio a voi valutare i risultati ;-) :

Ovviamente tramite Imagick potete anche fare il resize dinamico delle immagini, ma non vorrei confondervi troppo le idee :-P

Sottotitoli automatici per i filmati di YouTube!

Signori, questa a mio parere è una grande feature. Molti diranno: “I sottotitoli? e a cosa servono?”. Ora spiego l’origine di questa mia euforia.

Vi rendete conto che ora quando guarderemo un video su Youtube, che sia in inglese, russo, cinese o aramaico potremmo leggere che cosa stanno dicendo i protagonisti del video? Non vi convince vero? E allora ve lo dico: vi rendete conto che i sottotitoli non li scrive nessuno per voi, ma sono creati automaticamente da un algoritmo di riconoscimento vocale?

Al momento la funzione è disponibile solo per la lingua inglese, ma gli ingegneri di youtube stanno lavorando per rendere disponibile la feature in 50 lingue. Cioè in automatico voi potrete “switchare” dal sottotitolo in inglese a quello in italiano, francese, spagnolo ecc ecc. Uno spettacolo direi!

E per finire se i sottotitoli che il sw crea non sono di vostro gradimento allora potrete scaricarli, correggerli e reinviarli a youtube… Secondo me questa nuova funzionalità è una figata! (ah?! dite che si era già capito?) :-P
[ad]

Le olimpiadi invernali di Vancouver su Google

È stata aggiornata da poco l’homepage di Google Italia con il link-sponsor alla nuova funzionalità offerta dal colosso del web. Il link permette agli utenti di Google Maps di catapultarsi sulle piste che saranno teatro delle olimpiadi invernali e che verrano inaugurate questo venerdì a Vancouver, in Canada. Google ha realizzato le riprese in pieno stile street view delle piste di tutte le specialità presenti ai prossimi giochi invernali, in modo che gli utenti si possano virtualmente fiondare nella fredda città canadese.

Da buoni perfezionisti, quelli di Big G hanno montato l’ormai celebre strumento utilizzato per scattare le fotografie da usare in street view, sopra una motoslitta e si sono fatti un bel giretto sui campi di gara.

Per non farsi mancare nulla hanno anche personalizzato l’omino che l’utente può posare sulla mappa, con uno sciatore, che ovviamente punta sci e bastoncini nella direzione indicata dal mouse!

Oltre a tutto ciò sono stati creati dei gadget personalizzati che chiunque può condividere su facebook, twitter o sul proprio sito web, per monitorare le gare del giorno, la situazione medaglie e tanto altre curiosità. Trovate tutto a questo indirizzo: http://google.com/games10

Buon divertimento, e un in bocca al lupo ai nostri azzurri!
[ad]

YouTube sperimenta HTML 5!

Proprio chi aveva fatto di Flash il suo cavallo di battaglia, chi aveva contribuito a renderlo più leggero e più adatto alle proprie esigenze, appena ha avuto una via di fuga per le mani, non ha saputo resistere…

Sto parlando (come si era già capito) del famoso sito di video sharing YouTube che in queste ore ha annunciato l’inizio dei test pubblici per sperimentare l’HTML 5, ovvero il nuovo standard in cui si possono includere direttamente nel codice html, video e audio che non necessitano dell’ausilio di plugin per essere riprodotti.

Se volete sperimentare anche voi questa novità, non dovete far altro che collegarvi a http://www.youtube.com/html5 e seguire i pochi e semplici passi. Requisito fondamentale è avere uno dei browser specificati (safari 4, google chrome, internet explorer con chrome frame o il fresco fresco firefox 3.6) che siano in grado di riprodurre il formato multimediale h.264.

Google da sempre si dà da fare per migliorare i suoi prodotti in termini di rapidità e fruibilità senza dimenticare il consumo energetico, e proprio questo formato permette di migliorare queste 3 caratteristiche. Certo siamo ancora all’inizio e ci vorrà ancora un po’ di tempo prima che html 5 diventi lo standard davvero standard (eh?! dai si è capito no?! :-\ ), ma con questo passo secondo me si fa un bel salto in avanti con buoni risultati… Personalmente da buon utente ubuntu (=non ho mai potuto navigare decentemente su un sito che facesso uso intensivo di flash, ad eccezione dei soliti pochi intimi) sarei davvero soddisfatto, nonchè favorevole a questo passaggio. E voi? Che ne dite?
[ad]

Pollycoke sta tornando…

A quanto pare, l’abbassamento delle luci sul miglior sito italiano del mondo “linux-e-non-solo” era solo (come tutti noi speravamo) temporaneo, e come scritto dal buon Felipe nell’ultimo articolo (datato 19/01/2009), sembra che qualcosa si stia muovendo.

Intanto ci suggerisce di aggiornare i puntatori al suo blog cambiando l’url dal vecchio pollycoke al nuovo-vecchio pollycoke.org.

In attesa del completamento delle operazioni preliminari sul nuovo dominio, io ho ascoltato il consiglio, e ora aspetto di vedere tutte le altre novità per poter definitivamente dire “bentornato pollycoke”!
[ad]

Rispondere ai commenti su Facebook attraverso le e-mail

Come pubblicato qualche ora fa sul blog di facebook, oggi è stata introdotta una nuova funzionalità del social network più usato al mondo, davvero molto interessante: la replica ai commenti via mail.

Quando un utente scrive un commento sulla nostra bacheca o sulle nostre foto/video, se nelle impostazioni della privacy non sono state disattivate le notifiche, facebook ci avvisa con una e-mail dell’evento. Fino ad oggi nella mail di avviso c’era un link da cui si poteva effettuare il login e successivamente rispondere al commento. Da oggi invece, basterà cliccare su “rispondi” dal proprio client di posta e inviare il testo in replica al commento ricevuto e questo verrà automaticamente aggiunto alla coda dei commenti.

Credo sia una funzionalità davvero molto comoda, sia per partecipare ad una conversazione senza perdere troppo tempo, per chi si trova indaffarato sul posto di lavoro o chi non ha tempo di collegarsi al sito, sia per chi per diverse ragioni non può accedere al social network direttamente. Questa funzione permetterà di incrementare enormemente le conversazioni via commenti fra utenti… Un bell’applauso agli sviluppatori di facebook, per questa nuova, semplice ma utilissima features!

[ad]