L2TP/IPSec serveri kasutamine operatsioonisüsteemiga OpenBSD
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 (Microsoft Point-to-Point Encryption) - nagu http://marc.info/?l=openbsd-misc&m=134863847304600&w=2 aadressil kirjeldatakse, aitab crashi vastu kasutada tunneli seadistuses rida
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
- nat suunab OpenBSD peale 500/udp ja 4500/udp paketid
- l2tp 1703/udp paketid liiguvad ipsec kanali sees
- mingeid esp, ah jms protokolli pakette kasutusel ei ole, kapseldatakse kõik udp sisse
- http://www.auul.pri.ee/wiki/L2TP/IPSec_kliendi_kasutamine_operatsioonis%C3%BCsteemiga_Windows_7#M.C3.A4rkused
2024 aasta märkused
Tundub, et alates OpenBSD v. 5.9 on proxy-arp käitumine muutunud, üks viis uues olukorras toimetada on proxy-arp kasutamisest loobuda. St kohtvõrku suunduvate pakettide juures rakendada src-nat.
netstat -rnf inet
Kasulikud lisamaterjalid
Kasulikud lisamaterjalid
- FreeRADIUS kasutamine
- Võrk ja andmeside -> L2TP/IPSec
- http://www.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/npppd/Attic/HOWTO_PIPEX_NPPPD.txt?rev=1.8;content-type=text%2Fplain;only_with_tag=MAIN
- http://undeadly.org/cgi?action=article&sid=20120427125048
- http://marc.info/?l=openbsd-misc&m=132693652005222&w=2
- http://wiki.witopia.net/wiki/Installing_personalVPN-L2TP_on_Windows_7
- https://www.youtube.com/watch?v=iCS7X2JAEi0