VPN ja SSH

Allikas: Kuutõrvaja

Lihtne VPN tunnel PPP ja SSH abil

Üle võõra ja/või ebaturvalise võrgu (nt avalik wifi) oma asutsue sisevõrgule ligipääsu saamiseks on vaja mingit vahendit, et sisevõrku "pikendada" oma hetke asukohta. Sellise lahendust nimetataksegi VPN (i.k. Virtual Private Network).

VPNi kasutamine võimaldab näiteks ligipääsu asutuse sisevõrgu piiratud ressurssidele (nt intranet) või saada ühendus mingi LANiga (Local Area Network - tihti privaatseid IP numbreid kasutav võrk), mis on internetist kättesaamatu.

VPN vajab:

* serveri poolt, mis paikneb asutuse võrgu serveris ja vahendab liiklust kliendi ja sisevõrgu vahel
* kliendi poolt, mis paikneb kasutaja arvutis ja algatab ühenduse serverisse.
* tunnelit, mis vahendaks (soovitavalt krüptitult) VPN liiklust kliendi ja serveri vahel.

Käesolev juhend kasutab tunnelina SSH (i.k. Secure SHell) ühendust kliendi ja serveri vahel, mille sees käib PPP (i.k. Point-to-Point Protocol) link. Selline ülesehitus on väga lihtne ning ei vaja vahepealsetest tulemüüridest läbipääsemiseks eriseadistust (tavaliselt on SSH protokoll tulemüürides lubatud).


Kernel

Nii serveri kui kliendi operatsioonisüsteem peab võimaldama PPP ühendusi tekitada. Kernelisse selle toe lisamise õpetus jääb käesoleva juhendi raamest välja ja on iga operatsioonisüsteemi jaoks leitav internetist, nt Linuxi kerneli jaoks Gentoo PPTP lehelt.

Linuxi kerneli puhul, kui PPP tugi on kompileeritud moodulina, tuleb laadida vastav moodul:

 modprobe ppp_mppe

Automaatse laadimise saavutamiseks tuleb saee moodul kirjutada konfifaili, mis on distributsioonist sõltuv. Gentoo Linuxi puhul:

 echo "ppp_mppe" >> /etc/modules.autoload.d/kernel-2.6


Serveri pool

Kasutaja loomine

Kui serveris on kõigil VPN kasutajatel konto olemas, võib selle sammu vahele jätta. Kui aga pole, tuleks tekitada näiteks ühine vpn kasutaja, kellena kõik sisenevad (käsu täpne süntaks sõltub jällegi operatsioonisüsteemist):

 adduser -c "VPN kasutaja" -m vpn

Et see kasutaja saaks käivitada pppd käsku rooduna, tuleb lisada faili /etc/sudoers käsuga visudo järgmised read:

 vpn   ALL=NOPASSWD: /usr/sbin/pppd

PPPD seadistus

Kuivõrd see kasutaja muud ei tee, kui käivitab PPP deemonit pppd, siis asendada /home/vpn/.bash_profile sisu järgnevaga:

 sudo /usr/sbin/pppd passive proxyarp ktune
 logout

Siin toodud pppd võtmed tähendavad:

* passive - pppd käivitub ja jääb ootama, et klient talle käske saadaks
* proxyarp - pppd lisab kliendi IP numbri ja serveri MAC numbri ARP tabelisse, et kliendi masin paistaks kohalikus LANis välja
* ktune - pppd häälestab Linuxi kernelit vastavalt vajadusele, näiteks lisab ip_forward lipukese, et pakette ruutida LANist kliendile.


Tulemüür

Kui serveris on kasutusel mingi tulemüüri tarkvara, mis võib tõkestada pakettide liiklust LANist kliendi masinasse, siis tuleks ka see seadistada nimetatud liiklust lubama.

FireHOL jaoks näeb konfiguratsioon välja selline:

 router pppsisevrk inface ppp+ outface eth3
   policy accept

Kliendi pool

PPPD vaikeseaded

Kui ei eksisteeri, siis tuleks tekitada tühi fail /etc/ppp/options, kuna pppd tahab sealt oma vaikeseadeid lugeda. Meie PPP kanali seaded määratakse käsurealt, mistõttu sellesse faili pole vaja midagi kirjutada


Root kasutaja avalik võti

Et klienti poolel käivituv skript saaks segamatult ja automaatselt ühendust VPN serveriga, tuleb root kasutajale tekitada avaliku-salajase võtme paar, kui seda juba pole (root kasutajana):

 ssh-keygen -t dsa -b 1024

See käsk tekitas /root/.ssh/id_dsa ja /root/.ssh/id_dsa.pub failid. Neist viimane, id_dsa.pub on vaja kopeerida serverisse ja lisada vpn kasutaja "võtmerõngasse" käsuga:

 cat id_dsa.pub >> /home/vpn/.ssh/authorized_keys


Haldamise skript

Kopeeri see skript kliendi arvutisse (näiteks /root/vpn.sh) ja muuda # addressing ja # account"' all olevad MYPPPIP, REMOTEPPPIP, REMOTENET jt parameetrid vastavalt vajadusele.

 #!/bin/sh
 
 # (C) Jason Deraleau <jldera@mac.com> - Original script at: http://www.macdevcenter.com/pub/a/mac/2002/12/20/vpn.html?page=2
 # (C) Laas Toom <laas.toom@eenet.ee> - Simplification and modifications for Linux and FreeBSD
 
 # tools
 SSH=/usr/bin/ssh
 PPPD=/usr/sbin/pppd
 ROUTE=/sbin/route
 SLEEP=/bin/sleep
 KILL=/bin/kill
 HEAD=/usr/bin/head
 ECHO=/bin/echo
 SUDO=/usr/bin/sudo
 
 # addressing
 MYPPPIP=192.168.1.2
 REMOTEPPPIP=192.168.1.1
 REMOTENET=192.168.1.0
 REMOTEMASK=255.255.255.0
 
 # account
 REMOTEHOST=vpnserver.example.com
 REMOTEUN=vpn
 
 function add_route(){
   UNAME=$(uname)
   if [ "$UNAME" == "Linux" ]
   then
     $ROUTE add -net $REMOTENET netmask $REMOTEMASK gw $REMOTEPPPIP
   elif [ "$UNAME" == "Darwin" -o "$UNAME" == "FreeBSD" ]
   then
      $ROUTE add -net $REMOTENET -netmask $REMOTEMASK  $REMOTEPPPIP
   fi  
 }
 
 if [ "$UID" -eq 0 ]; then
   case "$1" in
     start)
       # Start PPP
       $ECHO "Starting PPP daemon..."
       $PPPD pty "$SSH -t -l $REMOTEUN $REMOTEHOST" linkname $REMOTEUN local noauth persist updetach mtu 1492 mru 1492 $MYPPPIP:$REMOTEPPPIP
       $SLEEP 5
 
       # add route
       $ECHO "Configuring routing..."
       add_route
 
       $ECHO "Done."
       ;;
     stop)
       # Bring down PPP
       $ECHO "Killing PPP daemon..."
       $KILL $($HEAD -n 1 /var/run/ppp-$REMOTEUN.pid)
       ;;
     *)
       $ECHO "Usage: vpn (start|stop)"
       ;;
   esac
 else
   $ECHO "This program should be run as root or with root privileges."
   $ECHO "sudo $0 $@"
   $SUDO $0 $@
 fi

Muidugi peavad õigused paigas olema:

 sudo chmod 755 /root/vpn.sh

VPN käivitamine:

 sudo /root/vpn.sh start

VPN seiskamine:

 sudo /root/vpn.sh stop

Viited

[1] - Wikipedia VPN leht

[2] - Käesolev juhend põhineb suuresti MacDevCenteri samanimelisel juhendil, mida on täiendatud ja lihtsustatud.

[3] - PPTP (Point-to-Point Tunnelling Protocol) kasutamine Gentool


--laas 28. jaanuar 2008, kell 14:08 (EET)