Cliente VPN C2S com StrongSwan no Linux

Versão do software tratada no documento: StrongSwan 5.7.2
Site: https://www.strongswan.org/

Introdução

O cliente VPN IPsec StrongSwan surge como uma alternativa ao cliente VPN da Forcepoint para Linux, Android, Windows e muitos outros; ele é constantemente atualizado e suporta IKEv1 e IKEv2 assim como inúmeros protocolos de criptografia.

1) Instalação

Versão testada: Raspberry Pi 3B+

Para utilizar a VPN C2S com StrongSwan no Raspberry pi, siga os seguintes procedimentos:

1.1) Instalar o StrongSwan no Raspberry Pi OS

Versão testada: Raspbian GNU/Linux 10 (buster)

Para instalar StrongSwan no Raspberry Pi, utilize o seguinte comando:

sudo apt-get update && sudo apt-get install strongswan libcharon-extra-plugins strongswan-swanctl charon-systemd

Agora devemos baixar o certificado do Firewall Forcepoint da Reitoria para a pasta /etc/ipsec.d/cacerts/ :

sudo wget https://drive.ifsp.edu.br/s/DaWPt6dbPg7aof5/download -O /etc/ipsec.d/cacerts/certificate.crt

2) Carregar configurações de VPN para conexão com a Reitoria

2.1) IKEv1

A conexão via IKEv1 é a mais comum para o ambiente de VPN C2S com a Reitoria, para utiliza-la, faça o seguinte:

Edite o arquivo /etc/ipsec.conf :

sudo nano /etc/ipsec.conf

Agora insira o seguinte conteúdo no arquivo:

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup

# Add connections here.

#conn default
conn %default
        ikelifetime=8h
        keylife=24h
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        compress=no
        aggressive=no
        fragmentation=yes
        dpdaction=restart
        forceencaps=yes

#conn IFSP-RET
conn vpn-ifsp-ret
        # right part
        right=200.133.214.9
        rightauth=pubkey
        rightsendcert=yes
        # left part
        left=%any
        leftid=<seuprontuario>
        leftauth=xauth
        xauth_identity="seuprontuario@ifsp.edu.br"
        leftfirewall=yes
        leftsourceip=%config
        # ike part
        type=tunnel
        modeconfig=pull
		mobike=no
		ike="aes256-sha1-modp1536"
        esp="3des-sha1"
        auto=start

conn net-192.168.2.0/24
        also=vpn-ifsp-ret
        rightsubnet=192.168.2.0/24
        type=tunnel
        auto=start

conn net-192.168.3.0/24
        also=vpn-ifsp-ret
        rightsubnet=192.168.3.0/24
        type=tunnel
        auto=start

conn net-192.168.6.0/24
        also=vpn-ifsp-ret
        rightsubnet=192.168.6.0/24
        type=tunnel
        auto=start

conn net-10.3.0.0/16
        also=vpn-ifsp-ret
        rightsubnet=10.10.22.0/24
        type=tunnel
        auto=start

conn net-10.10.1.0/24
        also=vpn-ifsp-ret
        rightsubnet=10.10.1.0/24
        type=tunnel
        auto=start

conn net-10.10.2.0/24
        also=vpn-ifsp-ret
        rightsubnet=10.10.2.0/24
        type=tunnel
        auto=start

conn net-10.10.21.0/24
        also=vpn-ifsp-ret
        rightsubnet=10.10.21.0/24
        type=tunnel
        auto=start

conn net-10.10.22.0/24
        also=vpn-ifsp-ret
        rightsubnet=10.10.22.0/24
        type=tunnel
        auto=start

conn net-45.236.121.0/25
        also=vpn-ifsp-ret
        rightsubnet=45.236.121.0/25
        type=tunnel
        auto=start

conn net-45.236.121.128/26
        also=vpn-ifsp-ret
        rightsubnet=45.236.121.128/26
        type=tunnel
        auto=start

conn net-45.236.121.192/27
        also=vpn-ifsp-ret
        rightsubnet=45.236.121.192/27
        type=tunnel
        auto=start

include /var/lib/strongswan/ipsec.conf.inc

Não se esqueça de adicionar seu prontuário no arquivo!!

Em seguida adicione o seguinte conteúdo ao arquivo /etc/ipsec.secrets :

sudo nano /etc/ipsec.secrets
# Exemplo: rt000000 : XAUTH "123456"
<seuprontuario>@ifsp.edu.br : XAUTH "suasenha"

Se estiver tudo certo basta agora ativar a VPN reiniciando o serviço:

sudo systemctl enable ipsec
sudo systemctl restart ipsec

Para verificar que tudo transcorreu bem, basta verificar o status do serviço e/ou a tabela de rotas do sistema:

Status do serviço:

sudo systemctl status ipsec

Tabela de rotas:

ip route show table all

Algo como isto deve aparecer:

root@raspberrypi:/home/pi# ip route show table all
10.2.1.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
10.10.1.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
10.10.2.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
10.10.21.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
10.10.22.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
45.236.121.0/25 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
45.236.121.128/26 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
45.236.121.192/27 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
192.168.2.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
192.168.3.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86
192.168.6.0/24 via 192.168.15.1 dev eth0 table 220 proto static src 10.3.4.86

2.2) IKEv2

A reitoria não recomenda o uso deste formato no momento devido a problemas de compatibilidade.

O IKEv2 é suportado na maioria dos sistemas operacionais, incluindo através do cliente do StrongSwan utilizando o comando swanctl.
Infelizmente o sucesso desta conexão vai depender de como foi configurado o Firewall Forcepoint e pode requerer alguns ajustes.

Existem duas configurações possíveis, deixaremos aqui registrada a configuração considerada de mais amplo suporte e também a que possui ajustes para funcionar melhor com a atual configuração de Firewall da Reitoria.

2.2.1) Configuração específica para Forcepoint NGFW - Reitoria

Crie um arquivo chamado ifsp-vpn-ret.conf em nano /etc/swanctl/conf.d/ :

sudo nano /etc/swanctl/conf.d/ifsp-vpn-ret.conf

Insira o seguinte conteúdo no arquivo:

connections {
    IFSP-VPN-RET {
        version = 2
        proposals = aes256-aes128-sha256-sha1-modp1536

        rekey_time = 0s
        fragmentation = yes
        dpd_delay = 300s
        remote_addrs = 200.133.214.9
        vips=0.0.0.0,::

        local {
            auth = eap
            id = <seuprontuario>
            eap_id = "<seuprontuario@ifsp.edu.br"
        }
        remote {
            auth = pubkey
            id = %any
        }
        children {
		    esp_proposals = aes128-aes256-sha256-sha1-modp1536,aes128-aes256-sha256
            RET1 {
                remote_ts = 192.168.2.0/24
             }
            RET2 {
                remote_ts = 192.168.3.0/24
            }
            RET3 {
                remote_ts = 192.168.6.0/24
            }
            RET4 {
                remote_ts = 10.2.1.0/24
            }
            RET5 {
                remote_ts = 10.10.1.0/24
            }
            RET6 {
                remote_ts = 10.10.2.0/24
            }
            RET7 {
                remote_ts = 10.10.21.0/24
            }
            RET8 {
                remote_ts = 10.10.22.0/24
            }
            RET9 {
                remote_ts = 45.236.121.0/25
            }
            RET10 {
                remote_ts = 45.236.121.128/26
            }
            RET11 {
                remote_ts = 45.236.121.192/27
            }
            RET11 {
                remote_ts = 45.236.121.192/27
            }
            RET12 {
                remote_ts = 2801:80:2410:100::/64
            }
            RET13 {
                remote_ts = 2801:80:2410:200::/64
            }
            RET14 {
                remote_ts = 2801:80:2410:2100::/64
            }
            RET15 {
                remote_ts = 2801:80:2410:2200::/64
            }
            RET16 {
                remote_ts = 2801:80:2410:5::/64
            }
            RET17 {
                remote_ts = 2801:80:2410:6::/64
            }
            RET18 {
                remote_ts = 2801:80:2410:6::/64
            }
        }
    }
}
secrets {
    eap {
        id = <seuprontuario>@ifsp.edu.br
        secret = <suasenha>
    }
}

Não se esqueça de adicionar seu prontuário e senha no arquivo!!

Em seguida, crie o arquivo vpn.sh no /home/pi :

nano /home/pi/vpn.sh

Adicione o seguinte conteúdo no arquivo:

#!/bin/bash
#
# Este script inicia ou desativa a VPN via swanctl - o numero no contator
# se refere a quantidade de entradas child seu arquivo de conf possui.
#
while [ -n "$1" ]; do

	case "$1" in

	-a) for counter in {1..11}; do swanctl -i -P -c RET$counter; done ;;

	-d) for counter in {1..11}; do swanctl -t -P -c RET$counter; done ;;

	*) echo "Opcao $1 nao reconhecida" ;;

	esac

	shift

done

Agora adicione a permissão de execução ao arquivo:

chmod +x /home/pi/vpn.sh

Iniciar e recarregar o serviço:

systemctl enable strongswan.service
systemctl restart strongswan.service

Agora carregue as configurações:

sudo swanctl -q

você pode consultar todas as opções deste comando utilizando swanctl --help

Para iniciar a VPN basta executar (como root):

/home/pi/./vpn.sh -a

E para desativar a VPN:

/home/pi/./vpn.sh -d

Salve e saia.

2.2.2) Configuração de suporte amplo - Reitoria

Para esta configuração,  crie um arquivo chamado ifsp-vpn-ret.conf em nano /etc/swanctl/conf.d/ :

sudo nano /etc/swanctl/conf.d/ifsp-vpn-ret.conf

Insira o seguinte conteúdo no arquivo:

connections {
    IFSP-VPN-RET {
        version = 2
        proposals = aes256-aes128-sha256-sha1-modp1536
        rekey_time = 0s
        fragmentation = yes
        dpd_delay = 300s
        remote_addrs = 200.133.214.9
        vips=0.0.0.0,::

        local {
            auth = eap
            id = <seuprontuario>
            eap_id = "<seuprontuario>@ifsp.edu.br"
        }
        remote {
            auth = pubkey
            id = %any
        }
        children {
            RET {
                remote_ts = 192.168.2.0/24,192.168.3.0/24,192.168.6.0/24,10.10.21.0/24,10.10.22.0/24,10.10.1.0/24,10.10.2.0/24,45.236.121.0/25,45.236.121.128/26,45.236.121.192/27,2801:80:2410:100::/64,2801:80:2410:200::/64,2801:80:2410:2100::/64,2801:80:2410:2200::/64,2801:80:2410:5::/64,2801:80:2410:6::/64,2801:80:2410:7::/64
                rekey_time = 0s
                dpd_action = restart
                esp_proposals = aes128-aes256-sha256-sha1-modp1536,aes128-aes256-sha256
            }
        }
		
    }
}
secrets {
    eap {
        id = <seuprontuario>@ifsp.edu.br
        secret = <suasenha>
    }
}

Iniciar e recarregar o serviço:

systemctl enable strongswan.service
systemctl restart strongswan.service

Agora carregue as configurações:

sudo swanctl -q

você pode consultar todas as opções deste comando utilizando swanctl --help

Para iniciar a VPN:

sudo swanctl -i -c RET

E para desativar a VPN:

sudo swanctl -t -c RET