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
Niet vergeten te rebooten
Stap 3. IPSec configuratie
In /etc/rc.conf IPSec activeren:
Rules in /etc/ipsec.conf:
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:
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:
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:
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:
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:
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:
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?
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 ]