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