OPENSWAN – CONFIGURANDO UMA CONEXÃO VPN SITE-TO-SITE E SIMULANDO COM GNS3

INTRODUÇÃO

De introdução do GNS3, usando os conceitos apresentados, montarei um ambiente com dois servidores em locais separados que precisam se comunicar pela internet utilizando um conexão segura, o jeito mais simples é instalar o Openswan e criar uma VPN IPsec entre as localidades.

O objetivos desse artigo são:

  • Criar o ambiente de simulação usando o GNS3 e configurar regras básicas do firewall.
  • Mostrar a instalação e configuração do Openswan no Debian Jessie em ambas as pontas (Peers).
  • Validar o funcionamento da conexão VPN IPsec.

Antes de começar:

Ao longo do artigo estarei citando a matriz da empresa XPTO sendo Site-A e o novo escritório sendo Site-B.
Sempre que referir a “Site” quero dizer local, escritório, empresa, e não ao significado mais comum que é relacionado a sites de internet, ou seja fazer uma VPN Site-to-Site é fechar uma conexão entre dois escritórios ou empresas.

 


Os servidores com hostname D8-xxxx serão maquinas virtuais no VirtualBox utilizadas pelo GNS3, o Desk02 e BB-Saida-Internet serão túneis configurado no host hospedeiro.

Estudo de caso:

A empresa XPTO possui uma matriz (Site-A) com duas redes, 172.16.10.0/24 é a rede servidores onde existe uma aplicação de intranet, a rede de desktop é 172.16.0.0/24, por ser adepta de software open decidiu usar firewalls, servidores e desktop Linux, optando pela distribuição Debian 8.

Recentemente adquiriu um novo escritório (Site-B), que será implantado outra aplicação que irá se comunicar com os servidores do escritório principal (Site-A) a rede de servidores desse escritório é 192.168.0.0/24. Devido aos altos custos de um link ponto a ponto decidiu adquirir um link de internet para comunicação entre os sites, o Site-A possui o IP válido 201.27.8.2 e o Site-B 187.8.230.2, no entanto os dados que trafegam entre os servidores são sigilosos e por isso a comunicação deve ser criptografada. Portando é necessário a implantação de uma solução simples, rápida e segura para conectar os sites.

O primeiro software que vem na mente do administrador de rede é o Openswan, que atende a todos os requisitos.

Descrição dos hosts:

  • D8-FW02 – Firewall do Site-A onde sera instalado o Openswan.
  • D8-FW01 – Firewall do Site-B onde sera instalado o Openswan.
  • D8-SRV02 – Servidor de aplicação do Site-A.
  • D8-SRV01 – Servidor de aplicação do Site-B.
  • D8-BB01 – Servidor que fará o papel de backbone da operadora de internet entre os dois sites, de forma resumida ele será apenas um servidor em bridge entre os dois sites e um gateway de internet para todos os hosts.
  • Desk02 – Desktop do Site-A que utilizará o túnel tap1.
  • BB-Saida-Internet – Backbone que permite a saída para internet de toda rede GNS, utilizará o túnel tap0.

Abstraindo o estudo de caso a cima, a situação da empresa XPTO é a seguinte:

Linux: Openswan - Configurando uma conexão VPN Site-to-Site e simulando com GNS3

 

CONFIGURANDO VMS E HOST HOSPEDEIRO

 

Aqui estão todas as configurações utilizadas nas VMs e no host hospedeiro para deixar o ambiente do GNS3 funcional:

Host: D8-SRV02

Editar o arquivo interfaces:

# vim /etc/network/interfaces

Deixar com o seguinte conteúdo:

# IP da eth0
allow-hotplug eth0
iface eth0 inet static
address 172.16.10.150
netmask 255.255.255.0
gateway 172.16.10.254

Host: D8-FW02

Editar arquivo interfaces:

# vim /etc/network/interfaces

Deixar com o seguinte conteúdo:

# Rede de servidores
allow-hotplug eth0
iface eth0 inet static
address 172.16.10.254
netmask 255.255.255.0

# Rede de desktops
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.254
netmask 255.255.255.0

# Rede WAN
allow-hotplug eth2
iface eth2 inet static
address 201.27.8.2
netmask 255.255.255.252
gateway 201.27.8.1

Criar script de iptables fwregras.sh:

# vim /usr/local/bin/fwregras.sh

Adicionar o seguinte conteúdo:

#!/bin/bash
# Permitir a passagem de pacotes pelo firewall
echo 1 > /proc/sys/net/ipv4/ip_forward

# Limpar as regras anteriores de NAT, caso o script seja executado mais de uma vez
iptables -t nat -F

# Permitir a passagem dos IPs privados sem entrar no NAT
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -o eth2 -j ACCEPT
iptables -t nat -A POSTROUTING -d 172.16.0.0/12 -o eth2 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.0.0/16 -o eth2 -j ACCEPT

# NAT para qualquer IP de origem da rede interna
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth2 -j MASQUERADE

Alterar permissão do script fwregras.sh:

# chmod 755 /usr/local/bin/fwregras.sh

Configurar script para iniciar junto com o sistema, editando o arquivo rc.local:

# vim /etc/rc.local

Deixar com o seguinte conteúdo:

/usr/local/bin/fwregras.sh
exit 0

Host: D8-FW01

Editar o arquivo interfaces:

# vim /etc/network/interfaces

Deixar com o seguinte conteúdo:

# Rede de servidores
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.254
netmask 255.255.255.0

# Rede WAN
allow-hotplug eth1
iface eth1 inet static
address 187.8.230.2
netmask 255.255.255.252
gateway 187.8.230.1

Criar script de iptables fwregras.sh:

# vim /usr/local/bin/fwregras.sh

Adicionar o seguinte conteúdo:

# Permitir a passagem de pacotes pelo firewall
echo 1 > /proc/sys/net/ipv4/ip_forward

# Limpar as regras anteriores de NAT, caso o script seja executado mais de uma vez
iptables -t nat -F

# Permitir a passagem dos IPs privados sem entrar no NAT
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -d 172.16.0.0/12 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.0.0/16 -o eth1 -j ACCEPT

# NAT para qualquer IP de origem da rede interna
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE

Alterar permissão do script fwregras.sh:

# chmod 755 /usr/local/bin/fwregras.sh

Configurar script para iniciar junto com o sistema, editando o arquivo rc.local:

# vim /etc/rc.local

Deixar com o seguinte conteúdo:

/usr/local/bin/fwregras.sh
exit 0

Host: D8-SRV01

Editar o arquivo interfaces:

# vim /etc/network/interfaces

Deixar com o seguinte conteúdo:

# IP da eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.250
netmask 255.255.255.0
gateway 192.168.0.254

Host: D8-BB01

Editar o arquivo interfaces:

# vim /etc/network/interfaces

Deixar com o seguinte conteúdo:

# Rede para saída da internet
allow-hotplug eth0
iface eth0 inet static
address 177.8.8.2
netmask 255.255.255.252
gateway 177.8.8.1

# Bloqueando o roteamento de IPs privados
up route add -net 10.0.0.0/8 reject
up route add -net 172.16.0.0/12 reject
up route add -net 192.168.0.0/16 reject

# Rede do Site-B
allow-hotplug eth1
iface eth1 inet static
address 187.8.230.0
netmask 255.255.255.252

# Rede do Site-A
allow-hotplug eth0
iface eth0 inet static
address 201.27.8.0
netmask 255.255.255.252

Criar script de iptables fwregras.sh:

# vim /usr/local/bin/fwregras.sh

Adicionar o seguinte conteúdo.

#!/bin/bash
# Permitir a passagem de pacotes pelo firewall
echo 1 > /proc/sys/net/ipv4/ip_forward

# NAT necessário para a comunicação funcionar com a interface tuntap
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Alterar permissão do script fwregras.sh

# chmod 755 /usr/local/bin/fwregras.sh

Configurar script para iniciar junto com o sistema, editando o arquivo rc.local:

# vim /etc/rc.local

Deixar com o seguinte conteúdo:

/usr/local/bin/fwregras.sh
exit 0

HOST HOSPEDEIRO

Configurações do tunel tap0, utilizado para simular Desk02:

$ sudo ip tuntap add dev tap1 mode tap
$ sudo ifconfig tap1 172.16.0.100 netmask 255.255.255.0 up

Configurações do tunel tap1, utilizado para simular o BB-Saida-internet:

$ sudo ip tuntap add dev tap0 mode tap
$ sudo ifconfig tap0 177.8.8.1 netmask 255.255.255.0 up

Rota para a rede de servidores Site-A:

$ sudo route add -net 172.16.10.0/24 gw 172.16.0.254

Rota para a rede de servidores Site-B:

$ sudo route add -net 192.168.0.0/24 gw 172.16.0.254

Permitir a passagem de pacotes pela interface:

$ sudo sh -c “echo 1 > /proc/sys/net/ipv4/ip_forward”

Mascarar a saída permitindo o acesso a internet das VMs, substituir wlp9s0 pela interface de rede do host hospedeiro:

$ sudo iptables -t nat -A POSTROUTING -o wlp9s0 -j MASQUERADE

 

INSTALAÇÃO E CONFIGURAÇÃO DO OPENSWAN

 

Quando comecei a montar o ambiente tive uma surpresa ao descobrir que o Openswan não está disponível no repositório oficial do Debian 8 Jessie, para instalar precisei usar o sources.list do Debian 7 Wheezy.

Caso utilize Openswan no Debian 8 deixe nos comentários como está o funcionamento do serviço, pois não testei a fundo se existia alguma incompatibilidade ou instabilidade.

Instalando o Openswan, executar nos servidores D8-FW01 e D8-FW02:

# apt-get update
# apt-get install openswan

Configurando o Openswan, editar arquivo ipsec.conf, deixar a mesma configuração em ambos os servidores.

# vim /etc/ipsec.conf

Esse é o principal arquivo de configuração do IPsec, poderíamos configurar todos os túneis aqui, porém acho pouco prático, por isso sempre adiciono a linha include “/etc/ipsec.d/ipsec.*”,com isso qualquer arquivo salvo no diretório /etc/ipsec.d/ e que comece com ipsec é lido e pode se tornar uma conexão VPN, bem interessante para quando temos muitos túneis VPN com empresas e escritórios diferentes. Deixe o arquivo com o seguinte conteúdo:

# /etc/ipsec.conf – Openswan IPsec configuration file
# This file:  /usr/share/doc/openswan/ipsec.conf-sample
#
# Manual:     ipsec.conf.5
version 2.0
# basic configuration
config setup
dumpdir=/var/run/pluto/
nat_traversal=yes
nhelpers=0
protostack=netkey
plutodebug=none
klipsdebug=none
# Add connections here
include /etc/ipsec.d/ipsec.*

Devemos criar o arquivo de conexão VPN IPsec, a única regra nesse caso é que o nome do arquivo deve começar com ipsec. É interessante colocar um nome para identificar a conexão de formar fácil, gosto de usar a seguinte nomenclatura:

ipsec.empresa.destino

Sendo assim o nome do arquivo ficará:

  • Site-A: ipsec.xpto.site-b
  • Site-B: ipsec.xpto.site-a

Criar o arquivo de conexão do IPsec com o Site-B, para o servidor D8-FW02:

# vim /etc/ipsec.d/ipsec.xpto.site-b

Deixar com o seguinte conteúdo:

conn xpto-site-b1
type=tunnel
left=201.27.8.2
leftsubnets={172.16.0.0/24172.16.10.0/24}
leftnexthop=201.27.8.1
right=187.8.230.2
rightsubnet=192.168.0.0/24
authby=secret
auth=esp
keylife=24h
keyexchange=ike
ike=3des-md5-modp1024
esp=3des-md5-96
rekey=no
rekeymargin=8h
rekeyfuzz=25%
pfs=no
auto=start

Criar o arquivo de conexão do IPsec com o Site-A, para o servidor D8-FW01:

# vim /etc/ipsec.d/ipsec.xpto.site-a

Deixar com o seguinte conteúdo:

conn xpto-site-a
type=tunnel
left=187.8.230.2
leftsubnets=192.168.0.0/24
leftnexthop=187.8.230.1
right=201.27.8.2
rightsubnets={172.16.10.0/24,172.16.0.0/24}
authby=secret
auth=esp
keylife=24h
keyexchange=ike
ike=3des-md5-modp1024
esp=3des-md5-96
rekey=no
rekeymargin=8h
rekeyfuzz=25%
pfs=no
auto=start

Os únicos itens que precisam ser alterados são:

  • conn – Nome do túnel VPN, muito utilizada para troubleshooting, uso o mesmo conceito do nome do arquivo, empresa-destino. Todavia pode-se deixar igual o nome em ambos os sites que não causa problema, é mais questão de identificação.
  • left – É o IP válido do site em que se está (Peer).
  • leftsubnets – Redes que o site possui e entraram no túnel, caso seja mais de uma deve se utilizar chaves e vírgula para separar as redes.
  • leftnexthop – IP do gateway do IP válido.
  • right – IP válido do site remoto que fará a conexão (Peer).
  • rightsubnet – Redes que o site remoto possui ao entrar no túnel, caso seja mais de uma deve se utilizar chaves e vírgula para separar as redes.

Precisamos ainda configurar o arquivo ipsec.secrets, responsável pela senha usado entre os Peers.

Editar o arquivo ipsec.secrets em ambos os hosts:

# vim /etc/ipsec.secrets

A configuração é simples:

left right: PSK “senha”

No D8-FW02 deixar com o seguinte conteúdo:

201.27.8.2 187.8.230.2: PSK “123456”

No D8-FW01 deixar com o seguinte conteúdo:

187.8.230.2 201.27.8.2: PSK “123456”

Basta habilitar e iniciar o serviço IPsec em ambos os servidores

# systemctl enable ipsec
# systemctl start ipsec

 

VALIDAR FUNCIONAMENTO DA VPN IPSEC

 

Agora que tudo esta instalado e configurado basta validar o funcionamento!

# systemctl status ipsec

Mostra o status do serviço do IPsec, se esta em execução e se existe algum erro.

Linux: Openswan - Configurando uma conexão VPN Site-to-Site e simulando com GNS3

# ipsec auto –status

Mostra o status de todos os túneis VPN bem útil para saber se existe alguma coisa errada, exemplo pendente fase 2. Na imagem a baixo usei o complemento | grep xpto –color para trazer itens apenas da conexão xpto.

Linux: Openswan - Configurando uma conexão VPN Site-to-Site e simulando com GNS3

Teste de traceroute do D8-SRV02 (Site-A) para o D8-SRV01 (Site-B):

Linux: Openswan - Configurando uma conexão VPN Site-to-Site e simulando com GNS3

Veja que existe apenas três saltos:

  1. Gateway de rede do Site-A, host D8-FW02.
  2. Todo o caminho percorrido dentro do túnel VPN.
  3. Host de destino.

Isso porque a conexão entre os host é pelo túnel IPsec, se tornando uma conexão ponto a ponto.

Um detalhe importante é que os Peers (D8-FW01 e D8-FW02) não entram no túnel IPsec devido ao IP de saída (IPs válidos) não corresponderem aos leftsubnets da configuração do ipsec. Por isso para executar um ping ou conectar SSH devemos usar um IP da interface que corresponda ao leftsubnets.

Para conectar do firewall D8-FW02 (Site-A) no servidor D8-SRV01 (Site-B):

# ssh -b 172.16.0.254 192.168.0.250

Para testar a resposta do ping do firewall D8-FW02 (Site-A) no servidor D8-SRV01 (Site-B):

# ping -I eth0 192.168.0.250

CONSIDERAÇÕES E REFERÊNCIAS

O script com regras iptables fwregras.sh foi escrito da forma mais simples possível para fazer a conexão VPN funcionar, porém não é um firewall, as políticas padrão foram deixadas no default que é ACCEPT, fiz isso pois o foco é o Openswan e não o iptables.

No artigo usei dois procedimentos para facilitar a escrita e entendimento porém NÃO recomendo em ambiente de produção:

  1. Todas as configurações foram realizadas com usuário root nos servidores, o ideal é sempre usar o sudo.
  2. A senha do arquivo /etc/ipsec.secrets foi 123456, sendo uma chave muito fraca, o ideal é usar no mínimo 16 caracteres contendo letras, números e caracteres especiais.

Não entrei em detalhes de cada parâmetro de configurações do Openswan justamente por existir vários sites com documentação melhor detalhada, segue sites que utilize como referências:

Rolar para cima