Dawno nie pisałem nic o VPN a ogólnie na co dzień robię dużo różnych konfiguracji. Zresztą na TF można znaleźć parę krótkich opisów jak zestawić VPN techfreak.pl/tag/vpn-2/. Tym razem krótki opis jak skonfigurować VPN site 2 site przy pomocy Libreswan. Jest to kolejny fork popularnego pakietu OpenSwan.
Na początek schemat przykładowego połączenia jednej sieci lokalnej z drugą. Jak był by ktoś ciekawy, to takie rysuneczki robi się na linuksie za pomocą programu DIA.
Ja skupiam się na swojej stronie „left” czyli na swojej sieci 192.168.0.0/24 i hoście „linux Libreswan”. Połączenie VPN będzie realizowane w trybie tunelowym, czyli sieć do sieci. Cel jest taki aby hosty z jednej sieci miały połączenie do drugiej w obie strony. Czasem połączenie nie działa w obie strony bo nie zgadzają się SA po którejś stronie. Wtedy zazwyczaj w logach można zauważyć komunikat INVALID ID INFORMATION.
ipsec.conf
Na początek trzeba skonfigurować główne parametry w pliku /etc/ipsec.conf. Na początek opcja virtual_private tu trzeba wyciągnąć swoją sieć z tego zakresu, czyli %v4:!192.168.0.0/24. Wykrzyknik to exclude. Wszystkimi opcjami left* i right* określam swoją stronę (left) i peera (right). Czyli adres IP bramy i adresy sieci. Opcja PFS to perfect forward secrecy, tu jest na off ale przy różnych scenariuszach trzeba o niej pamiętać czy druga strona ją włączyła czy nie. Auth by secret oznacza że połączenie jest zestawiane na podstawie hasła PSK które konfiguruje się w pliku /etc/ipsec.secrets. IKE i ESP w zasadzie najważniejsza opcja bo tu najczęściej występują problemy nie tyle co w komunikacji pomiędzy adminami to w poprawnym zapisie. W poniższej konfiguracji jest zastosowane szyfrowanie w fazie pierwszej (IKE) i drugiej (ipsec), AES256 i SHA1 z grupa DH1024.
# /etc/ipsec.conf - Libreswan IPsec configuration file config setup protostack=netkey plutostderrlog=/var/log/pluto.log dumpdir=/var/run/pluto/ nat_traversal=yes virtual_private=%v4:!192.168.0.0/24,%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10 conn ipsec type=tunnel authby=secret left=83.83.83.83 leftsubnet=192.168.0.0/24 leftnexthop=%defaultroute right=84.84.84.84 rightsubnet=192.168.1.0/24 ike=aes256-sha1;modp1024 esp=aes256-sha1;modp1024 keyexchange=ike pfs=no auto=start
ipsec.secrets
W pliku /etc/ipsec.secrets określa się dla jakich bram jakie hasło ma ipsec użyć. Od lewej moje IP bramy następnie, IP bramy right. Hasło PSK „vfbgnhmj”.
83.83.83.83 84.84.84.84 : PSK "vfbgnhmj"
Z czym..
Taką konfigurację można zastosować z Cisco, Checkpoint i innymi „urządzeniami” do VPN. Oczywiście po drugiej stronie też może być host z libreswan.
logi
Zawsze przy takich połączeniach trzeba patrzeć w logi w tym przypadku będą przydatne trzy polecenia które podpowiedzą co jest nie tak: systemctl status ipsec, ipsec auto –status, ip xfrm policy
[root@libreswan ~]# systemctl status ipsec ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled) Active: active (running) since wto 2019-02-17 03:52:19 EST; 58min ago Process: 717 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS) Process: 707 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS) Main PID: 1321 (sh) CGroup: /system.slice/ipsec.service ├─1321 /bin/sh -c eval `/usr/libexec/ipsec/pluto --config /etc/ipsec.conf --nofork $PLUTO_OPTIONS` ├─1326 /bin/sh -c eval `/usr/libexec/ipsec/pluto --config /etc/ipsec.conf --nofork $PLUTO_OPTIONS` ├─1328 /usr/libexec/ipsec/pluto --config /etc/ipsec.conf --nofork └─1660 _pluto_adns
[root@libreswan ~]# sudo ipsec auto --status 000 using kernel interface: netkey 000 interface lo/lo ::1 000 interface lo/lo 127.0.0.1 000 interface lo/lo 127.0.0.1 000 interface eth0/eth0 83.83.83.83 000 interface eth0/eth0 83.83.83.83 000 000 fips mode=disabled; 000 SElinux=disabled 000 000 config setup options: 000 000 configdir=/etc, configfile=/etc/ipsec.conf, secrets=/etc/ipsec.secrets, ipsecdir=/etc/ipsec.d, dumpdir=/var/run/pluto/, statsbin=unset 000 sbindir=/usr/sbin, libdir=/usr/libexec/ipsec, libexecdir=/usr/libexec/ipsec 000 pluto_version=3.8, pluto_vendorid=OE-Libreswan-3.8 000 nhelpers=-1, uniqueids=yes, retransmits=yes, force_busy=no 000 ikeport=500, strictcrlpolicy=no, crlcheckinterval=0, listen= 000 secctx_attr_value=32001 000 myid = (none) 000 debug none 000 000 nat_traversal=yes, keep_alive=20, nat_ikeport=4500, disable_port_floating=no 000 virtual_private (%priv): 000 - allowed 6 subnets: 10.0.0.0/16, 172.16.0.0/12, 25.0.0.0/8, 100.64.0.0/10, fd00::/8, fe80::/10 000 - disallowed 3 subnets: 192.168.0.0/24, 192.168.0.0/16 000 000 ESP algorithms supported: 000 000 algorithm ESP encrypt: id=2, name=ESP_DES, ivlen=8, keysizemin=64, keysizemax=64 000 algorithm ESP encrypt: id=3, name=ESP_3DES, ivlen=8, keysizemin=192, keysizemax=192 000 algorithm ESP encrypt: id=6, name=ESP_CAST, ivlen=8, keysizemin=40, keysizemax=128 000 algorithm ESP encrypt: id=7, name=ESP_BLOWFISH, ivlen=8, keysizemin=40, keysizemax=448 000 algorithm ESP encrypt: id=11, name=ESP_NULL, ivlen=0, keysizemin=0, keysizemax=0 000 algorithm ESP encrypt: id=12, name=ESP_AES, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=13, name=ESP_AES_CTR, ivlen=8, keysizemin=160, keysizemax=288 000 algorithm ESP encrypt: id=14, name=ESP_AES_CCM_A, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=15, name=ESP_AES_CCM_B, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=16, name=ESP_AES_CCM_C, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=18, name=ESP_AES_GCM_A, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=19, name=ESP_AES_GCM_B, ivlen=12, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=20, name=ESP_AES_GCM_C, ivlen=16, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=22, name=ESP_CAMELLIA, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=252, name=ESP_SERPENT, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=253, name=ESP_TWOFISH, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP auth attr: id=1, name=AUTH_ALGORITHM_HMAC_MD5, keysizemin=128, keysizemax=128 000 algorithm ESP auth attr: id=2, name=AUTH_ALGORITHM_HMAC_SHA1, keysizemin=160, keysizemax=160 000 algorithm ESP auth attr: id=5, name=AUTH_ALGORITHM_HMAC_SHA2_256, keysizemin=256, keysizemax=256 000 algorithm ESP auth attr: id=6, name=AUTH_ALGORITHM_HMAC_SHA2_384, keysizemin=384, keysizemax=384 000 algorithm ESP auth attr: id=7, name=AUTH_ALGORITHM_HMAC_SHA2_512, keysizemin=512, keysizemax=512 000 algorithm ESP auth attr: id=8, name=AUTH_ALGORITHM_HMAC_RIPEMD, keysizemin=160, keysizemax=160 000 algorithm ESP auth attr: id=9, name=AUTH_ALGORITHM_AES_CBC, keysizemin=128, keysizemax=128 000 algorithm ESP auth attr: id=251, name=AUTH_ALGORITHM_NULL_KAME, keysizemin=0, keysizemax=0 000 000 IKE algorithms supported: 000 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=20, v2name=AES_GCM_C, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=19, v2name=AES_GCM_B, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=18, v2name=AES_GCM_A, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=16, v2name=AES_CCM_C, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=15, v2name=AES_CCM_B, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=0, v1name=0??, v2id=14, v2name=AES_CCM_A, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=5, v1name=OAKLEY_3DES_CBC, v2id=3, v2name=3DES, blocksize=8, keydeflen=192 000 algorithm IKE encrypt: v1id=7, v1name=OAKLEY_AES_CBC, v2id=12, v2name=AES_CBC, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=65004, v1name=OAKLEY_SERPENT_CBC, v2id=65004, v2name=SERPENT_CBC, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=65005, v1name=OAKLEY_TWOFISH_CBC, v2id=65005, v2name=TWOFISH_CBC, blocksize=16, keydeflen=128 000 algorithm IKE encrypt: v1id=65289, v1name=OAKLEY_TWOFISH_CBC_SSH, v2id=65289, v2name=TWOFISH_CBC_SSH, blocksize=16, keydeflen=128 000 algorithm IKE hash: id=1, name=OAKLEY_MD5, hashsize=16 000 algorithm IKE hash: id=2, name=OAKLEY_SHA1, hashsize=20 000 algorithm IKE hash: id=4, name=OAKLEY_SHA2_256, hashsize=32 000 algorithm IKE hash: id=5, name=OAKLEY_SHA2_384, hashsize=48 000 algorithm IKE hash: id=6, name=OAKLEY_SHA2_512, hashsize=64 000 algorithm IKE dh group: id=2, name=OAKLEY_GROUP_MODP1024, bits=1024 000 algorithm IKE dh group: id=5, name=OAKLEY_GROUP_MODP1536, bits=1536 000 algorithm IKE dh group: id=14, name=OAKLEY_GROUP_MODP2048, bits=2048 000 algorithm IKE dh group: id=15, name=OAKLEY_GROUP_MODP3072, bits=3072 000 algorithm IKE dh group: id=16, name=OAKLEY_GROUP_MODP4096, bits=4096 000 algorithm IKE dh group: id=17, name=OAKLEY_GROUP_MODP6144, bits=6144 000 algorithm IKE dh group: id=18, name=OAKLEY_GROUP_MODP8192, bits=8192 000 algorithm IKE dh group: id=22, name=OAKLEY_GROUP_DH22, bits=1024 000 algorithm IKE dh group: id=23, name=OAKLEY_GROUP_DH23, bits=2048 000 algorithm IKE dh group: id=24, name=OAKLEY_GROUP_DH24, bits=2048 000 000 stats db_ops: {curr_cnt, total_cnt, maxsz} :context={0,2,64} trans={0,2,3072} attrs={0,2,2048} 000 000 Connection list: 000 000 "ipsec": 192.168.0.1/32===83.83.83.83---83.83.83.84...84.84.84.84===192.168.1.0/24; erouted; eroute owner: #2 000 "ipsec": oriented; my_ip=192.168.1.1; their_ip=unset; 000 "ipsec": xauth info: us:none, them:none, my_xauthuser=[any]; their_xauthuser=[any]; ; 000 "ipsec": modecfg info: us:none, them:none, modecfg policy:push, dns1:unset, dns2:unset, domain:unset, banner:unset; 000 "ipsec": labeled_ipsec:no, loopback:no; 000 "ipsec": policy_label:unset; 000 "ipsec": ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0; 000 "ipsec": sha2_truncbug:no; initial_contact:no; cisco_unity:no; send_vendorid:no; 000 "ipsec": policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+IKE_FRAG; 000 "ipsec": conn_prio: 32,16; interface: eth0; metric: 0; mtu: unset; sa_prio:auto; 000 "ipsec": newest ISAKMP SA: #3; newest IPsec SA: #2; 000 "ipsec": IKE algorithms wanted: AES_CBC(7)_256-SHA1(2)_000-MODP1024(2) 000 "ipsec": IKE algorithms found: AES_CBC(7)_256-SHA1(2)_160-MODP1024(2) 000 "ipsec": IKE algorithm newest: AES_CBC_256-SHA1-MODP1024 000 "ipsec": ESP algorithms wanted: AES(12)_256-SHA1(2)_000; pfsgroup=MODP1024(2) 000 "ipsec": ESP algorithms loaded: AES(12)_256-SHA1(2)_160 000 "ipsec": ESP algorithm newest: AES_256-HMAC_SHA1; pfsgroup=MODP1024 000 000 Total IPsec connections: loaded 1, active 1 000 000 State list: 000 000 #3: "ipsec":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_REPLACE in 1720s; newest ISAKMP; nodpd; idle; import:admin initiate 000 #2: "ipsec":500 STATE_QUICK_I2 (sent QI2, IPsec SA established); EVENT_SA_REPLACE in 24524s; newest IPSEC; eroute owner; isakmp#1; idle; import:admin initiate 000 #2: "ipsec" esp.c7b0328@84.84.84.84 esp.b531330@83.83.83.83 tun.0@83.83.83.83 tun.0@83.83.83.83 ref=0 refhim=4294901761 Traffic: ESPin=588B ESPout=588B! ESPmax=4194303B 000 #1: "ipsec":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_EXPIRE in 75s; nodpd; idle; import:admin initiate 000 000 Shunt list: 000
[root@site2site ~]# sudo ip xfrm policy src 192.168.0.0/24 dst 192.168.1.0/24 dir out priority 2346 ptype main tmpl src 83.83.83.83 dst 84.84.84.84 proto esp reqid 16385 mode tunnel src 192.168.1.0/24 dst 192.168.0.0/24 dir fwd priority 2346 ptype main tmpl src 84.84.84.84 dst 83.83.83.83 proto esp reqid 16385 mode tunnel src 192.168.1.0/24 dst 192.168.0.0/24 dir in priority 2346 ptype main tmpl src 84.84.84.84 dst 83.83.83.83 proto esp reqid 16385 mode tunnel
NAT
Jeśli jestem w sytuacji że sieć „left” musi być za NAT’em bo np. jest konflikt sieci lub gdy nie mam ustawionej opcji leftnexthop=%defaultroute. Można zrobić sobie alias na interfejsie i z niego pingować drugą stronę.
ifconfig eth1:1 192.168.0.2 netmask 255.255.255.0 up ping -I 192.168.0.2 192.168.1.1
koniec
W moich logach się wszystko zgadza i połączenie z sieci do sieci działa. VPN na libreswan został pomyślnie zestawiony. Wiem, że takie konfiguracje zazwyczaj sprawiają trudności ale dawajcie znać w komentarzach czy wam też działa połączenie.