L2TP IPSec VPN server met FreeBSD (doel: veilig WLAN)

Pagina: 1
Acties:
  • 200 views sinds 30-01-2008
  • Reageer

  • SvMp
  • Registratie: September 2000
  • Niet online
Bij mij thuis wil ik m'n laptop en eventuele draadloze gadgets laten communiceren via een WLAN. Ik vind het alleen wat tricky met een heel netwerk met fileserver waar persoonlijke dingen op staan midden in een wijk met veel flats en slimme studenten. Een lange zoektocht op GoT en Google levert echter geen enkele volledig waterdichte oplossing op. Een VPN met IPSec is echter een serieuze oplossing waarmee ik gerust kan slapen zonder elke keer paranoide m'n accesspoint uit te schakelen :)

Ik draai FreeBSD op mijn servers. Voor Linux zijn er L2TP IPSec VPN howto's genoeg, voor FreeBSD is het lastiger, of beter gezegd: er is niks te vinden. Wel zijn er howto's over andere VPN's, een tunnel tussen 2 FreeBSD machines met IPSec en een howto over een IPSec tunnel zonder L2TP waarvoor je met Windows heel veel moet tweaken. Met Windows Mobile clients wordt dat te lastig..

Ik heb de volgende documentatie gebruikt om tot een FreeBSD oplossing te komen:
- http://www.jacco2.dds.nl/networking/index.html (op Linux gericht maar zeer bruikbaar, IPSec gedeelte is in FreeBSD echter compleet anders)
- http://sahara.lbl.gov/~tham/wifi-ipsec.txt (FreeBSD IPSec tunnel met nasty tweaks onder Windows)
- http://asherah.dyndns.org/~josh/ipsec-howto.txt (FreeBSD IPSec tunnel met nasty tweaks onder Windows)

Mijn doel: Een L2TP IPSec VPN oplossing onder FreeBSD die volledig ondersteund wordt door moderne Windows versies zonder tweaks of thirth party clients waaronder Windows XP en Windows Mobile 2003. IPSec via pre shared keys.

Dit is na 2 nachten klooien gelukt. In dit topic beschrijf ik eerst wat ik heb gedaan en daarna vragen.
Doel: Informatie geven hoe je L2TP IPsec VPN onder FreeBSD voor elkaar krijgt want die info is er nauwelijks.
Minstens zo belangrijk doel: Ruggespraak. Ik ben gevorderd FreeBSD-er maar van IPSec heb ik weinig kaas gegeten. Ik vraag me af of het niet nog beter kan, de configuratie is nogal complex, er zijn zoveel instellingen. Graag feedback.

Dit heb ik gedaan:
Stap 1. Hardware
Ik heb er voor gekozen om mijn internet server/router te gebruiken als VPN-server voor mijn draadloze netwerk. Ik heb een 3e netwerkkaart geinstalleerd met het vaste IP 172.20.100.1
De andere twee netwerkkaarten zijn voor mijn ADSL-modem en interne bedrade LAN (vast IP 192.168.100.250). Accesspoint aan de netwerkkaart gehangen, accesspoint deelt via DHCP IP's uit vanaf 172.20.100.100 aan WLAN-adapters met de juiste WPA-PSK en MAC-adres. Een WLAN-adapter zit in een geisoleerd 172.20.100.x-netwerk en heeft de mogelijkheid om verbinding te maken met de server via 172.20.100.1. Op dat IP is alles dichtgesprijkerd op de benodigde services voor IPSec na. Iemand die het WLAN kraakt kan dus in principe nog niets en dat is nou net de bedoeling van deze setup.

Stap 2. Kernel
Kernel gebakken met daarin PPP en IPSec
code:
1
2
3
4
pseudo-device   ppp     1       # Kernel PPP
options         IPSEC                   #IP security
options         IPSEC_ESP               #IP security (crypto; define w/ IPSEC)
options         IPSEC_DEBUG             #debug for IP security


Niet vergeten te rebooten ;)

Stap 3. IPSec configuratie
In /etc/rc.conf IPSec activeren:
code:
1
2
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"


Rules in /etc/ipsec.conf:
code:
1
2
3
4
flush;
spdflush;
spdadd 172.20.100.0/24 0.0.0.0/0 any -P in ipsec esp/transport//unique;
spdadd 0.0.0.0/0 172.20.100.0/24 any -P out ipsec esp/transport//unique;


Activeren zonder reboot: "setkey -F", "setkey -f /etc/ipsec.conf".

Stap 4. Racoon
Racoon installeren via port /usr/ports/security/racoon/

Aangezien deze setup via shared keys werkt, hebben we een /usr/local/etc/racoon/psk.txt nodig:
code:
1
172.20.100.100  geheimesleutelenzo


Niet vergeten: "chmod 600 psk.txt" om er voor te zorgen dat gewone gebruikers niet de sleutels kunnen zien.

Alleen het eerste IP in de range is hier gedefinieerd.

Nu het (m.i.) meest ingewikkelde stuk van de configuratie, racoon.conf
Default config met wat veranderingen aan de hand van de howto's:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $

# "path" must be placed before it should be used.
# You can overwrite which you defined, but it should not use due to confusing.
path include "/usr/local/etc/racoon" ;
#include "remote.conf" ;

# search this file for pre_shared_key with various ID key.
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;

# racoon will look for certificate file in the directory,
# if the certificate/certificate request payload is received.
path certificate "/usr/local/etc/cert" ;

# "log" specifies logging level.  It is followed by either "notify", "debug"
# or "debug2".
log notify;

# "padding" defines some parameter of padding.  You should not touch these.
padding
{
    maximum_length 20;  # maximum padding length.
    randomize off;      # enable randomize length.
    strict_check off;   # enable strict check.
    exclusive_tail off; # extract last one octet.
}

# if no listen directive is specified, racoon will listen to all
# available interface addresses.
listen
{

   isakmp 172.20.100.1;

#   #isakmp ::1 [7000];
#   #isakmp 202.249.11.124 [500];
#   #admin [7002];      # administrative's port by kmpstat.
#   #strict_address;    # required all addresses must be bound.
}

# Specification of default various timer.
timer
{
    # These value can be changed per remote node.
    counter 5;      # maximum trying count to send.
    interval 20 sec;    # maximum interval to resend.
    persend 1;      # the number of packets per a send.

    # timer for waiting to complete each phase.
    phase1 30 sec;
    phase2 15 sec;
}

remote anonymous
{
        #exchange_mode main,aggressive;
        exchange_mode aggressive,main;
        doi ipsec_doi;
        situation identity_only;

        #we not need an identifier, it is set automatically
        #my_identifier address;
        #my_identifier address "192.168.0.99";
        ##peers_identifier address "192.168.0.1";
        #certificate_type x509 "mycert" "mypriv";

        nonce_size 16;
        lifetime time 1 min;    # sec,min,hour
#        lifetime byte 5 MB;     # B,KB,GB
        initial_contact on;
        support_mip6 on;
        proposal_check obey;    # obey, strict or claim

        #very important. We need 3DES for encryption and MD5 as checksum

        proposal {
                encryption_algorithm 3des;
                hash_algorithm md5;
                authentication_method pre_shared_key ;
                dh_group 2 ;
        }
}

sainfo anonymous
{
        pfs_group 1;
        lifetime time 36000 sec;
#        lifetime byte 50000 KB;
        encryption_algorithm 3des,des,cast128,blowfish ;
        authentication_algorithm hmac_sha1,hmac_md5;
        compression_algorithm deflate ;
}


Met "racoon -F" kun je racoon starten in een terminal en meekijken met wat er gebeurt.

Stap 5. L2TP
L2TPd installeren via port /usr/ports/net/l2tpd

De configuratiefiles staan in /usr/local/etc/l2tp. l2tp-secrets is niet nodig omdat user-authenticatie via ppp gebeurt en niet via de L2TPd. l2tpd.conf heb ik gewoon overgenomen van de Linux L2TP/IPSec howto en voor de volledigheid heb ik de default-opties als commentaar laten staan. Ik heb gekozen voor de IP-range 192.168.101.x voor de L2TP/PPP-tunnels.

l2tpd.conf:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
;
; Sample l2tpd configuration file
;
; This example file should give you some idea of how the options for l2tpd
; should work.  The best place to look for a list of all options is in
; the source code itself, until I have the time to write better documetation :)
; Specifically, the file "file.c" contains a list of commands at the end.
;
; You most definitely don't have to spell out everything as it is done here
;
[global]                                                                ; Global parameters:
;address = 0.0.0.0                                              ; * Bind to IP address
;port = 1701

[lns default]                                                   ; Our fallthrough LNS definition

; exclusive = no                                                ; * Only permit one tunnel per host

ip range = 192.168.101.1-192.168.101.30 ; * Allocate from this IP range

; no ip range = 192.168.0.3-192.168.0.9 ; * Except these hosts
; ip range = 192.168.0.5                                ; * But this one is okay
; ip range = lac1-lac2                                  ; * And anything from lac1 to lac2's IP
;lac = 192.168.100.1-192.168.100.253            ; * These can connect as LAC's
; no lac = untrusted.marko.net                  ; * This guy can't connect
; hidden bit = no                                               ; * Use hidden AVP's?

local ip = 192.168.101.250                              ; * Our local IP to use

length bit = yes                                                ; * Use length bit in payload?

require chap = yes                                      ; * Require CHAP auth. by peer
refuse pap = yes                                                ; * Refuse PAP authentication

; refuse chap = no                                              ; * Refuse CHAP authentication
; refuse authentication = no                    ; * Refuse authentication altogether

require authentication = yes                    ; * Require peer to authenticate

; unix authentication = no                              ; * Use /etc/passwd for auth.

name = freebsd                                          ; * Report this as our hostname


ppp debug = yes                                         ; * Turn on PPP debugging
pppoptfile = /etc/ppp/options.l2tpd     ; * ppp options file


l2tpd maakt de tunnel mbv. ppp. Hiervoor moeten 2 eenvoudige configfiles worden ingesteld. Als eerste /etc/ppp/options.l2tpd die al wordt genoemd in de configfile van l2tpd.

/etc/ppp/options.l2tpd:
code:
1
require-chap


1 regeltje: CHAP eisen om te voorkomen dat clients zich onveilig via PAP aanmelden.

Tot slot nog een bestand met gebruikersnamen en wachtwoorden voor ppp-chap, /etc/ppp/chap-secrets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# $FreeBSD: src/share/examples/pppd/chap-secrets.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
#
# Example for /etc/ppp/chap-secrets file.
#
# This file should be owned by root and not readable or
# writable by any other user.
#
# Dialin format: <remote name> <our name> <password> <allowed IP addresses>
#
#joe    server  password        192.168.0.0/24 192.168.2.2
#lisa   server  l1z4            * !192.168.0.1
#mike   server  secret          *
#luser  server  nopass          -
#
# Dialout format: <our name> <server name> <password>
#
#jane   isp     password
gebruiker   *       wachtwoord           192.168.101.1


Met "l2tpd -D" kun je op de terminal meekijken met wat l2tpd aan het doen is.
Racoon kan via een rc-script automatisch gestart worden. Voor l2tpd ontbreekt een rc-script maar dat is zo te maken.

Met Windows XP kun je verbinding maken door een verbinding toe te voegen, VPN, L2TP IPSec, vergeet de shared key van de IPSec verbinding niet. Aanmelden met gebruikersnaam en wachtwoord die je in chap-secrets hebt gezet. In de Linux howto staat uitgebreid hoe je Windows XP instelt.
Als de server niet lijkt te reageren, kun je het beste naar racoon kijken. Als de computer bezig is met controleren van wachtwood en gebruikersnaam ben je al een stuk verder en als je verbinding krijgt dan lijkt het al aardig te werken :)

OK mijn vragen.

Ten eerste had ik in het begin twee problemen nadat ik het voor elkaar had om verbinding te krijgen. Ik heb ze opgelost maar heb er niet echt een heldere verklaring voor.

Probleem 1: Ik kon alleen de IP's in de server-machine pingen en het internet op, maar ik kon de machines in mijn eigen netwerk niet pingen. Aanvankelijk gebruikte ik in de tunnel de reeks 192.168.100.x, dezelfde reeks als het interne netwerk. Mijn interne IP was 192.168.100.252, de toegewezen IP's door PPP 192.168.100.50-192.168.100.70. Ik dacht dat dit wel zou werken, maar nee, ik kwam niet op de andere PC's in het netwerk, zoals 192.168.100.1. Gebruik ik de reeks 192.168.101.x, werkt het wel, althans ik kan de interne machines netjes pingen, ik kan er mee ftp-en, imap via een server in het lokale netwerk werkt goed (Samba werkt niet, maar dat schijnt iets ingewikkelder te zijn) en ik kan internet op.
Maar ik begrijp eigenlijk niet waarom. Sterker nog, ik vind het vreemd dat ik met 192.168.101.x alle 192.168.100.x machines bereik, maar als ik ppp binnen het bereik 192.168.100.x instel, dan lijk ik twee gescheiden 192.168.100.x netwerken te hebben. Raakt TCP/IP in de war als je 2 adapters in hetzelfde net hebt zitten? Ik denk dat ik een stukje TCP/IP kennis mis die dit verklaart.

Probleem 2: Als ik de VPN-verbinding vanuit Windows XP verbreek en ik maak daarna opnieuw verbinding, dan reageert de server niet meer. Als ik echter Racoon stop en weer start, dan kan ik weer 1 maal verbinding maken. Ik had toen in /etc/ipsec.conf staan:
code:
1
2
spdadd 172.20.100.100/32 0.0.0.0/0 any -P in ipsec esp/transport//unique;
spdadd 0.0.0.0/0 172.20.100.100/32 any -P out ipsec esp/transport//unique;


Alleen het IP van m'n laptop dus. "172.20.100.100/32" veranderd in "172.20.100.0/24" en ineens is dit probleem verholpen! Prachtig natuurlijk, maar hoe kan dat? Mijn client-machine, laptop met WLAN-adapter, heeft al die tijd gewoon het IP 192.168.100.100 gehad en nooit een andere.

Nog wat andere vragen:
- Zijn er op of aanmerkingen over de configfile van Racoon? Er zitten zoveel opties in dat er vast wel zaken voor verbetering vatbaar zijn. Zijn er potentiele lekken? Kan het veiliger/beter?
- Wie heeft suggesties voor het grondig testen van de verbinding of er werkelijk sprake is van encryptie?
- In hoeverre is deze setup 100% waterdicht? Stel iemand breekt in het WLAN en heeft toegang tot het 172.20.100.x-netwerk. Kan het VPN dan gekraakt worden?
- In hoeverre is een dergelijke setup beveiligd tegen man-in-the-middle attacks? Kan iemand de PSK en ppp gebruikersnamen/wachtwoorden achterhalen door een identiek-geconfigureerd accesspoint + server neer te zetten?


Nog nader te bestuderen:
- Er is ook een racoon2 in ports/security/racoon2. Wat zijn de verschillen?
- ppp is nog slechts geconfigureerd om 1 machine toegang te geven, moet nog verder bewerkt worden.
- Configuratie testen met grotere aantallen clients (ik heb slechts 1 machine met WLAN-adapter).
- Verbindingen analyseren, is overal de gewenste encryptie aanwezig?
- Een ander onderdeel van IPSec is AH. Hoe te implementeren?

[ Voor 3% gewijzigd door SvMp op 03-04-2005 14:43 . Reden: URL fout ]


  • JackBol
  • Registratie: Maart 2000
  • Niet online

JackBol

Security is not an option!

Ik vind het een lang verhaal, en hub geen tijd om de kern eruit te halen, maar op de volgende vraag heb ik wel een antwoord voor je:

- Een ander onderdeel van IPSec is AH. Hoe te implementeren?
Je kan bij IPSec voor 2 encryptie methodes kiezen, ESP en AH.
Het is een of/of verhaal. Tegenwoordig gebruikt iedereen ESP omdat deze de payload encrypt en een nieuwe header toevoegt. In principe een soort extra tunnel dus.
Als je iets geavanceerder als p2p met je IPSec pakketjes om wilt gaan heb is het dus verstandig bij ESP te blijven.

Overigens is het een misverstand dat WLAN tegenwoordig niet goed te beveiligen is. WPA encryptie is net zo sterk als IPSec encryptie. Daarnaast is het gebruik van een PSK echt een security issue. Als je echt zo veilig wilt zijn als je pretendeert zou je een radius server op moeten zetten die authenticeert met certificaten. (of OTP)

Opbrengst van mijn Tibber Homevolt met externe kWh meter. | Opbrengst van mijn Tibber Homevolt volgens de Tibber Data API.


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
de optie /32 geeft aan dat de regel alleen voor dat specifieke ip geldt... /32 is gelijk aan subnet masker 255.255.255.255 (Ip is mischien nog niet weer vrijgegeven door DHCP dus krijg je een ander en dan werkt je rule ineens niet meer)
/24 is gelijk aan 255.255.255.0
met het subnet masker geef je aan waar de scheiding ligt tussen "Network ID" en "Host ID"
in jou geval is je "Network ID" 172.20.100 en je "Host ID" is het laatste getal van je ip nummer.
Dit betekend dat je dus maximaal 254 ip's in dat subnet kan hebben.

hmm mischien wat onduidelijk... even een schematje opstellen je moet het namelijk binair zien om te begrijpen...

dus je ip 172.20.100.100 is binair:
10101100 00010100 01100100 01100100
|-------------------------------------------||--------------| = /24 dus 3x8 bitjes is je network id
Network ID Host ID
|-----------------------------------------------------------| = /32 dus 4x8 bitjes is je network id
Network ID

mischien is het zo duidelijker...
Verhaaltje subnetten is weer beetje lang maar ga er eens naar zoeken op internet dan zal je het zeker vinden daar zit namelijk de oplossing voor je probleem...

[ Voor 20% gewijzigd door Plopeye op 01-04-2005 09:06 ]

Unix is user friendly, it's only selective about his friends.....


  • SvMp
  • Registratie: September 2000
  • Niet online
Dirk-Jan schreef op vrijdag 01 april 2005 @ 08:31:
- Een ander onderdeel van IPSec is AH. Hoe te implementeren?
Je kan bij IPSec voor 2 encryptie methodes kiezen, ESP en AH.
Het is een of/of verhaal. Tegenwoordig gebruikt iedereen ESP omdat deze de payload encrypt en een nieuwe header toevoegt. In principe een soort extra tunnel dus.
Als je iets geavanceerder als p2p met je IPSec pakketjes om wilt gaan heb is het dus verstandig bij ESP te blijven.
Dit klopt inderdaad, zoals ik na heb kunnen lezen met Google. Dan zit dat dus wel goed.
Overigens is het een misverstand dat WLAN tegenwoordig niet goed te beveiligen is. WPA encryptie is net zo sterk als IPSec encryptie.
Als je zoekt via Google naar WLAN beveiliging dan wordt op elke site gesteld dat WLAN niet 100% te beveiligen is, ook niet met WPA. Zelfs documentatie van fabrikanten beweert dat.
Daarnaast is het gebruik van een PSK echt een security issue. Als je echt zo veilig wilt zijn als je pretendeert zou je een radius server op moeten zetten die authenticeert met certificaten. (of OTP)
Ik heb begrepen dat er geen enkel verschil is met PSK's wat betreft kwaliteit van beveiliging t.o.v. certificaten, behalve dan dat een PSK in theorie te onthouden is door mensen i.t.t. een certificaat, mits je keys lang genoeg zijn.

  • SvMp
  • Registratie: September 2000
  • Niet online
Plopeye z'n verhaal kende ik natuurlijk allang, alleen ik vraag mij af waarom het in mij geval een oplossing lijkt te bieden. Ik zit namelijk steeds met hetzelfde IP.

Overigens werkt het niet niet helemaal. Als ik de PCMCIA kaart uit m'n laptop trek terwijl er een VPN-verbinding open staat, en daarna stop ik de kaart er weer in, dan reageert de server niet bij het opnieuw maken van verbinding totdat ik Racoon opnieuw start :( Het hoort niet mogelijk te zijn om invloed uit te oefenen op het functioneren van de server door te gaan klooien met de cliënt.

Verwijderd

Hierbij een aantal opmerkingen:
  • Zou je niet beter OpenBSD voor een VPN gebruiken in plaats van FreeBSD? :-)
  • Wat jij nasty tweaks noemt zijn handmatige IPsec policy rules. Inderdaad bijzonder complex, om gek van te worden, maar blijkbaar is het je gelukt om ze aan de praat te krijgen. Wanneer je de enige gebruiker van het VPN bent is dit natuurlijk geen probleem. Maar wanneer ook newbies ze moeten gaan instellen wordt het een ander verhaal.
  • Je hoeft geen handmatige IPsec rules in te stellen. Er is een Windows IPSEC.EXE tool van Marcus Mueller (http://vpn.ebootis.de). De configuratie daarvan (een textfile) lijkt weliswaar veel op Openswan maar dat zou geen verschil moeten uitmaken: je zou er gewoon mee verbinding moeten kunnen maken naar een FreeBSD server
  • Had je deze pagina (http://www.funknet.org/doc/tunnel/l2tp.xml ) wel gelezen? Ook hier wordt Linux gebruikt maar met racoon in plaats van Openswan. Dus er zou geen verschil moeten zijn met FreeBSD.
  • Op bovenstaande pagina wordt spdadd iets anders aangeroepen dan bij jou. De IPsec verbinding wordt beperkt tot UDP 1701 (dus L2TP). Maar jouw IPsec policy is geldig voor alle verkeer tussen client en server. Misschien dat je daardoor die problemen hebt met het ophangen van de verbinding? Mijn ervaring met Openswan was dat ik een (left|right)protoport=17/1701 parameter moest gebruiken want anders weigerde de Windows client de verbinding.
  • Stond IP forwarding wel aan? Ik weet niet hoe dat bij FreeBSD moet maar als het uit staat is het niet zo gek dat er geen pakketjes werden geforward naar je interne netwerk. Let er wel op dat er geen pakketjes geforward mogen worden wanneer onverhoopt je firewall of IPsec down is.
  • CHAP wordt niet gebruikt om "te voorkomen dat clients zich onveilig via PAP aanmelden". Zo veilig is CHAP namelijk ook weer niet. CHAP wordt door mij alleen maar geadviseerd om een melding op de Windows client te voorkomen (iets in de trant dat "het wachtwoord onversleuteld gebruikt wordt"). IPsec versleutelt het verkeer al. Het maakt dan niet zoveel meer uit of je dan PAP, CHAP of MS-CHAP gebruikt.
  • Heeft FreeBSD aparte interfaces voor niet-versleuteld verkeer zoals OpenBSD en Openswan-KLIPS? Zo ja, dan hoef je de L2TP daemon niet aan het externe interface te hangen. Want:
  • Als je firewall er uit knalt is je L2TP daemon voor iedereen op het externe netwerk toegankelijk. Beetje link.
  • Voordat je de boel in gebruik gaat nemen: altijd eerst een scan doen (nmap of zo). De enige poorten die open zouden moeten staan zijn UDP 500 en eventueel UDP 4500. En IP protocol 50 (ESP) moet ook doorgelaten worden.
Hopelijk helpt dit.
Pagina: 1