Nagyon sok írás született már VPN témában. Évekkel ezelőtt learchiváltam egy OSX Server VPN beállítást. Majd jött Tamás, és OpenBSD-vel kapcsolatban írt először a PPTP-ről, majd a IPSEC/L2TP megoldásról. Eljött az ideje, hogy én is hozzátegyem a magamét, és ledokumentáljam a L2TP/IPSEC megoldást Ubuntu alá.
Feltételezem, hogy mindenkinek van egy Ubuntu 12.04 rendszere. Két komponenssel fogunk dolgozni. Az első az IPSEC, a másik az L2TP.
IPSEC
Az IPSEC-hez a következő csomagot kell installálnunk.
# apt-get install openswan
A telepítést után a következő konfigurációs állományt kell szerkesztenünk:
# vi /etc/ipsec.conf
version 2.0 config setup nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 oe=off protostack=netkey conn L2TP-PSK-NAT rightsubnet=vhost:%priv also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret pfs=no auto=add keyingtries=3 rekey=no ikelifetime=8h keylife=1h type=transport left=YOUR.SERVER.IP.ADDRESS leftprotoport=17/1701 right=%any rightprotoport=17/%any
Értelemszerűen a YOUR.SERVER.IP.ADDRESS helyére kerül a gépünk IP címe.
Ezek után valamilyen előre meghatározott kulcsot kell beállítanunk az VPN-nek:
# vi /etc/ipsec.secrets
YOUR.SERVER.IP.ADDRESS %any: PSK „YourSharedSecret”
Megint csak a YOUR.SERVER.IP.ADDESS helyére jön az VPN szerver címe, a YourSharedSecret helyére pedig a tetszés szerint titkos kulcs.
Futtassuk a következő scriptet, ami a kernel hálózati beállításait billenti helyre a VPN máködéséhez:
# for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done
Majd indítsuk újra a service-t:
# sudo /etc/init.d/ipsec restart
L2TP
A második komponens az L2TP lesz. Installáljuk a szükséges csomagot:
# apt-get install install xl2tpd
Majd szerkesszük meg a konfigurációs állományát:
# vi /etc/xl2tpd/xl2tpd.conf [global] ipsec saref = yes [lns default] ip range = 10.1.2.2-10.1.2.255 local ip = 10.1.2.1 refuse chap = yes refuse pap = yes require authentication = yes ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes
Az ip range helyére kell beillesztenünk, azt a tartományt, amiből a VPN szerver IP címeket oszthat. A local ip helyére pedig a VPN szegmensben a VPN szerver IP címét. Ez fog route-lni ennek a tartománynak.
Ahogy látszik az L2TP ebben az esetben a PPP-t használha a felhasználók azonosítására. Ez a legegyszerűbb mód. Ehhez rakjuk fel a ppp csomagot is.
# apt-get install install ppp
Majd szerkesszük meg a hozzátartozó konfigurációs állományt:
# vi /etc/ppp/options.xl2tpd require-mschap-v2 ms-dns 8.8.8.8 ms-dns 8.8.4.4 asyncmap 0 auth crtscts lock hide-password modem debug name l2tpd proxyarp lcp-echo-interval 30 lcp-echo-failure 4
Ahogy látszik, jelenleg az ms-dns sorok után a Google DNS szerverei szerepelnek. Ezt természetesen tetszés szerint át lehet alakítani. Ezek után nincs is más dolgunk, mint a felhasználókat managelni:
# vi /etc/ppp/chap-secrets # user server password ip test l2tpd testpassword *
Ahogy látszik először jön a felhasználó neve, majd hogy l2tpd szerverhez tartozó azonosításhoz kell a felhasználó. Ezek után jön a titkos jelszó, amit a kliensnél be fog kérni a kliens program, majd a végén, hogy milyen IP címet kapjon. A csillag a következő szabadat jelenti a tartományban, amit a /etc/xl2tpd/xl2tpd.conf file-ban adtunk meg. Természetesen a csillag helyére adhatunk meg konkrét címet is.
Indítsuk újra a L2TP szervízt is:
# /etc/init.d/xl2tpd restart
Majd biztos, ami biztos engedélyezzük, hogy a tűzfal nem fogja blokkolni a VPN kapcsolatok adatfolyamát, és a hálózati csomag továbbítás is engedélyezve van:
# iptables --table nat --append POSTROUTING --jump MASQUERADE # echo 1 > /proc/sys/net/ipv4/ip_forward
Ezt követően, már működik is a VPN szerverünk.
Portok
Fontos lehet, hogy mit a VPN szerverünk, milyen portokat is használ. Amennyiben forwarding-ot akarunk beállítani, vagy szimplán a tűzfalon engedélyezni.
PPTP
To allow PPTP tunnel maintenance traffic, open TCP 1723.
To allow PPTP tunneled data to pass through router, open Protocol ID 47.
L2TP over IPSec
To allow Internet Key Exchange (IKE), open UDP 500.
To allow IPSec Network Address Translation (NAT-T) open UDP 4500.
To allow L2TP traffic, open UDP 1701.
Linux CLI VPN beállítás
A legtöbb grafikus interface-val rendelkező rendszernél pofon egyszerű a VPN kliens beállítása. Megadjuk a VPN szerver IP címét. Kiválasztjuk, hogy L2TP/IPSEC-et akarunk használni. Megadjuk a titkos kulcsot, majd a felhasználónkat és a hozzá tartozó jelszót, és már megy is.
Viszont mi a helyzet, ha nincs grafikus interface? Hanem egy Linuxos szervert szeretnénk csatlakoztatni a VPN szerverhez?
Először is rakjuk fel a szükséges csomagokat a kliensünkre.
# apt-get install openswan xl2tpd
Igen, ezek pontosan ugyan azok a csomagok lesznek, amik a szerverre is felkerültek. A különbség csak abban lesz, hogy állítjuk be őket.
Szerkesszük meg az első konfigurációs állományt:
# vi /etc/ipsec.conf config setup virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 nat_traversal=yes protostack=netkey oe=off plutoopts=“--interface=eth0” conn L2TP-PSK authby=secret pfs=no auto=add keyingtries=3 dpddelay=30 dpdtimeout=120 dpdaction=clear rekey=yes ikelifetime=8h keylife=1h type=transport left=%defaultroute leftnexthop=%defaultroute leftprotoport=17/1701 right=VPN.SERVER.IP.ADDRESS
Természetesen itt is a VPN.SERVER.IP.ADDESS mezőt le kell cserélnünk saját VPN szerverünk IP címére. Most adjuk meg a VPN szerver titkos kulcsát.
# vi /etc/ipsec.secrets 0.0.0.0 %any: PSK "YourSharedSecret"
Természetesen itt is a YourSharedSecret helyére a VPN szerver titkos kódját írjuk.
Most jöhet az L2TP szerver. Szerkesszük meg a fő konfigurációs állományát:
# vi /etc/xl2tpd/xl2tpd.conf [lac vpn-connection] lns = refuse chap = yes refuse pap = yes require authentication = yes name = vpn-server ppp debug = yes pppoptfile = /etc/ppp/options.l2tpd.client length bit = yes
Majd állítsuk be a felhasználót, akivel a VPN kliens be fog jelentkezni. Ehhez szerkesszük a következő file-t:
# vi /etc/ppp/options.l2tpd.client ipcp-accept-local ipcp-accept-remote refuse-eap require-mschap-v2 noccp noauth idle 1800 mtu 1410 mru 1410 defaultroute usepeerdns debug lock connect-delay 5000 name VPN.USER.NAME password VPN.USER.PASSWORD
A name és password mezők után természetesen a saját VPN felhasználónkat, és a hozzá tartozó jelszót kell megadnunk a file-ban.
Ezek után a következő parancsok segítségével tudunk csatlakozni:
# /etc/init.d/ipsec start # /etc/init.d/xl2tpd start # ipsec auto --up L2TP-PSK # echo "c vpn-connection" > /var/run/xl2tpd/l2tp-control
Ha minden jól működött, akkor az ifconfig kimenetelében látnunk kell a kliensen egy új ppp0 interface-t.
Persze a gépünkön meg kell adnunk, hogy a VPN hálózatát (vagy több hálőzatit), most már a VPN gateway-n lehet elérni. Ehhez adjuk ki a következő parancsot:
# ip route add 10.0.5.0/24 via 10.0.5.1
Ekkor a 10.0.5.0/24 hálózatot, már a 10.0.5.1-es VPN gateway-n keresztül akarja majd elérni.
Amennyiben _Minden_ hálózati forgalmat a VPN csatornára akarunk küldeni, használjuk a következő parancsot:
# ip route add default via 10.0.5.1
Automatikus csatlakozás
Persze szerver esetében azt szeretnénk, ha ez a kapcsolat automatikusan felépülne. Ehhez én először is írtam egy scriptet:
# cat/etc/init.d/vpn_init.sh #!/bin/bash if [ $# != 1 ] ; then echo "Usage: (sudo) sh $0 {start|stop}" exit 1; fi function start(){ /etc/init.d/ipsec start sleep 2 #delay to ensure that IPsec is started /etc/init.d/xl2tpd start /bin/echo "c vpn-connection" > /var/run/xl2tpd/l2tp-control /usr/sbin/ipsec auto --up L2TP-PSK & sleep 10 #delay again to make that the PPP connection is up. /sbin/route add -net 10.0.5.0/24 gw 10.0.5.1 } function stop(){ /usr/sbin/ipsec auto --down L2TP-PSK /bin/echo "d vpn-connection" > /var/run/xl2tpd/l2tp-control /etc/init.d/xl2tpd stop /etc/init.d/ipsec stop /sbin/route delete -net 10.0.5.0/24 gw 10.0.5.1 } $1 exit 0
Ahogy látszik, csak a már leírt parancsok, és a routing hozzáadása szerepel ebben az RC scriptben. Ezt start vagy stop-al meghívva tudja a rendszer bootoláskor, vagy leálláskor elindítani, vagy leállítani a tunnelt. Ámbár, valahogy figyelnünk kell, hogy menet közben, ha megszakad a kapcsolat, akkor újra felépüljön. Erre én a következő, nem túl elegáns cron job-ot használtam.
# crontab -l # m h dom mon dow command # Check VPN connection and reconnect if there is an error. # * * * * * /sbin/ifconfig ppp0 > /dev/null 2>&1 ; if [ "$?" = 1 ]; then echo VPN client was restarted at `date`; /etc/init.d/vpn_init.sh stop; sleep 2; /etc/init.d/vpn_init.sh start ; else /sbin/route add -net 10.0.5.0/24 gw 10.0.5.1; fi
Az egysoros megnézni, hogy van-e ppp0 interface. Ha nincs meghívja a stop, majd a start metódusát a vpn scriptnek. Ha létezik, akkor nem csinál mást, csak biztos ami biztos újra hozzáadja a routingot. Ez pedig minden percben lefut.
Amennyiben nem kérünk levelet arról, amikor megszakadt a kapcsolat és a scriptnek újra kellett építenie a tunnelt, akkor használjuk a következő cron jobot:
# crontab -l # m h dom mon dow command # Check VPN connection and reconnect if there is an error. # * * * * * /sbin/ifconfig ppp0 > /dev/null 2>&1 ; if [ "$?" = 1 ]; then /etc/init.d/vpn_init.sh stop; sleep 2; /etc/init.d/vpn_init.sh start ; else /sbin/route add -net 10.0.5.0/24 gw 10.0.5.1; fi