VPN

De TheNets Wiki
Ir para: navegação, pesquisa

Como criar e configurar uma VPN.

Os exemplos abaixo utilizam as configurações legadas do Strongswan. O motivo de utilizá-lo é por conta da versão atualmente mantida não permitir a criação com IKEv1 e, infelizmente, ainda existem muitas empresas que usam esta versão mais antiga.

Documentação da configuração legada do Strongswan: https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2StrokeExamples

Strongswan

O Strongswan é uma implementação de diversos protocolos para criação de VPNs, além de outros recursos que, por exemplo, permitem automaticamente criar rotas e atualizar o iptables.

Todos os exemplo serão feitos para a distribuição Ubuntu 18.04.

Instalar pacotes

Diferentes pacotes podem ser instalados para trabalhar com o Strongswan. Ele é inteiramente modularizado e, por isso, seus plugins podem vir de diferentes fontes.

Para os exemplos abaixo, instale os seguintes pacotes:

apt-get update
apt-get install -y strongswan strongswan-pki libstrongswan-extra-plugins

Comandos úteis

# Exibir conexões
#   O 'sort' no final é pq a ordem gerada pelo
#   comando por sair errada as vezes.
ipsec status | sort

# Exibir mais informações do ipsec
#   Útil para verificar quais plugins estão instalados.
ipsec statusall

# Atualizar configurações
# Caso o 'ipsec.secrets' ou o 'ipsec.config' sejam editados.
ipsec update

# Ligar uma VPN
ipsec up mordor

# Desligar uma VPN
ipsec down mordor

Road Warrior / IKEv2 (Legacy Config)

Baseado no excelente tutorial do Digital Ocean: https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-18-04-2

VPN IKEv2 Road Warrior Strongswan.png

1. Criar certificados e copiá-los para /etc/ipsec.d/.

 1 #!/bin/bash
 2 
 3 # Install strongswan-pki
 4 apt-get update
 5 apt-get install -y strongswan-pki
 6 
 7 # Creating a Certificate Authority
 8 mkdir -p ~/pki/{cacerts,certs,private}
 9 chmod 700 ~/pki
10 ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
11 ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
12     --type rsa --dn "CN=VPN asgard CA" --outform pem > ~/pki/cacerts/ca-cert.pem
13 
14 # Generating a Certificate for the VPN Server
15 ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
16 ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
17     | ipsec pki --issue --lifetime 1825 \
18         --cacert ~/pki/cacerts/ca-cert.pem \
19         --cakey ~/pki/private/ca-key.pem \
20         --dn "CN=25.25.25.25" --san "25.25.25.25" \
21         --flag serverAuth --flag ikeIntermediate --outform pem \
22     >  ~/pki/certs/server-cert.pem
23 sudo cp -r ~/pki/* /etc/ipsec.d/

2. Configurar e ativar o UFW (Uncomplicated Firewall) para permitir as conexões do IPSec.

1 #!/bin/bash
2 
3 # Allow SSH
4 ufw allow ssh
5 
6 # Allow IPSec
7 ufw allow 500/udp
8 ufw allow 4500/udp

3. Configurar as rotas para redirecionar o tráfego pelo servidor de VPN. /etc/ufw/before.rules

 1 # VPN
 2 *nat
 3 -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
 4 -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
 5 COMMIT
 6 
 7 *mangle
 8 -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
 9 COMMIT
10 # END VPN
11 
12 # Don't delete these required lines, otherwise there will be errors
13 *filter
14 :ufw-before-input - [0:0]
15 :ufw-before-output - [0:0]
16 :ufw-before-forward - [0:0]
17 :ufw-not-local - [0:0]
18 # End required lines
19 
20 # VPN
21 -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
22 -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
23 # END VPN
24 
25 [...]

4. Permitir que o kernel redirecione o tráfego dos adaptadores de rede. /etc/sysctl.conf

1 [...]
2 
3 net.ipv4.ip_forward=1
4 net.ipv4.conf.all.accept_redirects=0
5 net.ipv4.conf.all.send_redirects=0

5. Adicionar a autenticação do certificado gerado na parte 1 e o user/pass de cada usuário: /etc/ipsec.secrets

1 [...]
2 
3 # Road warriors
4 : RSA "server-key.pem"
5 kratos@asgard.god : EAP "ThisIsThePassword"

6. Configuração da conexão do Strongswan: /etc/ipsec.conf

 1 # basic configuration
 2 config setup
 3         charondebug="all"
 4         uniqueids=yes
 5         strictcrlpolicy=no
 6 
 7 # connection from ASGARD's Road Warriors
 8 conn rw-asgard
 9     auto=add
10     compress=no
11     type=tunnel
12     fragmentation=yes
13     forceencaps=yes
14 
15     # Encryption
16     keyexchange=ikev2
17     ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024,aes256-sha256-modp3072! 
18     esp=aes256-sha256,aes256-sha1,3des-sha1,aes256-sha256!
19 	
20     # Remove 'dangling' connections
21     dpdaction=clear
22     dpddelay=300s
23     rekey=no
24 
25     # Left (VPN server)
26     left=%any
27     leftid=25.25.25.25
28     leftcert=server-cert.pem
29     leftsendcert=always
30     leftsubnet=10.0.0.0/8
31 
32     # Right (Client)
33     right=%any
34     rightid=%any
35     rightauth=eap-mschapv2
36     rightsourceip=10.10.10.0/24
37     rightdns=8.8.8.8,8.8.4.4
38     rightsendcert=never
39 
40     # Always ask for user credentials
41     eap_identity=%identity


Site-to-Site / IKEv2 + PSK (Legacy Config)

Exemplo de como criar uma conexão.

Foi identificada uma incompatibilidade entre modelos de concentradores de VPN Cisco com o Strongswan caso sejam utilizados Diffie Hellman Groups menores que 15 (modp3072). Portanto, é recomendado utilizar grupo igual ou acima de 15.

Mais informações em: https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2StrokeExamples

VPN IKEv2 Strongswan.png

/etc/ipsec.secrets

# PSK
# <ip_local> <ip_remoto> : PSK "<senha>"
25.25.25.25 45.45.45.45 : PSK "SeNhaAquI"

/etc/ipsec.config

 1 # basic configuration
 2 config setup
 3         charondebug="all"
 4         uniqueids=yes
 5         strictcrlpolicy=no
 6 
 7 # connection to MORDOR
 8 conn mordor
 9         # Local
10         left=%defaultroute
11         leftauth=psk
12         leftid=25.25.25.25
13         leftsubnet=10.1.0.150/32
14 
15         # Remote
16         right=45.45.45.45
17         rightauth=psk
18         rightid=45.45.45.45
19         rightsubnet=10.21.0.200/32
20 
21         # https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2CipherSuites
22         authby=secret
23         keyexchange=ikev2
24         ike=aes256-sha256-modp3072
25         esp=aes256-sha256
26 
27         keyingtries=0
28         ikelifetime=1h
29         lifetime=8h
30         dpddelay=30
31         dpdtimeout=120
32         dpdaction=restart
33         auto=start

Site-to-Site / IKEv1 + PSK (Legacy Config)

Mais informações em: https://www.strongswan.org/testing/testresults/ikev1/net2net-cert/

VPN IKEv1 Strongswan.png

/etc/ipsec.secrets

# PSK
# <ip_local> <ip_remoto> : PSK "<senha>"
25.25.25.25 75.75.75.75 : PSK "SeNhaAquI"

/etc/ipsec.config

 1 # connection to KANTO
 2 conn kanto-1
 3         # Local
 4         left=%defaultroute
 5         leftid=25.25.25.25
 6         leftsubnet=10.1.0.150/32
 7         leftfirewall=yes
 8 
 9         # Remote
10         right=75.75.75.75
11         rightid=75.75.75.75
12         rightsubnet=10.34.0.0/24
13 
14         # https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2CipherSuites
15         authby=secret
16         keyexchange=ikev1
17         ike=aes256-sha256-modp3072
18         esp=aes256-sha256
19 
20         rekeymargin=3m
21         keyingtries=1
22         ikelifetime=60m
23         auto=start
24 
25 # Exemplo de como conectar em mais uma subnet
26 # utilizando uma outra config ja existente.
27 conn kanto-2
28         also=kanto-1
29         rightsubnet=10.35.0.0/24

Rotear portas com o 'rinetd'

Ao estabelecer um túnel IPsec, apenas o host local terá acesso à ele. Existem várias manerias de fazer o processo de liberar o acesso do túnel à um outro host da LAN. A solução que eu acho mais simples é utilizar o rinetd, ao invés de criar as rotas manualmente por iptables, por exemplo. Portanto, segue abaixo exemplo de como configurar o rinetd:

# Instalar o rinetd
apt-get install -y rinetd

Configure o rinetd para permitir que todos os hosts da LAN 10.1.0.0/24 consiga bater na porta 8080 do concentrador de VPN e ser redirecionado para o host remoto 75.75.75.75 na porta 80 através do túnel IPsec.

/etc/rinetd.conf

# bindadress    bindport  connectaddress  connectport
10.1.0.*        8080      75.75.75.75     80

# 10.1.0.* é equivalente a 10.1.0.0/24

Reinicie o servidor do rinetd para aplicar as mudanças.

# Reinicie o rinetd
service rinetd restart

Problemas comuns

O kernel bloqueia a criação de túnel com IKEv1

Um problema que eu encontrei ao criar uma VPN com IKEv1 foi o AppArmor bloquear a criação do túnel IPsec. Para resolver esse problema, basta permitir o módulo do Strongswan acessar o módulo de rede do kernel Linux.

Para isso, permita o acesso do módulo charon do Strongswan ao kernel:

# Instale o 'apparmor-utils'
apt-get install -y apparmor-utils

# Execute o 'aa-logprof'
#   Este comando analizará logs do AppArmor e do kernel
#   e verificar se algo teve acesso negado e um wizard
#   interativo será invocado. Nele será possível buscar
#   o 'charon'. Siga os passos e permita o acesso.
aa-logprof

Referência

https://site.elastichosts.com/blog/linux-l2tpipsec-vpn-client/

https://askubuntu.com/questions/801860/openswan-shows-no-installation-candidate-after-running-apt-get-update

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2StrokeExamples

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv1StrokeExamples