Posted in : Azure Av Simon Gottschlag Översätt med Google ⟶
7 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