Posted in : Azure By Simon Gottschlag Translate with 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
  • 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
  • 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

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

Your comment will be revised by the site if needed.