Configurare un PPTP Server per iPhone

Lo so, sto diventando troppo iPhone addicted, ma ormai me lo sono preso e (per quanto permesso dalla Apple) cerco di sfruttarlo al massimo.
Ho cercato per qualche tempo in rete per cercare di configurarlo usando OpenVPN, che già uso per connettermi al mio PC di casa; a quanto pare però ci sono due problemi sostanziali: il primo è che non c'è il pacchetto SSL per iPhone (almeno non ufficiale), il secondo è che il kernel non permette l'apertura della porta tun necessaria per creare una connessione OpenVPN (anche questo sempre nella versione ufficiale dell'iPhone).

Mi sono perciò arreso a dovermi cercare un programma alternativo, dopo aver surfato un po' mi sono deciso ad installare PPTP, anche se non ufficialmente supportato da Fedora 12 (non esiste il pacchetto nei repository).

Per l'RPM mi sono affidato a qualcun altro che lo aveva già compilato per me:

http://blog.bradiceanu.net/2009/11/20/fedora-12-pptp-server/

funziona alla perfezione, quindi ve lo consiglio.

A questo punto parte la fase di configurazione.

Configurazione Server

  1. /etc/pptpd.conf
    Non serve modificare grandi cose all'interno del file. Io ho semplicemente decommentato debug (giusto per tenere traccia di quello che succede. In fase di testing è cosa buona e giusta) e ho aggiunto la configurazione IPs per la mia rete.

    localip 192.168.2.11
    remoteip 192.168.2.234-238

    Che indicano semplicemente che il mio server ascolta sulla 192.168.2.11 e che voglio configurare come IP remoti dalla 234 alla 238 (gli ip assegnati ai client remoti per la navigazione all'interno della vostra rete).
  2. /etc/ppp/chap-secrets

    # client server secret IP addresses
    user1 pptpd password1 *

    Configurate le credenziali d'accesso per i vostri client. Nel mio caso giusto quello che mi serve per connettermi con l'iPhone
  3. /etc/ppp/options
    Qui ho dovuto aggiungere queste due righe di configurazione
    mru 900
    mtu 900

    perchè il mio iPhone perdeva subito la connessione dal server. In questo modo mi funziona sia usando una WiFi che usando una 3G (e addirittura su EDGE!!)
  4. A questo punto la configurazione del PPTP dovrebbe essere completa. Io ho lasciato il default all'interno degli altri file di configurazione senza avere nessun tipo di problema.
  5. Una cosa da configurare (se lo usate) è iptables per aprire la porta usate dal PPTP al mondo

    #PPTP VPN
    -A INPUT -p 47 -j ACCEPT
    -A INPUT -p tcp --dport 1723 -j ACCEPT


    Questo è sufficiente. Abilita il protocollo "47" (gre) e apre la porta di default di PPTP 1723.
La configurazione lato server si chiude qui. Se avete abilitato il debug, come consigliato, potete mettervi in tail su /var/log/messages per visualizzare i tentativi di connessione dai vostri client.

Configurazione iPhone
Nel mio caso il solo client interessante per questa VPN è l'iPhone. Le configurazione è molto semplice e veloce. Basta andare in Impostazioni -> Generali -> Rete -> VPN e configurare come da figura


Dove in server dovrete inserire l'IP pubblico della vostra rete (usate DynDNS o qualcosa di simile se avete IP Dinamico); in account andrà messo il nome utente configurato in precedenza (nell'esempio era user1); in password credo sia scontato dire cosa ci vada! :)
Se volete che tutto il traffico venga rediretto verso la vostra rete domestica lasciate abilitato "invia tutto il traffico". Ovviamente facendo in questo modo, se volete navigare dal vostro iPhone quando siete connessi alla VPN dovrete abilitare ipforward sul server per reindirizzare il traffico "internet" da e verso i vostri client (iPhone nello specifico). Disabilitando l'opzione verrà indirizzato verso la VPN solo il traffico specifico; nel mio caso, per esempio, inserendo l'indirizzo del Server (192.168.2.11) dove ho un server VNC in funzione (che espongo solo in rete locale) riesco a controllare il mio PC ovunque sono (e ribadisco: anche su 3G).

Tentativo di connessione

Ecco un estratto del log lato server a seguito di un tentativo di connessione dal mio iPhone:

Dec 22 08:24:03 localhost pptpd[12040]: CTRL: Client 95.74.118.140 control connection started
Dec 22 08:24:04 localhost pptpd[12040]: CTRL: Starting call (launching pppd, opening GRE)
Dec 22 08:24:04 localhost pppd[12041]: pppd 2.4.4 started by root, uid 0
Dec 22 08:24:04 localhost pppd[12041]: Using interface ppp0
Dec 22 08:24:04 localhost pppd[12041]: Connect: ppp0 <--> /dev/pts/2
Dec 22 08:24:09 localhost pppd[12041]: MPPE 128-bit stateless compression enabled
Dec 22 08:24:10 localhost pppd[12041]: found interface eth0 for proxy arp
Dec 22 08:24:10 localhost pppd[12041]: local IP address 192.168.2.11
Dec 22 08:24:10 localhost pppd[12041]: remote IP address 192.168.2.234

Se tutto è andato a buon fine sul vostro telefono dovestre vedere un "inconcina" VPN in alto nell'area connessioni.



Se non avete credeto al fatto che il tutto funzionasse anche in EDGE guardate questa immagine! :D Ho provato a controllare il mio server in VPN e non gira nemmeno malissimo, certo non aspettatevi grandissime performance, ma è comunque accettabile!

Conclusioni
Come ho detto in precedenza, la configurazione che vi ho presentato qui è molto "base"; non sono stato ad indagare molto sulle varie configurazioni possibili perchè personalmente mi serve giusto per un paio di funzioni la connessione VPN.
Giusto per non farvi girare a lungo su Google vi mostro come configurare il forwording del traffico internet, nel caso vogliate veicolare tutte le connessioni attraverso la vostra VPN.

>echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j SNAT --to 192.168.2.11

Dove, al posto di 192.168.2.11 dovrete mettere l'IP del vostro server e configurare di conseguenza gli IP della vostra rete e l'interfaccia ethernet/wireless da usare per il forward del traffico internet.

Il flag all'interno di ip_farward non è persistente, quindi se riavviate il PC dovrete riscrivere la riga con "echo 1 ....". Per rendere persistente la modifica basta editare il file /etc/sysctl.conf e modificare la riga

># Controls IP packet forwarding
net.ipv4.ip_forward = 0


mettendo un bell'1 al posto dello 0!