L2TP/IPSec serveri kasutamine operatsioonisüsteemiga OpenBSD

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

L2TP/IPSec võimaldab suhelda kliendil üle turvalise kanali mingi nö keskusega. Seejuures tuleb arvestada, et L2TP/IPSec iseenesest ei paku paindlikke võimalusi õpetada kliendile ruutinguid (a la OpenVPN push route). Tavaliselt on kliendi seadistamisel selles mõttes kaks valikut

  • ainult seoses tunneliga kliendile omistatud ip ja selle /24 subnetiga seotud liiklus käib üle L2TP/IPSec kanali
  • kõik kliendi ja interneti vaheline liiklus käib üle L2TP/IPSec kanali

Mõisted

  • IPCP - Internet Protocol Configuration Protocol

Tööpõhimõte

Töötava süsteemi võrguskeem võiks olla selline

    priit - töökohaarvuti Linux                  mart - töökohaarvuti Windows 7
        _____                                       _____
       |     | Openswan IPSec                      |     | sisseehitatud IPSec/L2TP klient
       |     | xl2tp - 1701/udp                    |     | 
       |     | ppp                                 |     | 
       |_____|                                     |_____|
          |    eth0 - 10.204.62.115                   |    eth0 - 10.198.206.158
          |    ppp0 - 192.168.27.76                   |    PPP adapter imool - 192.168.27.77
   
                 ....         ....
 
                                               
                     internet

                        ..
  

                                  |  OpenBSD tulemüür, IPSec/L2TP server
     re0 - 10.204.6.67          __|__  
                               |     |
                               |     |   pppx0 - 192.168.27.75 -> .76
     re1 - 192.168.27.254      |_____|   pppx1 - 192.168.27.75 -> .77
     mac - 10:fe:ed:04:b6:29      |         
                                  | 
                                  |
     --|--------------------------|-------|----
       |                                  |
     __|__       192.168.27.0/24        __|__
    |     |                            |     |
    |_____| .2                         |_____| .3

    server 1                           server 2
  • pppx0, 1 jne nö ifconfig seadmed tekivad tulemüüri automaatselt
  • selleks, et server 1 ja server 2 saaksid pakette saata vastu l2tp vpn klientidele, peab tulemüür tunnistama vastavad klientide ip aadressid nö enda omaks, see saavutatakse arp proxy abil

Andmevahetus toimub läbi kolme kihi

  • avatud andmed liiguvad ppp liidestel (Linux ppp0, OpenBSD pppx0, Windows PPP adapter imool)
  • nö l2tp formaadis andmed liiguvad serveri ja töökohtade port 1701/udp vahel
  • IPSec krüptib üle avaliku võrgu liikuvaid l2tp andmeid (ehedad esp paketid või udp (port 4500) kapseldusega

Operatsioonisüsteemi ettevalmistamine

Asjassepuutuv pppx seade on /dev kataloogis vaikimisi olemas uuemal ajal, vanemates OpenBSD versioonides tuli öelda

# cd /dev
# ./MAKEDEV pppx

Ning seadistada pipex öeldes ning tehes vastava muudatuse ka /etc/sysctl.conf seadistusfailis

# sysctl -w net.pipex.enable=1

IPSec osa ettevalmistamine

See toimub nö tavalisel viisil, nt

# cat /etc/ipsec.conf
ike passive esp transport \
  proto udp from 10.204.6.67 to any port 1701 \
  main auth "hmac-sha1" enc "3des" group modp1024 \
  quick auth "hmac-sha1" enc "aes" \
  psk "saladu5parooL"

# chmod 0600 /etc/ipsec.conf

kus

  • ike - kasutatakse IKE v. 1 protokolli
  • transport - IPSec kasutamine toimub transport ja mitte tunnel režiimis (st krüptitakse IP paketi udp sisu ja mitte kogu ip paketti)
  • proto udp ... to any port 1701 - IPSec'i rakendatakse vaid port 1701/udp pakettidele, st mis on seotud L2TP andmevahetusega
  • psk - näidatakse nn psk parool, mida peab klient lisaks oma kasutajale-paroolile seadistama

Paketifiltri ettevalmistamine

Vaikimisi on VPN tunneli sees liiklus blokeeritud, see on oluline ka sellepärast, et kaks samaaegselt ühendatud VPN klienti ei saaks üksteise poole pöörduda

# cat /etc/pf/pf.block-all-default
..
# pppx
block in log on pppx label "ESpppx - vaikimisi"
block out log on pppx label "EVpppx - vaikimisi"
...

kus

  • pppx0, pppx1 jt liidesed kuuluvad gruppi pppx
  • in suund on vaikimisi blokeeritud, st vpn kasutaja ei saa saata pakette enda töökohaarvutist tulemüüri poole sisse
  • out suund on vaikimisi blokeeritud, st vpn kasutajale ei saa saata pakette tulemüüri poolelt välja

VPN tunneli ja tunneli sees oleva liikluse lubamine

# cat /etc/pf/pf.include-ipsec
# isakmpd votmevahetus
pass in quick on $if_public inet proto udp from any to $if_public port 500 \
  $udpopts label "JSpublic  from any to isakmpd"
pass out quick on $if_public inet proto udp from $if_public to any port 500 \
  $udpopts label "JVpublic from isakmpd to any udp 500"

# esp paketid
pass in quick on $if_public inet proto esp from any to $if_public label "JSpublic from any to esp"
pass out quick on $if_public inet proto esp from $if_public to any label "JVpublic from esp to any"

# udp kapseldatud esp paketid
pass in quick on $if_public inet proto udp from any to $if_public port 4500 \
  $udpopts label "JSpublic from any ipsec"

pass in quick on pppx inet from { 192.168.27.76, 192.168.27.77, 192.168.27.78 } \
  to 192.168.27/24 tag  FROM_NPPPD 
pass out quick on $if_kohtvork tagged FROM_NPPPD

kus

  • 500/udp, 4500/udp ja esp pakettide src või dst ip aadress on tulemüüri enda välise võrguliidese aadress ($if_public)
  • TODO: enc0 peal toimub vaikimisi skip, see ei pruugi olla hea
  • näidatud 192.168.27.76-192.168.27.78 aadressidelt lubatakse tulemüüri sisse pöörduda; vastavad paketid saavad ka kohtvõrku võrku välja
  • kohtvõrgust saab tõenäoliselt küll tulemüüri sisse pöörduda, aga kohtvõrgust ei saa pöörduda vpn kliendi poole kasutades tema vpn ip aadressi

npppd serveri seadistamine

npppd serveri seadistamine

Seadistusfail man npppd.conf

# cat /etc/npppd/npppd.conf
authentication LOCAL type local {
  users-file "/etc/npppd/npppd-users"
}

tunnel L2TP_ipv4 protocol l2tp {
  listen on 10.204.6.67
  mppe no
}

ipcp IPCP {
  pool-address 192.168.27.76-192.168.27.78 for dynamic
  # pool-address 192.168.28.76-192.168.28.78 for dynamic
}

interface pppx0 address 192.168.27.75 ipcp IPCP
bind tunnel from L2TP_ipv4 authenticated by LOCAL to pppx0

kus

mppe no

vastasel korral toimub operatsioonisüsteemi krahh (vähemalt kunagi toimus)

integer divide fault trap, code=0
Stopped at      rc4_keysetup+0x60:      divl    0x10(%ebp),%eax
ddb>
  • imelik, et bind real on interface nimeks pppx0 kuigi reaalselt võivad esineda kasutamise käigus ka pppx1 jt seadmed

Kasutajate kirjeldamine

Seadistusfailis man npppd-users on kirjeldatud kasutajad, nt selliselt seostatakse iga kasutajaga üks aadress, seejuures saab kasutaja samaaegselt kasutada vaid ühte VPN tunnelit

# cat /etc/npppd/npppd-users
priit:\
  :password=kasutajaparool:\
  :framed-ip-address=192.168.27.76:\
  :framed-ip-network=255.255.255.0:

mart:\
  :password=kasutajaparool:\
  :framed-ip-address=192.168.27.77:\
  :framed-ip-network=255.255.255.0:

Kui kasutaja soovib töötada mitmest töökohaarvutist ja igas hoida samaaegselt töös VPN tunnelit, siis tuleb seadistusfailist lihtsalt jätta ära kasutaja sektsiooni juurest kaks viimast rida (ning järelejäänud viimast rida mitte lõpetada \ märgiga). Sellisel juhul omistatakse kasutajale mõne parasjagu kasutamata aadress pool-address vahemikust. Tulemus paistab selline

# npppctl session brief 
Ppp Id     Assigned IPv4   Username             Proto Tunnel From
---------- --------------- -------------------- ----- -------------------------
       21 192.168.27.77   priit                 L2TP  imool.auul:1701
       22 192.168.27.78   priit                 L2TP  imool.auul:1701

ARP proxy

Selleks, et server 1 ja server 2 saaksid pakette saata vastu l2tp vpn klientidele, peab tulemüür tunnistama vastavad klientide ip aadressid nö enda omaks, see saavutatakse arp proxy abil. Olgu tulemüüri kohtvõrgu poolse võrguseadme re1 mac aadress 10:fe:ed:04:b6:29

# ifconfig re1                                                                                                                                                                    
re1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
       lladdr 10:fe:ed:04:b6:29
       description: traadiga kohtvork
       priority: 0
       media: Ethernet autoselect (1000baseT full-duplex)
       status: active
       inet 192.168.27.254 netmask 0xffffff00 broadcast 192.168.27.255
       inet6 fe80::12fe:edff:fe04:b629%re1 prefixlen 64 scopeid 0x2

sel juhul tuleb öelda

# arp -s 192.168.27.76 10:fe:ed:04:b6:29 permanent pub
# arp -s 192.168.27.77 10:fe:ed:04:b6:29 permanent pub

ja tulemusena tekib

# arp -an | grep 10:fe:ed:04:b6:29 
? (192.168.27.76) at 10:fe:ed:04:b6:29 on re1 permanent static published (proxy only)
? (192.168.27.77) at 10:fe:ed:04:b6:29 on re1 permanent static published (proxy only)

Käivitamine

IPSec/L2TP teenuse pakkumiseks tuleb käivitada kolm komponenti

  • IPSec
  • L2TP
  • ppp

OpenBSD puhul realiseerib kahte viimast npppd tarkvara.

Paketifilter

# pfctl -f /etc/pf.conf

IPSec

# isakmpd -vdK
# ipsecctl -f /etc/ipsec.conf

npppd

# npppd -d

Kasutamine

Seejärel tuleb pöörudada IPSec/L2TP kliendiga ning tulemusena peaks saama nt pingida pppx0 seadmele omistatud aadressi 192.168.27.75.

Kui klient on ühendunud, tekib OpenBSD arvutisse pppx võrguseade, nt

# ifconfig pppx0 
pppx0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1360
       description: priit
       priority: 0
       inet 192.168.27.75 --> 192.168.27.76 netmask 0xffffffff

npppd haldamine

  • Töötavate tunnelite omaduste küsimine
# npppctl session all
Ppp Id = 1
         Ppp Id                  : 1
         Username                : priit
         Realm Name              : LOCAL
         Concentrated Interface  : pppx0
         Assigned IPv4 Address   : 192.168.27.76
         Tunnel Protocol         : L2TP
         Tunnel From             : 84-50-137-232-dsl.rkv.auul.ee:1701
         Start Time              : 2012/11/18 13:35:47
         Elapsed Time            : 1704 sec (28 minutes)
         Input Bytes             : 69081 (67.5 KB)
         Input Packets           : 654
         Input Errors            : 1 (0.2%)
         Output Bytes            : 29345 (28.7 KB)
         Output Packets          : 251
         Output Errors           : 0 (0.0%)
# npppctl session brief
Ppp Id     Assigned IPv4   Username             Proto Tunnel From
---------- --------------- -------------------- ----- -------------------------
         1 192.168.27.76 imre                 L2TP  84-50-137-232-dsl.rkv.auul.ee:1701
  • Tundub, et kasutajate failis muudatuse kehtestamiseks ei ole vaja midagi teha
  • Seadistusfailide muudatuste kehtestamiseks sobib öelda
# /etc/rc.d/npppd reload

Debugimine

Töötaval juhul on erinevatel võrguseadmetel sarnane liiklus. pppx0 seadmel on avatud sisuga icmp paketid

# tcpdump -ni pppx0 
tcpdump: listening on pppx0, link-type LOOP
19:52:40.957913 192.168.27.76 > 192.168.27.2: icmp: echo request (DF)
19:52:40.958615 192.168.27.3 > 192.168.27.76: icmp: echo reply
19:52:41.958743 192.168.27.76 > 192.168.27.2: icmp: echo request (DF)
19:52:41.959292 192.168.27.3 > 192.168.27.76: icmp: echo reply

enc0 seadmel on näha krüptimisele minev või krüptimiselt tulev l2tp liiklus

# tcpdump -ni enc0  
tcpdump: listening on enc0, link-type ENC
19:53:19.014476 (authentic,confidential): SPI 0x0ac16260: 10.198.206.158.1701 > 10.204.6.67.1701: \
  l2tp:[L](4/29985)[hdlc|][|l2tp] (DF)
19:53:19.014892 (authentic,confidential): SPI 0x30f571c6: 10.204.6.67.1701 > 10.198.206.158.1701: \
  l2tp:[LS](4164/6058)Ns=49,Nr=65535[hdlc|][|l2tp]
19:53:20.015964 (authentic,confidential): SPI 0x0ac16260: 10.198.206.158.1701 > 10.204.6.67.1701: \
  l2tp:[L](4/29985)[hdlc|][|l2tp] (DF)
19:53:20.016329 (authentic,confidential): SPI 0x30f571c6: 10.204.6.67.1701 > 10.198.206.158.1701: \
 l2tp:[LS](4164/6058)Ns=50,Nr=65535[hdlc|][|l2tp]

re0 seadmel on näha udp kapseldusega esp paketid

# tcpdump -ni re0
tcpdump: listening on re0, link-type EN10MB
19:54:24.106424 10.198.206.158.62576 > 10.204.6.67.4500:udpencap: esp 10.198.206.158 > 10.204.6.67 \
  spi 0x0ac16260 seq 332 len 148 (DF)
19:54:24.106857 10.204.6.67.4500 > 10.198.206.158.62576:udpencap: esp 10.204.6.67 > 10.198.206.158 \
  spi 0x30f571c6 seq 330 len 148
19:54:24.730180 10.198.206.158.62576 > 10.204.6.67.4500:udpencap: esp 10.198.206.158 > 10.204.6.67 \
  spi 0x0ac16260 seq 333 len 68 (DF)
19:54:24.730419 10.204.6.67.4500 > 10.198.206.158.62576:udpencap: esp 10.204.6.67 > 10.198.206.158 \
  spi 0x30f571c6 seq 331 len 68

IPSec töötamise kontroll

IPSec kanal võib põhjusel või teisel vahel ära lõppeda, nt selline cron töö võib siis olla abiks kord minutis käivitada

# cat /root/bin/if-ipsec-is-running.sh                                                                                       
#!/bin/ksh

if ! test -f /tmp/ipsec_is_running.lock; then

  touch /tmp/ipsec_is_running.lock
 
  if ! pgrep -q isakmpd || ! pgrep -q npppd; then
    pkill isakmpd; sleep 5
    pkill npppd; sleep 5
    ipsecctl -F; sleep 5
    isakmpd -vK
    ipsecctl -f /etc/ipsec.conf
    sleep 5
    /etc/rc.d/npppd start
  fi

  rm /tmp/ipsec_is_running.lock

fi

OpenBSD IPSec teenus asub ise NAT tulemüüri taga

Kui OpenBSD IPSec teenus asub ise NAT tulemüüri taga, siis praktiliselt kõik jääb nii nagu tekis kirjeldatud v.a.

  • /etc/npppd/npppd.conf failis tuleb kasutada ip aadressina OpenBSD enda võrguliidese ip aadressi
  • /etc/ipsec.conf failis tuleb kasutada OpenBSD tulemüürile vastavat avalikku ip aadressi (st mida NAT seade teisendab)
   ____                      ____                       ____
  |    |                    |    |                     |    |
  |    |----- internet -----|    |------ sisevork -----|    |
  |____|                    |____|                     |____|

Win 7 klient             misc nat purk               OpenBSD IPSec

kus

Kasulikud lisamaterjalid