Warning: Memcache::addserver() expects parameter 2 to be long, string given in /usr/home/rpc/domains/rpc.one.pl/public_html/libraries/joomla/cache/storage/memcache.php on line 84 l2tp czyli VPN zestawiony na podstawie xl2tpd + ipsec racoon na certyfikatach - 8.09.1
 
 
l2tp czyli VPN zestawiony na podstawie xl2tpd + ipsec racoon na certyfikatach - 8.09.1 Drukuj Email
Wpisany przez rpc   
poniedziałek, 02 listopada 2009 11:11

l2tp czyli VPN zestawiony na podstawie xl2tpd + ipsec racoon na certyfikatach x509 - 8.09.x , 10.03.x

 

Jako, że windows wspiera natywnie protokół tunelowania l2tp postanowiłem przedstawić opis dotyczący zestawienia tunelu szyfrowanego za pomocą tenże protokołu l2tp przy użyciu programu xl2tpd po jednej stronie kamikadze Openwrt oraz clientów windows i openwrt jako clienta tenże tunelu. Całe łącze będzie szyfrowane za pomocą ipsec wykorzystując Racoon po stronie linux i windows. Wszystko to opierać będzie się na certyfikatach x509.

 

27.07.2010: Testowano na Backfire 10.03.x na routerze wr1043nd.

 

Konfigurację klientów windows opisałem na końcu mojego artykułu.

Konfigurację OpenWrt jako client l2tp+ipsec przedstawiłem na końcu.

 

Założenia

Adres publiczny WAN IP Routera OpenWrt                    : 218.97.26.22

Adres i maska sieci LAN Routera openWrt                  : 192.168.1.0/24

Adres ip dns i wins w naszej sieci LAN                                   : 192.168.1.1

Adres Publiczny clienta VPN l2tp                                               : 0.0.0.0/0 - adres nieznany

(0.0.0.0)Windows <=============> (218.97.26.22)openwrt(192.168.1.0/24)

 

Nazwa DNS od strony Openwrt: l2tp.vpn.dyndns.org

Nazwa DNS od strony clienta : laptop.vpn.dyndns.org

Najlepiej aby były to adresy dns.

 

Szyfrowanie przy wykorzystaniu certyfikatów x509 w trybie transportowym ipsec

 

Aby nie było problemów z komunikacją z za nat dla clienta windows został użyty protokuł vpn traversal_nat, który potrafi przebić się z za routerów natujących. Aby było to możliwe przeważnie trzeba zostawić załączone opcje np. w asmax BR-604G:

Enable IPsec pass through on VPN connection
Enable L2TP pass through on VPN connection

 

Instalacja

Instalujemy pakiety xl2tpd, racoon i ew. openssl

opkg install ipsec-tools libopenssl  openssl-util xl2tpd kmod-ppp ppp

opkg install ipsec-tools kmod-crypto-aead kmod-crypto-aes kmod-crypto-authenc kmod-crypto-core kmod-crypto-des kmod-crypto-hmac kmod-crypto-md5 kmod-crypto-sha1 kmod-ipsec kmod-ipsec4

Od wersji Backfire nie ma modułu kmod-crypto-aead

musimy jeszcze utworzyć plik ładujący dodatkowe moduły w czasie startu systemu - są wymagane do poprawnej pracy- UWAGA !!! TYLKO w kamikadze 8.09.x

echo af_key >> /etc/modules.d/10-ipsec
echo ah4 >> /etc/modules.d/10-ipsec
echo esp4 >> /etc/modules.d/10-ipsec
echo xfrm_user >> /etc/modules.d/10-ipsec
echo xfrm4_mode_beet >> /etc/modules.d/10-ipsec
echo xfrm4_mode_transport >> /etc/modules.d/10-ipsec
echo xfrm4_mode_tunnel >> /etc/modules.d/10-ipsec
echo xfrm4_tunnel >> /etc/modules.d/10-ipsec

 

Konfiguracja po stronie Openwrt pakietu xl2tpd

Pliki konfiguracyjne są umieszczone w następujących katalogach

/etc/xl2tpd/xl2tpd.conf

/etc/xl2tpd/l2tp-secrets

/etc/ppp/options.xl2tpd

/etc/ppp/chap-secrets

 

Zawartość pliku /etc/xl2tpd/xl2tpd.conf:

[global]                                                               
port = 1701                                                    
;
[lns default]                                                  
ip range = 192.168.222.10-192.168.222.100     
local ip = 192.168.222.1                              
length bit = yes                                               
require chap = yes                                     
refuse pap = yes                                               
require authentication = yes                   
name = VPN l2tp for Formaplan                          
ppp debug = yes                                       
pppoptfile = /etc/ppp/options.xl2tpd  

 

Adresy ip 192.168.222. są potrzebne do zestawienia połączenia ppp gdzie:

192.168.222.1 - jest to adres ip na serwerze, który zostanie utworzony w czasie startu xl2tpd- może to być interfjes ppp0

192.168.222.10-192.168.222.100 - zakres adresów przydzielany clientom

Adresy muszą być inne jak te które wykorzystujemy we własnej sieci tak aby nie było kolizji.

 

Zawartość pliku /etc/xl2tpd/l2tp-secrets:

Tego pliku nie wykorzystujemy

 

Zawartość pliku /etc/ppp/options.xl2tpd:

auth
idle 1800
mtu 1460
mru 1460
debug
proxyarp
+mschap-v2
ms-dns 192.168.1.1
ms-wins 192.168.1.1
logfd 2
logfile /var/log/xl2tpd.log
ipcp-accept-local
ipcp-accept-remote
#noccp
nodefaultroute
lock
crtscts
connect-delay 5000

 

Zawartość pliku /etc/ppp/chap-secrets:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
username_vpn        *       password_vpn  192.168.222.10

 

Troszkę wyjaśnienia w/w wpisu

Otóż adres ip przy wpisie danego usera oznacza, że ten user zawsze będzie dostawał adres ip 192.168.222.10

Przyda się do kontroli reguł firewalla

Jeśli nie chcemy konkretnych ip możemy wpisać gwiazdkę zamiast adresu ip. i wtedy wiersz będzie wyglądał następująco:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
username_vpn        *       password_vpn  *

 

Hasło podajemy otwartym tekstem.

Jeśli wykorzystujemy Domenę to hasło winno wyglądac wedle shematu:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
DOMENA\username_vpn        *       password_vpn  *

 

 

Konfiguracja firewalla na OpenWrt:

Zawartość pliku /etc/config/firewall

config rule
option src              wan
option proto            esp
option target           ACCEPT

config rule
option src              wan
option proto            ah
option target           ACCEPT

config rule
option src              wan
option proto            ipcomp
option target           ACCEPT

config rule
option dest_port        500
option proto            udp
option target           ACCEPT

config rule
option dest_port        4500
option proto            udp
option target           ACCEPT


config include
option path /etc/firewall.user


Zawartość pliku /etc/firewall.user:

#reduły dla xl2tpd + racoon

iptables -I INPUT -m policy --dir in --pol ipsec -p udp --dport 1701 -j ACCEPT

iptables -I FORWARD -i ppp+ -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -i ppp+ --src 192.168.222.10 -j ACCEPT
iptables -I INPUT -i ppp+ -p tcp --dport 53 -j ACCEPT
iptables -I INPUT -i ppp+ -p udp --dport 53 -j ACCEPT

iptables -t nat -I postrouting_rule -p ipcomp -j ACCEPT
iptables -t nat -I postrouting_rule -p ah -j ACCEPT
iptables -t nat -I postrouting_rule -p esp -j ACCEPT

 

Teraz nasz client o adresie ip. 192.168.222.10 będzie miał dostęp do naszej sieci LAN po vpn.

Jeśli chcemy puścić wszystkie komputery do LAN możemy wykorzystać regułkę:

iptables -I FORWARD -i ppp+ --src 192.168.222.0/24 -j ACCEPT

 

 

Konfiguracja Racoon na Openwrt:

w katalogu /etc/racoon utwórz 4 pliki i 1 katalog

touch /etc/racoon/psk.txt

touch /etc/racoon/racoon.conf

touch /etc/racoon/setkey.conf

touch /etc/init.d/racoon

mkdir /etc/racoon/certs

 

oraz nadaj uprawnienia do wykonywania

chmod +x /etc/racoon/setkey.conf

chmod +x /etc/init.d/racoon

chmod 600 /etc/racoon/psk.txt

 

Plik konfiguracyjny /etc/racoon/racoon.conf winien wyglądać następująco:

path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";

log info;

listen
{
isakmp 218.97.26.22 [500];
isakmp_natt 218.97.26.22 [4500];
}

timer
{
natt_keepalive 10sec;
}
remote anonymous {
exchange_mode main;
doi ipsec_doi;
generate_policy on;
situation_identity_only;
lifetime time 28800 sec;
my_identifier asn1dn;
peers_identifier asn1dn;
verify_identifier on;
verify_cert on;
ca_type x509 "/etc/ssl/cacert.pem";
certificate_type x509 "newcert.pem" "newkey.pem";
passive on;
initial_contact off;
nat_traversal on;
#ike_frag=on;
proposal_check obey;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method rsasig;
dh_group 2;
}
}

sainfo anonymous {
pfs_group 2;
lifetime time 3600 sec;
encryption_algorithm aes,3des ;
authentication_algorithm hmac_sha1,hmac_md5 ;
compression_algorithm deflate;
}

 

Plik /etc/racoon/setkey.conf winien wyglądać:

#!/usr/sbin/setkey -f

flush;
spdflush;

#FPW

spdadd 218.97.26.22[1701] 0.0.0.0/0 udp -P out ipsec
esp/transport//require;
spdadd 0.0.0.0/0
218.97.26.22[1701] udp -P in ipsec
esp/transport//require;

 

Plik /etc/init.d/racoon winien zawierać:

#!/bin/sh /etc/rc.common

START=60

start() {
echo Uruchamiam tunel ipsec racoon...

if [ ! -e /var/racoon ]
then
mkdir /var/racoon
fi
setkey -f /etc/racoon/setkey.conf
racoon -f /etc/racoon/racoon.conf

}

stop() {
killall racoon
}

 

a następnie wykonać

/etc/init.d/racoon enable

/etc/init.d/racoon start

/etc/init.d/xl2tpd enable

/etc/init.d/xl2tpd start

 

Do katalogu /etc/racoon/certs wrzucamy nasz certyfikat publiczny i prywatny serwera patrz artykuł generowanie certyfikatów

Przypominam tylko, iż w czasie generowania certyfikatów powstają nam pliki:

newcert.pem  - certyfikat publiczny 
newkey.pem   - klucz prywatny certyfikatu
newreq.pem   - request
to nasze wygenerowane pliki certyfikatu

 

W OpenWrt używamy skryptu CA.sh

 

Jeśli chcemy mieć weryfikację certyfikatów poprzez listy crl (zakładam że CA już masz) wykonujemy w katalogu (przy założeniu, iż w tym katalogu generowałeś certyfikaty swoje)

/usr/lib/ssl/misc

openssl ca -gencrl -out demoCA/crl/crl.pem
openssl crl -in demoCA/crl/crl.pem -outform der -out demoCA/crl/cert.crl

oraz ca to musimy zrobić linki symboliczne z utworzonych plików do :

# ln -s demoCA/crl/crl.pem `openssl x509 -hash -noout -in demoCA/cacert.pem`.r0
#ln -s demoCA/cacert.pem `openssl x509 -hash -noout -in demoCA/cacert.pem`.0

 

Wiersz

peers_identifier asn1dn;

może wyglądac inaczej patrz na końcu artykułu.

 

Od strony OpenWrt to już wszystko. Już nic więcej nie musimy robić.

 

jakby były jakieś problemy z certyfikatami obejrzyj sobie przykładowe wygenerowane przeze mnie certyfikaty Punkt.9

 

 

UWAGA !!! ERRATA

W Backfire ostatnich wydania jest błąd który winien zostać poprawiony. Niestety developerzy tak przerobili firewalla że nie da się w żaden sposób wstawić na początek głównych łańcuchów własnych reguł iptables. Jeśli masz problemy z nawiązaniem połączenia zerknij koniecznie na reguły firewalla

iptables -t nat -L -v

w szczególności łańcuchów POSTROUTING. Nasze reguły dodane do firewalla MUSZĄ być przed łańcuchami

zone_lan_nat
zone_wan_nat

inaczej nie będzie poprawnie działał tunel

Czyli jeśli masz np. taką kolejność

Chain POSTROUTING (policy ACCEPT 246 packets, 18433 bytes)
pkts bytes target     prot opt in     out     source               destination
854 61486 zone_wan_nat  all  --  any    eth0.2  anywhere             anywhere
1    84 zone_lan_nat  all  --  any    br-lan  anywhere             anywhere
246 18433 postrouting_rule  all  --  any    any     anywhere             anywhere

to nie będą działać wpisy w postrouting_rule. Nawet jak dodasz reguły w /etc/firewall.user do głównego łańcucha POSTROUTING to przynajmniej na dzień dzisiejszy reguły zostaną dodane za łańcuchami zone_lan_nat i zone_wan_nat

Jedynym rozwiązaniem jest przeniesienie naszych reguł do skryptu uruchamiającego firewall /etc/init.d/racoon

Czyli usuwamy nasze wpisy z pliky /etc/firewall.user i wstawiamy je np. tak jak poniżej:

Plik /etc/init.d/racoon winien zawierać:


#!/bin/sh /etc/rc.common

START=98

start() {
echo Uruchamiam tunel ipsec racoon...

if [ ! -e /var/racoon ]
then
mkdir /var/racoon
fi
setkey -f /etc/racoon/setkey.conf
racoon -f /etc/racoon/racoon.conf

#reduły dla xl2tpd + racoon

iptables -I INPUT -m policy --dir in --pol ipsec -p udp --dport 1701 -j ACCEPT

iptables -I FORWARD -i ppp+ -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -i ppp+ --src 192.168.222.10 -j ACCEPT
iptables -I INPUT -i ppp+ -p tcp --dport 53 -j ACCEPT
iptables -I INPUT -i ppp+ -p udp --dport 53 -j ACCEPT

iptables -t nat -I postrouting_rule -p ipcomp -j ACCEPT
iptables -t nat -I postrouting_rule -p ah -j ACCEPT
iptables -t nat -I postrouting_rule -p esp -j ACCEPT

}

stop() {
killall racoon

#reduły dla xl2tpd + racoon

iptables -D INPUT -m policy --dir in --pol ipsec -p udp --dport 1701 -j ACCEPT

iptables -D FORWARD -i ppp+ -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -D FORWARD -i ppp+ --src 192.168.222.10 -j ACCEPT
iptables -D INPUT -i ppp+ -p tcp --dport 53 -j ACCEPT
iptables -D INPUT -i ppp+ -p udp --dport 53 -j ACCEPT

iptables -t nat -D postrouting_rule -p ipcomp -j ACCEPT
iptables -t nat -D postrouting_rule -p ah -j ACCEPT
iptables -t nat -D postrouting_rule -p esp -j ACCEPT

}

 

Alternatywą w/w zmian jest uaktualnienie pakietu firewall do najnowszej wersji

opkg install http://ecco.selfip.net/backfire/packages/firewall_2-21_all.ipk

po wgraniu w/w aktualizacji reguły spokojnie mogą zostać jak w oryginalnym opisie.

 



 

 

Konfigurację klientów l2tp+ipsec opisałem na końcu mojego artykułu.




 

Konfiguracja klienta l2tp+ipsec na podstawie OpenWrt 8.09.1

 

Przedstawię tylko pliki konfiguracyjne ponieważ opis w zasadzie jest podobny jak wyżej (położenie plików konfiguracyjnych, certyfikatów, etc.)

 

Konfiguracja xl2tpd na client Openwrt:

Zawartość pliku /etc/xl2tpd/xl2tpd.conf:

[global]                                                               
port = 1701     
access control = no

;
[lac nazwa_clienta]
lns = 218.97.26.22
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
name = formaplan
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd


Zawartość pliku /etc/ppp/options.xl2tpd:

user username_vpn
noipdefault
#usepeerdns
noaccomp
noauth
idle 1800
mtu 1460
mru 1460
refuse-eap
debug
logfd 2
logfile /var/log/xl2tpd.log
ipcp-accept-local
ipcp-accept-remote
nodefaultroute
lock
crtscts
connect-delay 5000


 

Zawartość pliku /etc/ppp/chap-secrets:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
username_vpn        *       password_vpn  *


Konfiguracja Racoon na client Openwrt:

Plik konfiguracyjny /etc/racoon/racoon.conf winien wyglądać następująco:

path certificate "/etc/racoon/certs";

log info;

timer
{
natt_keepalive 10sec;
}
remote
218.97.26.22 {
exchange_mode main;
doi ipsec_doi;
generate_policy on;
situation_identity_only;
lifetime time 28800 sec;
my_identifier asn1dn;
peers_identifier asn1dn;
verify_identifier on;
verify_cert off;
ca_type x509 "/etc/ssl/cacert.pem";
certificate_type x509 "newcert.pem" "newkey.pem";
passive off;
initial_contact on;
nat_traversal on;
#ike_frag=on;
proposal_check obey;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method rsasig;
dh_group 2;
}
}

sainfo anonymous {
pfs_group 2;
lifetime time 3600 sec;
encryption_algorithm aes,3des ;
authentication_algorithm hmac_sha1,hmac_md5 ;
compression_algorithm deflate;
}

 

Plik /etc/racoon/setkey.conf winien wyglądać:

#!/usr/sbin/setkey -f

flush;
spdflush;

#FPW

spdadd 0.0.0.0/0 218.97.26.22[1701] udp -P out ipsec
esp/transport//require;
spdadd
218.97.26.22[1701] 0.0.0.0/0 udp -P in ipsec
esp/transport//require;

 

Plik /etc/init.d/racoon winien zawierać:

#!/bin/sh /etc/rc.common

START=60

start() {
echo Uruchamiam tunel ipsec racoon...

if [ ! -e /var/racoon ]
then
mkdir /var/racoon
fi
setkey -f /etc/racoon/setkey.conf
racoon -f /etc/racoon/racoon.conf

}

stop() {
killall racoon
}

 

a następnie wykonać

/etc/init.d/racoon enable

/etc/init.d/racoon start

/etc/init.d/xl2tpd enable

/etc/init.d/xl2tpd start

 

Konfiguracja firewalla na client l2tp OpenWrt:

Zawartość pliku /etc/config/firewall

config rule
option src              wan
option proto            esp
option target           ACCEPT

config rule
option src              wan
option proto            ah
option target           ACCEPT

config rule
option src              wan
option proto            ipcomp
option target           ACCEPT

config rule
option dest_port        500
option proto            udp
option target           ACCEPT

config rule
option dest_port        4500
option proto            udp
option target           ACCEPT


config include
option path /etc/firewall.user


Zawartość pliku /etc/firewall.user:

#reduły dla xl2tpd + racoon

iptables -I INPUT -m policy --dir in --pol ipsec -p udp --dport 1701 -j ACCEPT

iptables -I FORWARD -i ppp+ -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -i ppp+ --src 192.168.222.1 -j ACCEPT

iptables -t nat -I postrouting_rule -p ipcomp -j ACCEPT
iptables -t nat -I postrouting_rule -p ah -j ACCEPT
iptables -t nat -I postrouting_rule -p esp -j ACCEPT

 

UWAGA !!! ERRATA

Patrz errate powyżej. schemat podobny. Jak nie działa przenieść reguły do pliku /etc/init.d/racoon

 

I to już wszystko jeśli chodzi o konfigurację klienta l2tp po ipsec dla OpenWrt.

Uruchomienie tunelu na OpenWrt:

Aby uruchomić/zestawić połaczenie wydaj komendę:

echo "c nazwa_clienta" > /var/run/xl2tpd/l2tp-control
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.222.1

Aby wyłączyć/zerwać połączenie wydaj komendę:

echo "d nazwa_clienta" > /var/run/xl2tpd/l2tp-control

gdzie "nazwa_clienta" to nasza nazwa zdefiniowana w sekcji LAC w pliku xl2tpd.conf.

 

UWAGI:

Jest to połączenie VPN typu host-net. To nie jest tunel łączący dwie sieci. Dlatego zestawienie tunelu jest ręcznie robione.

Pewnie dzięki odpowiedniej konfiguracji routingu i firewala dało by się uzyskać połączenie typu net-net.

Konfiguracja działa bez problemu za natem.

 

Ps.
Możemy uzyskać połączenie typu net->net (takie pseudo tunel). Ważne jest to, że mamy dostęp do sieci odległej z każdego komputera w naszej sieci. Wadą jest to, że z odległej sieci będzie ciężko się dostać do naszych kompów wewnątrz bo są po prostu za NAT. Do zrobienia połączenia po prostu użyjemy SNAT. Aby uruchomić/zestawić połączenie wydaj na routerze z OpenWrt poniższe komendy:

iptables -t nat -I POSTROUTING -d 192.168.1.0/24 -j SNAT --to 192.168.222.10
echo "c
nazwa_clienta" > /var/run/xl2tpd/l2tp-control
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.222.1
iptables -I FORWARD --src 10.0.0.0/24 -j ACCEPT
ip route flush cache

Aby wyłączyć/zerwać połączenie wydaj komendę:

iptables -t nat -D POSTROUTING -d 192.168.1.0/24 -j SNAT --to 192.168.222.10
echo "d
nazwa_clienta" > /var/run/xl2tpd/l2tp-control
route del -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.222.1
iptables -D FORWARD --src 10.0.0.0/24 -j ACCEPT
ip route flush cache

gdzie

10.0.0.0/24 to nasza sieć wewnętrzna w domu

192.168.222.10 to adres ip jaki otrzymaliśmy od serwera l2tp

192.168.222.1 to adres ip gw. połączenia Peer to Peer od strony firmy czyli serwera l2tp

 

Jak chcemy możemy sobie wrzucić to wszystko  do skryptu i jego odpalać.



Podziel się tą informacja z innymi:
Poprawiony: piątek, 18 lutego 2011 17:39