Dziś kolejny wpis na temat IPsec VPN a dokładnie trochę o konfiguracji OpenSwan który jest trochę bardziej popularny niż LibreSwan (fork) o którym pisałem ostatnio. W zasadzie konfiguracja nie będzie się wiele różnić dlatego napisze coś o problemach przy zestawianiu takiego połączenia. Osobiście zestawiałem takie połączenia np. z checkpointem, cisco czy racoon.

Przykładowy diagram połączenia

Diagram1

Połączenie VPN będzie realizowane w trybie tunelowym, czyli sieć do sieci (strona do strony, site 2 site). Celem wykreowania połączenia VPN jest dostęp jednej sieci do drugiej i na odwrót.

ipsec.conf

W zasadzie konfiguracja jest całkiem prosta bo sprowadza się do określenia stron. Lewa strona MY, prawa ONI. Na diagramie widać, że openswan nie jest uruchomiony bezpośrednio na routerze a dopiero za min. Trzeba włączyć nat_traversal. Warto włączyć logowanie do pliku – plutostderrlog. Aby tunel wstawał zawsze przy uruchomieniu demona ustaw auto=start. Dodaj opcje leftnexthop aby zadziałał ruting. Inaczej ping nie będą trafiać w tunel jeśli tego nie wskażesz (ping -I).

ipsec.conf

config setup
	# Do not set debug options to debug configuration issues!
	# plutodebug / klipsdebug = "all", "none" or a combation from below:
	# "raw crypt parsing emitting control klips pfkey natt x509 dpd private"
	# eg:
	plutodebug="none"
	# Again: only enable plutodebug or klipsdebug when asked by a developer
	#
	# enable to get logs per-peer
	# plutoopts="--perpeerlog"
	#
	# Enable core dumps (might require system changes, like ulimit -C)
	# This is required for abrtd to work properly
	# Note: incorrect SElinux policies might prevent pluto writing the core
	dumpdir=/var/run/pluto/
	#
	# NAT-TRAVERSAL support, see README.NAT-Traversal
	nat_traversal=yes
	# exclude networks used on server side by adding %v4:!a.b.c.0/24
	# It seems that T-Mobile in the US and Rogers/Fido in Canada are
	# using 25/8 as "private" address space on their 3G network.
	# This range has not been announced via BGP (at least upto 2010-12-21)
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:!172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10,%v4:!172.18.10.0/24
	# OE is now off by default. Uncomment and change to on, to enable.
	oe=off
	# which IPsec stack to use. auto will try netkey, then klips then mast
	# Use this to log to a file, or disable logging on embedded systems (like openwrt)
	protostack=netkey
	#plutostderrlog=/dev/null
        plutostderrlog=/var/log/pluto.log
       
       
conn peer
        authby=secret
        auto=start
        ike=aes256-sha1
        keyexchange=ike
        phase2=esp
        phase2alg=aes256-sha1
        compress=no
        pfs=yes
        type=tunnel
        left=172.18.10.7
        leftsubnet=172.18.10.0/24
        leftnexthop=%defaultroute
        right=2.2.2.2
        rightsubnet=192.168.1.0/24

Nie działa ..

Zakładam, że po przeczytaniu powyższej konfiguracji i poprzedniej o libreswan tunel działa. Poniżej logi które pojawią się w sytuacji jeśli wszystko jest ok. Pierwsza i druga faza zestawiona, poniżej pogrubiona.

ipsec auto --status

000 stats db_ops: {curr_cnt, total_cnt, maxsz} :context={0,2,36} trans={0,2,1008} attrs={0,2,1344} 
000  
000 "peer": 172.18.10.0/24===172.18.10.7[+S=C]---172.18.10.254...2.2.2.2[+S=C]===192.168.1.0/24; erouted; eroute owner: #2
000 "peer":     myip=unset; hisip=unset;
000 "peer":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0
000 "peer":   policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 24,8; interface: eth0; 
000 "peer":   newest ISAKMP SA: #1; newest IPsec SA: #2; 
000 "peer":   IKE algorithms wanted: AES_CBC(7)_256-SHA1(2)_000-MODP1536(5), AES_CBC(7)_256-SHA1(2)_000-MODP1024(2); flags=-strict
000 "peer":   IKE algorithms found:  AES_CBC(7)_256-SHA1(2)_160-MODP1536(5), AES_CBC(7)_256-SHA1(2)_160-MODP1024(2)
000 "peer":   IKE algorithm newest: AES_CBC_256-SHA1-MODP1024
000 "peer":   ESP algorithms wanted: AES(12)_256-SHA1(2)_000; flags=-strict
000 "peer":   ESP algorithms loaded: AES(12)_256-SHA1(2)_160
000 "peer":   ESP algorithm newest: AES_256-HMAC_SHA1; pfsgroup=
000  
000 #2: "peer":500 STATE_QUICK_I2 (sent QI2, IPsec SA established); EVENT_SA_REPLACE in 27450s; newest IPSEC; eroute owner; isakmp#1; idle; import:admin initiate
000 #2: "peer" esp.bc14928a@2.2.2.2 esp.e3387064@172.18.10.7 tun.0@2.2.2.2 tun.0@172.18.10.7 ref=0 refhim=4294901761
000 #1: "peer":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_REPLACE in 2193s; newest ISAKMP; nodpd; idle; import:admin initiate

tail -f /var/log/pluto.log

"peer" #1: initiating Main Mode
"peer" #1: ignoring Vendor ID payload [FRAGMENTATION]
"peer" #1: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
"peer" #1: STATE_MAIN_I2: sent MI2, expecting MR2
"peer" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
"peer" #1: STATE_MAIN_I3: sent MI3, expecting MR3
"peer" #1: Main mode peer ID is ID_IPV4_ADDR: '2.2.2.2'
"peer" #1: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
"peer" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_256 prf=oakley_sha group=modp1024}
"peer" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK {using isakmp#1 msgid:bfd862a6 proposal=AES(12)_256-SHA1(2)_160 pfsgroup=OAKLEY_GROUP_MODP1024}
"peer" #2: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME msgid=bfd862a6
"peer" #2: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
"peer" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0xe74132bb

Bad pass

Co w przypadku kiedy np. po mojej stronie będę miał złe hasło?
Żadna faza się nie zestawi u każdej ze stron pojawi się informacja malformed payload albo payload malformed.

root@raspberrypi:~# ipsec auto --status

000 stats db_ops: {curr_cnt, total_cnt, maxsz} :context={0,1,36} trans={0,1,1008} attrs={0,1,1344} 
000  
000 "peer": 172.18.10.0/24===172.18.10.7[+S=C]---172.18.10.254...2.2.2.2[+S=C]===192.168.1.0/24; prospective erouted; eroute owner: #0
000 "peer":     myip=unset; hisip=unset;
000 "peer":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0
000 "peer":   policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 24,8; interface: eth0; 
000 "peer":   newest ISAKMP SA: #0; newest IPsec SA: #0; 
000 "peer":   IKE algorithms wanted: AES_CBC(7)_256-SHA1(2)_000-MODP1536(5), AES_CBC(7)_256-SHA1(2)_000-MODP1024(2); flags=-strict
000 "peer":   IKE algorithms found:  AES_CBC(7)_256-SHA1(2)_160-MODP1536(5), AES_CBC(7)_256-SHA1(2)_160-MODP1024(2)
000 "peer":   ESP algorithms wanted: AES(12)_256-SHA1(2)_000; flags=-strict
000 "peer":   ESP algorithms loaded: AES(12)_256-SHA1(2)_160
000  
000 #2: "peer":500 STATE_MAIN_I3 (sent MI3, expecting MR3); EVENT_RETRANSMIT in 10s; nodpd; idle; import:admin initiate
000 #2: pending Phase 2 for "peer" replacing #0


root@raspberrypi:~# tail -f /var/log/pluto.log 

loading secrets from "/etc/ipsec.secrets"
loading secrets from "/var/lib/openswan/ipsec.secrets.inc"
"peer" #1: initiating Main Mode
"peer" #1: ignoring Vendor ID payload [FRAGMENTATION]
"peer" #1: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
"peer" #1: STATE_MAIN_I2: sent MI2, expecting MR2
"peer" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
"peer" #1: STATE_MAIN_I3: sent MI3, expecting MR3
"peer" #1: received 1 malformed payload notifies

Bad IKE

W przypadku ustawienia złych algorytmów szyfrowania dla IKE dostaniemy informacje NO_PROPOSAL_CHOSEN

root@raspberrypi:~# ipsec auto --status

000 "peer": 172.18.10.0/24===172.18.10.7[+S=C]---172.18.10.254...2.2.2.2[+S=C]===192.168.1.0/24; prospective erouted; eroute owner: #0
000 "peer":     myip=unset; hisip=unset;
000 "peer":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0
000 "peer":   policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 24,8; interface: eth0; 
000 "peer":   newest ISAKMP SA: #0; newest IPsec SA: #0; 
000 "peer":   IKE algorithms wanted: AES_CBC(7)_128-SHA1(2)_000-MODP1536(5), AES_CBC(7)_128-SHA1(2)_000-MODP1024(2); flags=-strict
000 "peer":   IKE algorithms found:  AES_CBC(7)_128-SHA1(2)_160-MODP1536(5), AES_CBC(7)_128-SHA1(2)_160-MODP1024(2)
000 "peer":   ESP algorithms wanted: AES(12)_256-SHA1(2)_000; flags=-strict
000 "peer":   ESP algorithms loaded: AES(12)_256-SHA1(2)_160
000  
000 #1: "peer":500 STATE_MAIN_I1 (sent MI1, expecting MR1); EVENT_RETRANSMIT in 17s; nodpd; idle; import:admin initiate
000 #1: pending Phase 2 for "peer" replacing #0
000  

root@raspberrypi:~# tail -f /var/log/pluto.log 
"peer" #1: initiating Main Mode
"peer" #1: ignoring informational payload, type NO_PROPOSAL_CHOSEN msgid=00000000
"peer" #1: received and ignored informational message

Bad ipsec

W przypadku kiedy nieprawidłowo określę algorytmy szyfrowania dla ipsec w logu zobaczę, że faza pierwsza (IKE) się zestawiła ale poniżej dostaje informacje NO_PROPOSAL_CHOSEN.

root@raspberrypi:~# ipsec auto --status

000 "peer": 172.18.10.0/24===172.18.10.7[+S=C]---172.18.10.254...2.2.2.2[+S=C]===192.168.1.0/24; prospective erouted; eroute owner: #0
000 "peer":     myip=unset; hisip=unset;
000 "peer":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0
000 "peer":   policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 24,8; interface: eth0; 
000 "peer":   newest ISAKMP SA: #1; newest IPsec SA: #0; 
000 "peer":   IKE algorithms wanted: AES_CBC(7)_256-SHA1(2)_000-MODP1536(5), AES_CBC(7)_256-SHA1(2)_000-MODP1024(2); flags=-strict
000 "peer":   IKE algorithms found:  AES_CBC(7)_256-SHA1(2)_160-MODP1536(5), AES_CBC(7)_256-SHA1(2)_160-MODP1024(2)
000 "peer":   IKE algorithm newest: AES_CBC_256-SHA1-MODP1024
000 "peer":   ESP algorithms wanted: AES(12)_128-SHA1(2)_000; flags=-strict
000 "peer":   ESP algorithms loaded: AES(12)_128-SHA1(2)_160
000  
000 #2: "peer":500 STATE_QUICK_I1 (sent QI1, expecting QR1); EVENT_RETRANSMIT in 27s; nodpd; idle; import:admin initiate
000 #1: "peer":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_REPLACE in 2710s; newest ISAKMP; nodpd; idle; import:admin initiate
000 

root@raspberrypi:~# tail -f /var/log/pluto.log

"peer" #1: initiating Main Mode
"peer" #1: ignoring Vendor ID payload [FRAGMENTATION]
"peer" #1: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
"peer" #1: STATE_MAIN_I2: sent MI2, expecting MR2
"peer" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
"peer" #1: STATE_MAIN_I3: sent MI3, expecting MR3
"peer" #1: Main mode peer ID is ID_IPV4_ADDR: '2.2.2.2'
"peer" #1: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
"peer" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_256 prf=oakley_sha group=modp1024}
"peer" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK {using isakmp#1 msgid:70c6526c proposal=AES(12)_128-SHA1(2)_160 pfsgroup=OAKLEY_GROUP_MODP1024}
"peer" #1: ignoring informational payload, type NO_PROPOSAL_CHOSEN msgid=00000000
"peer" #1: received and ignored informational message

Bad net

Częstym problemem jest sytuacja kiedy któraś strona źle określi maskę sieci drugiej strony. Wtedy możliwe że tylko jedna strona będzie miała dostęp do zasobów drugiej.

 

 

W sumie to na tyle, dawajcie znać jak tam wasze konifguracje Openswan, libreswan i srongswan (strongswan w zasadzie działa dobrze sam ze sobą ale nie z np cisco lub checkpoint).