É possível conectar o Linux ao P2P do Azure usando strongSwan (IKEv2). A Microsoft simplesmente não se incomoda com essa questão e insiste em levar o curso "P2S para Linux não é suportado" (é isso que eles me responderam em tíquetes de suporte). Aqui está como você pode configurar o IKEv2 com base na autenticação dos certificados.
Instalar dependências
Aqui estão os pacotes necessários para o Ubuntu:
apt-get install strongswan-ikev2 strongswan-plugin-eap-tls
# in Ubuntu 16.04 install libstrongswan-standard-plugins for p12 keypair container support
apt-get install libstrongswan-standard-plugins
Se você instalar o pacote libstrongswan-extra-plugins
no Ubuntu 16.04, ele quebrará o strongSwan. Este pacote contém af-alg
, ctr
e gcrypt
plugins e eles entram em conflito com o openssl
plugin. Nesse caso, você deve remover o pacote libstrongswan-standard-plugins
contendo openssl
plugin ou desativar openssl
plugin:
sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/openssl.conf
ou af-alg
, ctr
e gcrypt
plugins:
sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/{af-alg,ctr,gcrypt}.conf
Gerar chaves e certificados
Você precisa gerar sua própria CA primeiro, depois é necessário gerar o certificado do usuário com a extensão X509v3 Subject Alternative Name (SAN) ( strongSwan FAQ ), que deve corresponder ao nome comum do requerente do certificado (CN). Ou seja O certificado com o assunto CN=client
deve conter DNS:client
SAN. Isso permitirá que você especifique a identidade EAP sem o prefixo CN=
em strongSwan. Por padrão, o strongSwan transfere o assunto do certificado completo como identidade EAP, mas o gateway da VPN do Azure não oferece suporte a isso. Você pode ler mais sobre a história do CN vs SAN: link .
# Generate CA
ipsec pki --gen --outform pem > caKey.pem
ipsec pki --self --in caKey.pem --dn "CN=VPN CA" --ca --outform pem > caCert.pem
# Print CA certificate in base64 format, supported by Azure portal. Will be used later in this document.
openssl x509 -in caCert.pem -outform der | base64 -w0 ; echo
# Generate user's certificate and put it into p12 bundle.
export PASSWORD="password"
export USERNAME="client"
ipsec pki --gen --outform pem > "${USERNAME}Key.pem"
ipsec pki --pub --in "${USERNAME}Key.pem" | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem --dn "CN=${USERNAME}" --san "${USERNAME}" --flag clientAuth --outform pem > "${USERNAME}Cert.pem"
# Generate p12 bundle
openssl pkcs12 -in "${USERNAME}Cert.pem" -inkey "${USERNAME}Key.pem" -certfile caCert.pem -export -out "${USERNAME}.p12" -password "pass:${PASSWORD}"
Em seguida, abra o portal do Azure, localize seu "Gateway de rede virtual" e sua página Configuração ponto a ponto na seção Certificados raiz cole a CA codificada em base64 impressa acima.
Configurar o cliente
Localize o botão Download do cliente VPN na página de configuração ponto-a-ponto do gateway e descompacte a VpnServerRoot.cer
CA do arquivo ZIP baixado:
sudo unzip -j downloaded.zip Generic/VpnServerRoot.cer -d /etc/ipsec.d/cacerts
Você pode verificar usando o comando abaixo:
openssl x509 -inform der -in /etc/ipsec.d/cacerts/VpnServerRoot.cer -text -noout
Em seguida, extraia o DNS do servidor VPN:
$ unzip -p downloaded.zip Generic/VpnSettings.xml | grep VpnServer
<VpnServer>azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net</VpnServer>
Use o valor VpnServer para o valor right
e para o valor rightid
prefixado com %
em ipsec.conf
abaixo.
Copie o pacote p12 do usuário no diretório correspondente:
sudo cp client.p12 /etc/ipsec.d/private/
Use a seguinte configuração /etc/ipsec.conf
:
config setup
conn azure
keyexchange=ikev2
type=tunnel
leftfirewall=yes
left=%any
leftauth=eap-tls
leftid=%client # use the DNS alternative name prefixed with the %
right=azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net # Azure VPN gateway address
rightid=%azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net # Azure VPN gateway address, prefixed with %
rightsubnet=0.0.0.0/0
leftsourceip=%config
auto=add
e /etc/ipsec.secrets
content:
: P12 client.p12 'password' # key filename inside /etc/ipsec.d/private directory
Em seguida, reinicie o ipsec para reler a configuração e iniciar o túnel:
sudo ipsec restart
sudo ipsec up azure
Problema MTU / MSS
O cliente VPN IPsec pode ter problemas de conectividade devido aos altos valores de MTU / MSS e Fragmentação IKE . Para resolver esse problema, você deve definir explicitamente o valor 1350 para MTU / MSS iside a configuração kernel-netlink
do charon
strongSwan (essa configuração funciona apenas na versão strongSwan > = 5.2.1). Defina os valores mtu
e mss
dentro do arquivo de configuração /etc/strongswan.d/charon/kernel-netlink.conf
:
mss = 1350
mtu = 1350
e reinicie o túnel:
sudo ipsec restart
sudo ipsec up azure