Posted in : Azure Av Simon Gottschlag Översätt med Google ⟶
8 years ago
Jag inledde min tidigare post med att förklara hur jag satte upp ett CentOS VM i Azure med flera NIC, detta för att kunna ta hand om exempelvis IPSec-tunnlar mellan olika Azure-siter men även mellan Azure och on-premises. Varför inte använda Azure Virtual Network Gateway? Den fungerar ju fantastiskt bra, men i större miljöer vill du köra route based VPN och blir väldigt lätt problem om många parter är inblandade med olika märken (Cisco ASA, Fortinet, CheckPoint, Juniper, Palo Alto Networks och så vidare). Många gånger går det att lösa, men många gånger är det bara enklare att sätta upp en enhet i Azure som hanterar det så som en Cisco CSR eller Palo Alto Networks VM-series för att underlätta konfiguration och felsökning – när många är inblandade och har olika krav på hur det skall hanteras.
Jag fick för mig att det kan vara roligt att göra något liknande med Linux, för att lära mig lite mer om StrongSwan men även Quagga och mer specifikt OSPF i Linux – men kanske mer om det en annan gång.
Jag satte upp en miljö i Azure uppdelat på tre regioner:
- UK South
- 1 virtual network med 3 subnät
- 10.18.0.0/16 – address space
- 10.18.0.0/24 – subnet 01 (”clients”)
- 10.18.16.0/28 – subnet 02 (”router inside”)
- 10.18.16.16/28 – subnet 03 (”router outside”)
- 2 virtuella maskiner
- rtr01 – 1 NIC på subnet 02 och ett NIC på subnet 03
- win10 – 1 NIC på subnet 01
- User defined route
- Applicerad på subnet 01 och pekar ut de andra regionerna via rtr01 på subnet 02
- 1 virtual network med 3 subnät
- West Europe
- 1 virtual network med 3 subnät
- 10.17.0.0/16 – address space
- 10.17.0.0/24 – subnet 01 (”clients”)
- 10.17.16.0/28 – subnet 02 (”router inside”)
- 10.17.16.16/28 – subnet 03 (”router outside”)
- 2 virtuella maskiner
- rtr01 – 1 NIC på subnet 02 och ett NIC på subnet 03
- win10 – 1 NIC på subnet 01
- User defined route
- Applicerad på subnet 01 och pekar ut de andra regionerna via rtr01 på subnet 02
- 1 virtual network med 3 subnät
- West US
- 1 virtual network med 3 subnät
- 10.16.0.0/16 – address space
- 10.16.0.0/24 – subnet 01 (”clients”)
- 10.16.16.0/28 – subnet 02 (”router inside”)
- 10.16.16.16/28 – subnet 03 (”router outside”)
- 2 virtuella maskiner
- rtr01 – 1 NIC på subnet 02 och ett NIC på subnet 03
- win10 – 1 NIC på subnet 01
- User defined route
- Applicerad på subnet 01 och pekar ut de andra regionerna via rtr01 på subnet 02
- 1 virtual network med 3 subnät
Jag utgick i stort sett helt och hållet utifrån denna sida för att konfigurera StrongSwan. Utan att gå in på var enda detalj kan det vara värt att nämna att jag satte SELinux till permissive för att få StrongSwan att köra updown-skriptet, installerade en senare kernel än den som följde med mitt Azure VM (4.9.0 från elrepo – notera att jag fick manuellt tvinga den nya till att vara den aktiva med ”grub2-set-default 0”).
Själva installationen på samtliga maskiner är lika enkel som vanligt:
yum install epel-release yum install strongswan sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/sysconfig/selinux setenforce 0 test `getenforce` == "Permissive" && echo "Working: SELinux set to Permissive" systemctl enable strongswan
Därefter stängde jag av att routes samt virtuella ip skall installeras när tunnlar sätts upp:
# vim /etc/strongswan/strongswan.d/charon.conf
[...]
# Install routes into a separate routing table for established IPsec
# tunnels.
install_routes = no
# Install virtual IP addresses.
install_virtual_ip = no
[...]
Därefter konfigurerade jag up/down-skriptet på respektive nod:
# vim /etc/strongswan/ipsec-vti.sh
#
# UK South Router
#
#!/bin/bash
IP=$(which ip)
IPTABLES=$(which iptables)
PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// })
PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// })
case "$PLUTO_CONNECTION" in
WEU-RTR01)
VTI_INTERFACE=vti100
VTI_LOCALADDR=169.254.0.1/30
VTI_REMOTEADDR=169.254.0.2/30
;;
WUS-RTR01)
VTI_INTERFACE=vti200
VTI_LOCALADDR=169.254.0.5/30
VTI_REMOTEADDR=169.254.0.6/30
;;
esac
case "${PLUTO_VERB}" in
up-client)
$IP link add ${VTI_INTERFACE} type vti local ${PLUTO_ME} remote ${PLUTO_PEER} okey ${PLUTO_MARK_OUT_ARR[0]} ikey ${PLUTO_MARK_IN_ARR[0]}
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.disable_policy=1
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=2 || sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=0
$IP addr add ${VTI_LOCALADDR} remote ${VTI_REMOTEADDR} dev ${VTI_INTERFACE}
$IP link set ${VTI_INTERFACE} up mtu 1350
$IPTABLES -t mangle -I FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -I INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
$IP route flush table 220
;;
down-client)
$IP link del ${VTI_INTERFACE}
$IPTABLES -t mangle -D FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -D INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
;;
esac
# Enable IPv4 forwarding
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.eth1.disable_xfrm=1
sysctl -w net.ipv4.conf.eth0.disable_xfrm=1
sysctl -w net.ipv4.conf.eth1.disable_policy=1
sysctl -w net.ipv4.conf.eth0.disable_policy=1
#
# West US Router
#
#!/bin/bash
IP=$(which ip)
IPTABLES=$(which iptables)
PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// })
PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// })
case "$PLUTO_CONNECTION" in
UKS-RTR01)
VTI_INTERFACE=vti200
VTI_LOCALADDR=169.254.0.6/30
VTI_REMOTEADDR=169.254.0.5/30
;;
WEU-RTR01)
VTI_INTERFACE=vti300
VTI_LOCALADDR=169.254.0.10/30
VTI_REMOTEADDR=169.254.0.9/30
;;
esac
case "${PLUTO_VERB}" in
up-client)
$IP link add ${VTI_INTERFACE} type vti local ${PLUTO_ME} remote ${PLUTO_PEER} okey ${PLUTO_MARK_OUT_ARR[0]} ikey ${PLUTO_MARK_IN_ARR[0]}
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.disable_policy=1
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=2 || sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=0
$IP addr add ${VTI_LOCALADDR} remote ${VTI_REMOTEADDR} dev ${VTI_INTERFACE}
$IP link set ${VTI_INTERFACE} up mtu 1350
$IPTABLES -t mangle -I FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -I INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
$IP route flush table 220
;;
down-client)
$IP link del ${VTI_INTERFACE}
$IPTABLES -t mangle -D FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -D INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
;;
esac
# Enable IPv4 forwarding
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.eth1.disable_xfrm=1
sysctl -w net.ipv4.conf.eth0.disable_xfrm=1
sysctl -w net.ipv4.conf.eth1.disable_policy=1
sysctl -w net.ipv4.conf.eth0.disable_policy=1
#
# West Europe Router
#
#!/bin/bash
IP=$(which ip)
IPTABLES=$(which iptables)
PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// })
PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// })
case "$PLUTO_CONNECTION" in
UKS-RTR01)
VTI_INTERFACE=vti100
VTI_LOCALADDR=169.254.0.2/30
VTI_REMOTEADDR=169.254.0.1/30
;;
WUS-RTR01)
VTI_INTERFACE=vti300
VTI_LOCALADDR=169.254.0.9/30
VTI_REMOTEADDR=169.254.0.10/30
;;
esac
case "${PLUTO_VERB}" in
up-client)
$IP link add ${VTI_INTERFACE} type vti local ${PLUTO_ME} remote ${PLUTO_PEER} okey ${PLUTO_MARK_OUT_ARR[0]} ikey ${PLUTO_MARK_IN_ARR[0]}
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.disable_policy=1
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=2 || sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=0
$IP addr add ${VTI_LOCALADDR} remote ${VTI_REMOTEADDR} dev ${VTI_INTERFACE}
$IP link set ${VTI_INTERFACE} up mtu 1350
$IPTABLES -t mangle -I FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -I INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
$IP route flush table 220
;;
down-client)
#$IP tunnel del ${VTI_INTERFACE}
$IP link del ${VTI_INTERFACE}
$IPTABLES -t mangle -D FORWARD -o ${VTI_INTERFACE} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPTABLES -t mangle -D INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
;;
esac
# Enable IPv4 forwarding
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.eth1.disable_xfrm=1
sysctl -w net.ipv4.conf.eth0.disable_xfrm=1
sysctl -w net.ipv4.conf.eth1.disable_policy=1
sysctl -w net.ipv4.conf.eth0.disable_policy=1
Notering: Glöm inte att sätta ipsec-vti.sh till exekverbar. (chmod +x /etc/strongswan/ipsec-vti.sh)
Nästa steg är att sätta upp spelreglerna för hur tunnlarna skall förhandlas:
# vim /etc/strongswan/ipsec.conf
#
# UK South Router
#
config setup
charondebug="cfg 2, ike 3"
conn %default
leftauth=psk
rightauth=psk
ike=aes256-sha256-modp2048s256,aes128-sha1-modp1024!
ikelifetime=28800s
aggressive=no
esp=aes128-sha256-modp2048s256,aes128-sha1-modp1024!
lifetime=3600s
type=tunnel
dpddelay=10s
dpdtimeout=30s
keyexchange=ikev2
rekey=yes
reauth=no
#dpdaction=restart
#closeaction=restart
left=%defaultroute
leftsubnet=0.0.0.0/0
rightsubnet=0.0.0.0/0
leftupdown=/etc/strongswan/ipsec-vti.sh
installpolicy=yes
compress=no
mobike=no
conn WEU-RTR01
left=10.18.16.20
leftid=vti-rtr01-outside.uksouth.cloudapp.azure.com
right=vti-rtr01-outside.westeurope.cloudapp.azure.com
rightid=vti-rtr01-outside.westeurope.cloudapp.azure.com
auto=start
mark=100
conn WUS-RTR01
left=10.18.16.20
leftid=vti-rtr01-outside.uksouth.cloudapp.azure.com
right=vti-rtr01-outside.westus.cloudapp.azure.com
rightid=vti-rtr01-outside.westus.cloudapp.azure.com
auto=start
mark=200
#
# West US Router
#
config setup
charondebug="cfg 2, ike 3"
conn %default
leftauth=psk
rightauth=psk
ike=aes256-sha256-modp2048s256,aes128-sha1-modp1024!
ikelifetime=28800s
aggressive=no
esp=aes128-sha256-modp2048s256,aes128-sha1-modp1024!
lifetime=3600s
type=tunnel
dpddelay=10s
dpdtimeout=30s
keyexchange=ikev2
rekey=yes
reauth=no
#dpdaction=restart
#closeaction=restart
left=%defaultroute
leftsubnet=0.0.0.0/0
rightsubnet=0.0.0.0/0
leftupdown=/etc/strongswan/ipsec-vti.sh
installpolicy=yes
compress=no
mobike=no
conn UKS-RTR01
left=10.16.16.20
leftid=vti-rtr01-outside.westus.cloudapp.azure.com
right=vti-rtr01-outside.uksouth.cloudapp.azure.com
rightid=vti-rtr01-outside.uksouth.cloudapp.azure.com
auto=start
mark=200
conn WEU-RTR01
left=10.16.16.20
leftid=vti-rtr01-outside.westus.cloudapp.azure.com
right=vti-rtr01-outside.westeurope.cloudapp.azure.com
rightid=vti-rtr01-outside.westeurope.cloudapp.azure.com
auto=start
mark=300
#
# West Europe Router
#
config setup
charondebug="cfg 2, ike 3"
conn %default
leftauth=psk
rightauth=psk
ike=aes256-sha256-modp2048s256,aes128-sha1-modp1024!
ikelifetime=28800s
aggressive=no
esp=aes128-sha256-modp2048s256,aes128-sha1-modp1024!
lifetime=3600s
type=tunnel
dpddelay=10s
dpdtimeout=30s
keyexchange=ikev2
rekey=yes
reauth=no
#dpdaction=restart
#closeaction=restart
left=%defaultroute
leftsubnet=0.0.0.0/0
rightsubnet=0.0.0.0/0
leftupdown=/etc/strongswan/ipsec-vti.sh
installpolicy=yes
compress=no
mobike=no
conn UKS-RTR01
left=10.17.16.20
leftid=vti-rtr01-outside.westeurope.cloudapp.azure.com
right=vti-rtr01-outside.uksouth.cloudapp.azure.com
rightid=vti-rtr01-outside.uksouth.cloudapp.azure.com
auto=start
mark=100
conn WUS-RTR01
left=10.17.16.20
leftid=vti-rtr01-outside.westeurope.cloudapp.azure.com
right=vti-rtr01-outside.westus.cloudapp.azure.com
rightid=vti-rtr01-outside.westus.cloudapp.azure.com
auto=start
mark=300
Och till sist behöver våra pre-shared keys konfigureras:
# vim /etc/strongswan/ipsec.secrets # # UK South Router # vti-rtr01-outside.uksouth.cloudapp.azure.com vti-rtr01-outside.westeurope.cloudapp.azure.com : PSK "sjukthemligt" vti-rtr01-outside.uksouth.cloudapp.azure.com vti-rtr01-outside.westus.cloudapp.azure.com : PSK "sjukthemligt" # # West US Router # vti-rtr01-outside.westus.cloudapp.azure.com vti-rtr01-outside.uksouth.cloudapp.azure.com : PSK "sjukthemligt" vti-rtr01-outside.westus.cloudapp.azure.com vti-rtr01-outside.westeurope.cloudapp.azure.com : PSK "sjukthemligt" # # West Europe Router # vti-rtr01-outside.westeurope.cloudapp.azure.com vti-rtr01-outside.uksouth.cloudapp.azure.com : PSK "sjukthemligt" vti-rtr01-outside.westeurope.cloudapp.azure.com vti-rtr01-outside.westus.cloudapp.azure.com : PSK "sjukthemligt"
Därefter skall det bara vara att starta strongswan (systemctl start strongswan) och börja routa via de olika vti (virtual tunnel interface). Glöm inte att uppdatera eventuella network security groups för att tillåta UDP\500 och UDP\4500!
IP forwarding kan behövas i detta steg:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf
Det blev en del konfiguraiton, så eventuellt att jag missat något steg. Men tror inte det! Tänk på att använda swanctl för felsökning, hjälper helt klart när man missar ett ”i” i leftid!
Tags : Azure, centos, IPSec, Linux, StrongSwan
Personlig rådgivning
Vi erbjuder personlig rådgivning med författaren för 1400 SEK per timme. Anmäl ditt intresse i här så återkommer vi så snart vi kan.


Add comment