Debian L2TP (over IPSec) + iPhone + OSX = working

W końcu usiadłem do konfiguracji VPN’a, w końcu ja mam iPhone’a, moja żona też ma iPhone’a. W końcu nadchodzi taki moment, aby wszystkie urządzenia gadały między sobą w sposób nie widoczny dla innych.

Przygotowania:

Ciekawy i dość konkretny artykuł znalazłem na stronie Linux L2TP/IPSec with iPhone and Mac OS/X clients, jednak niestety okazało się, że nie wszystko jest tak jak bym chciał. Tak czy owak polecam artykuł, bo to co jest poniżej to wariacja na jego temat.

Wszystko do momentu pobierania źródeł Strongswan’a jest jak w wyżej załączonym linku, potem małe schody z budowaniem deb’a. Ale po kolei.

Do poprawnego działania strgonswan co prawda nie potrzebuje rekompilacji, ale w 80% przypadków będziemy ze swoim telefonem lub laptopem znajdowali się za NAT’em a tu niestety trzeba deko zaingerować w strongswan. Debian nie posiada wkompilowanej obsługi NAT’a.

Po kolei co trzeba zrobić (część poniższego jest kopią z zlinkowanej strony):

/etc/ipsec.conf

config setup
        # crlcheckinterval=600
        # strictcrlpolicy=yes
        # cachecrls=yes
        nat_traversal=yes
        charonstart=yes
        plutostart=yes
conn L2TP
        authby=psk
        pfs=no
        rekey=no
        type=tunnel
        esp=aes128-sha1
        ike=aes128-sha-modp1024
        left=your.ip.goes.here
        leftnexthop=%defaultroute
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any
        rightsubnetwithin=0.0.0.0/0
        auto=add

/etc/ipsec.secrets

your.ip.goes.here %any:     PSK "yoursharedkeygoeshere"

Teraz już zaczynamy deko wariować ;-)
Pierwsze to sprawdzenie czy w naszym /etc/apt/sources.list są wpisy deb-src, pozwalające na ściąganie źródeł pakietów.

apt-get install build-essential fakeroot dpkg-dev devscripts
apt-get source strongswan
apt-get install libcurl4-openssl-dev
apt-get build-dep strongswan
cd strongswan-4.2.4/
dch -i

Za pomocą ulubionego edytora tekstowego, otwieramy plik debian/rules

#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.

# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1

export DH_OPTIONS

# this is a security-critical package, set all the options we can
export DEB_BUILD_HARDENING=1

CONFIGUREARGS := --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
    --libexecdir=/usr/lib \
    --enable-ldap --enable-curl \
    --enable-nonblocking --enable-thread \
    --enable-smartcard --enable-cisco-quirks \
    --with-default-pkcs11=/usr/lib/opensc-pkcs11.so \
    --enable-mediation --enable-medsrv --enable-medcli \
    --enable-openssl --enable-agent \
    --enable-eap-radius --enable-eap-identity --enable-eap-md5 \
    --enable-eap-gtc --enable-eap-aka --enable-eap-mschapv2 \
    --enable-sql \
    --disable-aes --disable-des --disable-fips-prf --disable-gmp \
    --disable-md5 --disable-sha1 --disable-sha2 \
    --enable-nm
 (...)

Do CONFIGUREARGS odpisujemy –enable-nat-transport, w celu włączenia obsługi NAT’a

dpkg-buildpackage -rfakeroot -uc -b

Powyższa komenda zbuduje nam pakiet debiana, jednak u mnie problem pojawił się ze źródłami libnm-glib-vpn, nie wiedzieć dlaczego ale instalator ich nie widział a pakiet zainstalowany był.

Nie ma czym się przejmować, linux to linux – nie zawsze trzeba zrobić wszystko „ładnie” – czasem wystarczy, tak aby działało:

pkg-config --cflags libnm-glib-vpn

U mnie output był taki:

-pthread -I/usr/include/libnm-glib -I/usr/include/NetworkManager -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include

Jeżeli pośpieszyliście się z dpkg-buildpackage to pewnie dostaliście informacje (o ile też problem występuje u Was) o sposobie poradzenia sobie z problemem, ja zrobiłem to prosto:

nm_CFLAGS="-pthread -I/usr/include/libnm-glib -I/usr/include/NetworkManager -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include"
export nm_CFLAGS
nm_LIBS="/usr/include/NetworkManager/"
export nm_LIBS

następnie, znany już:

dpkg-buildpackage -rfakeroot -uc -b
cd ../
ls -l |grep .deb
-rw-r--r-- 1 root root   188328 09-18 11:57 libstrongswan_4.3.2-1.4_amd64.deb
-rw-r--r-- 1 root root    70366 09-18 11:56 strongswan_4.3.2-1.4_all.deb
-rw-r--r-- 1 root root   349814 09-18 11:57 strongswan-ikev1_4.3.2-1.4_amd64.deb
-rw-r--r-- 1 root root   256576 09-18 11:57 strongswan-ikev2_4.3.2-1.4_amd64.deb
-rw-r--r-- 1 root root    45092 09-18 11:57 strongswan-nm_4.3.2-1.4_amd64.deb
-rw-r--r-- 1 root root   291452 09-18 11:57 strongswan-starter_4.3.2-1.4_amd64.deb

Tak to wygląda u mnie, u Was powinno podobnie.

Następnie instalujemy za pomocą dpkg -i pliki_deb

Jak to już jest zainstalowane to pierwszy etap za nami, teraz konfiguracja i instalacja xl2tpd, tu jest deko łatwiej:

    apt-get install xl2tpd

Konfigurujemy demona xl2tpd:
/etc/xl2tpd/xl2tpd.conf

    [global]
    debug network = yes
    debug tunnel = yes

    [lns default]
    ip range = 172.16.1.100-172.16.1.254
    local ip = 172.16.1.1
    require chap = yes
    refuse pap = yes
    require authentication = yes
    name = pretasoft.pl
    ppp debug = yes
    pppoptfile = /etc/ppp/options.xl2tpd
    length bit = yes

Ustawiamy hasło globalne:
/etc/xl2tpd/l2tp-secrets

    # Secrets for authenticating l2tp tunnels
    # us    them    secret
    # *     marko blah2
    # zeus      marko   blah
    # * *   interop
    *       *       haslo_globalne *

Opcje xl2tpd dla połączeń ppp
/etc/ppp/options.xl2tpd

    ipcp-accept-local
    ipcp-accept-remote
    ms-dns twoj_dns
    noccp
    auth
    crtscts
    idle 1800
    mtu 1410
    mru 1410
    nodefaultroute
    debug
    lock
    proxyarp
    connect-delay 5000

Plik chap z naszymi klientami VPN:
/etc/ppp/chap-secrets

    # Secrets for authentication using CHAP
    # client    server      secret              IP addresses
    client1 * haslo1 *
    client2 * haslo2 *

Na samym końcu:

    /etc/init.d/ipsec start
    /etc/init.d/xl2tpd start

Taka konfiguracja u mnie działa i na iPhone’ach oraz OSX’ie.

Jak ktoś zauważył błąd to proszę o komentarze, powodzenia z VPN’em.