Bridged VPN with Linux and OpenVPN

From Pruonckk.org

Conteúdo

Prefacio

A ideia deste manual veio por uma necessidade que tive de realizar uma migração de datacenter, eu tenho 200 MB de link em um datacenter e 200 MB e outro e mais um link de 100 MB que eu usava para outros serviços, como se tratava de 120 servidores para serem migrados, alterar os ips de cada servidor para uma outra faixa se mostrava um pouco fora de mão, a quantidade de problemas poderia ser muito grande, deste modo comecei a fazer algumas pesquisas a respeito de VPN em modo bridge e o OpenVPN foi a primeira opção que me apareceu, realizei a configuração e o resultado foi satisfatório.


Dependencias

A unica coisa que precisamos é openvpn e o bridge-utils, se você estiver no debian execute:

apt-get install openvpn bridge-utils


Configurando a rede

Vamos imaginar que você tem na maquin que será o servidor duas placas de rede, uma ligada a internet e outra que é a sua rede, deste modo temos que criar uma bridge, o procedimento abaixo deverá ser executado tanto no equipamentoA quanto no equipamentoB

 brctl addbr br0
 brctl addif eth0

Agora ao inves de manter seu ip na eth0 você pode colocar na br0 se for o caso, na eth1 no caso é onde está nossa conexão com a internet

Arquivo interfaces do Debian

EquipamentoA

No arquivo /etc/network/interfaces sua configuração ficará como no exemplo abaixo.

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

# Rede local a qual eu quero disponibilizar na bridge
auto br0
iface br0 inet static
     bridge_ports eth0
     address 172.16.10.1
     netmask 255.255.255.0

# Configuracao para conexao com internet
auto eth1
iface eth1 inet static
     address 192.168.10.1
     netmask 255.255.255.0
     gateway 192.168.10.254

EquipamentoB

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manul

# Esta interface esta ligada diretamente a um switch
# e atraves deste chega ao gateway para sair para internet
# voce pode ter outra interface, basta acrescentar a interface
# a ser compcartilhada na bridge (caso de voce ter um firewall ou algo assim
# armando a vpn )

auto br0
iface br0 inet static
     bridge_ports eth0
     address 192.168.20.1
     netmask 255.255.255.0
     gateway 192.168.20.254
     


Configurando o OpenVPN

Agora temos a rede deviamente configurada podemos proceder com a configuração do openvpn , basicamente trata-se em criar as chaves criptograficas/certificados e aplicar a configuração.

Criando as Chaves

No caso do debian temos alguns scripts localizados em /usr/share/doc/openvpn/examples/easy-rsa

Voce deve editar o arquivo vars localizado neste diretorio com os seus dados e então executar os seguintes comandos:

# Carregando as variavies
. ./vars

# Limpando qualquer chave gerada anteriormente (diretorio keys)
./clean-all

# Criando o certificado
./build-ca

# Criando a chave para o servidor
./build-key-server server

# Criando a chave para o cliente
./build-key client

# Criando o par DH
./build-dh

# gerando a chave para o TLS
openvpn --genkey --secret keys/ta.key

Agora você tem um diretorio keys com os arquivos dentro, copie este arquivo para o diretorio /etc/openvpn

cp -rfp keys /etc/openvpn/

Depois copie para o equipamento que será o cliente do openvpn (também para o diretorio /etc/openvpn)

Configurando o OpenVPN

Vamos agora gerar a configuração para o serviço

Equipamento A

Crie o arquivo /etc/openvpn/server.conf com a seguinte configuração

# Modo de operacao
mode server

# protocolo a ser utilizado
proto udp

# Porta que vai rodar os servico
port 1194

# Tipo de Dispositivo (para bridge tem que ser tap, o tap0 é porque vamos criar manualmente)
dev tap0

# Verificação da conexao
keepalive 10 120

# Tipo de operacao
daemon

# Local para escrita do pid
writepid /var/run/openvpn.pid

# Quantidade maxima de conexoes
max-clients 10

# usuario e grupo
user nobody
group nogroup

# tipo de chave
persist-key

# tipo de tunel
persist-tun

# Nivel de informacao no log
verb 3

# MTU 
tun-mtu 1500

mssfix 1400
tun-mtu-extra 32
mute 20

# tipo de conexao
client-to-client

duplicate-cn

# especificacao para usar tls
tls-server

# certificado tls
tls-auth keys/ta.key 0

# configuracoes para as chaves
cd /etc/openvpn
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem

Equipamento B

Crie o arquivo /etc/openvpn/client.conf com o seguinte conteudo:

# Tipo de operacao
client

# Protocolo
proto udp

# Interface
dev tap0

# Host remoto (equipamento A)
remote XXX.XXX.XXX.XXX 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
daemon
writepid /var/run/openvpn.pid
verb 3
mute 20
user nobody
group nogroup
cd /etc/openvpn
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-auth keys/ta.key 1

Script de inicialização

Crie o arquivo /etc/init.d/vpn com o seguinte conteudo

#!/bin/bash

case "$1" in
  stop)
    kill -9 $(pidof openvpn)
    ;;
  *)
    if ! brctl show | grep -q tap0; then
      openvpn --mktun --dev tap0
      brctl addif br0 tap0
      ifconfig tap0 0.0.0.0 promisc up
    fi
    # Altere o valor abaixo (server.conf) para cliente.conf se este for
    # o equipamento cliente (equipamento B)
    openvpn --config /etc/openvpn/server.conf
    ;;
esac

De permissão de execução:

chmod +x /etc/init.d/vpn

Removendo o openvpn padrao da inicialização

No caso do debian é criado na instalação do openvpn o arquivo /etc/rc2.d/S16openvpn , remova este arquivo e execute o seguinte:

 ln -s /etc/init.d/vpn /etc/rc2.d/S99vpn

Execute o procedimento acima nos dois equipamentos


Iniciando a VPN

Execute os seguintes passos no equipamento A (servidor) e depois no equipamento B (cliente)

Para iniciar execute:

/etc/init.d/vpn start

Se quiser verificar os logs quanto a erro ou acompanhar a conexão digite

tail -f /var/log/syslog


Se não houver nenhum problema você verá uma informação similar a abaixo.


Log equipamento A

Sep  3 13:30:52 vpn openvpn[2515]: OpenVPN 2.1_rc11 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] built on Sep 18 2008
Sep  3 13:30:52 vpn openvpn[2515]: Diffie-Hellman initialized with 1024 bit key
Sep  3 13:30:52 vpn openvpn[2515]: /usr/bin/openssl-vulnkey -q -b 1024 -m <modulus omitted>
Sep  3 13:30:53 vpn openvpn[2515]: Control Channel Authentication: using 'keys/ta.key' as a OpenVPN static key file
Sep  3 13:30:53 vpn openvpn[2515]: Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 13:30:53 vpn openvpn[2515]: Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 13:30:53 vpn openvpn[2515]: TLS-Auth MTU parms [ L:1573 D:166 EF:66 EB:0 ET:0 EL:0 ]
Sep  3 13:30:53 vpn openvpn[2515]: TUN/TAP device tap0 opened
Sep  3 13:30:53 vpn openvpn[2515]: TUN/TAP TX queue length set to 100
Sep  3 13:30:53 vpn openvpn[2515]: Data Channel MTU parms [ L:1573 D:1400 EF:41 EB:4 ET:32 EL:0 ]
Sep  3 13:30:53 vpn openvpn[2517]: GID set to nogroup
Sep  3 13:30:53 vpn openvpn[2517]: UID set to nobody
Sep  3 13:30:53 vpn openvpn[2517]: Socket Buffers: R=[111616->131072] S=[111616->131072]
Sep  3 13:30:53 vpn openvpn[2517]: UDPv4 link local (bound): [undef]:1194
Sep  3 13:30:53 vpn openvpn[2517]: UDPv4 link remote: [undef]
Sep  3 13:30:53 vpn openvpn[2517]: MULTI: multi_init called, r=256 v=256
Sep  3 13:30:53 vpn openvpn[2517]: Initialization Sequence Completed
Sep  3 13:30:54 vpn openvpn[2517]: MULTI: multi_create_instance called
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Re-using SSL/TLS context
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Control Channel MTU parms [ L:1573 D:166 EF:66 EB:0 ET:0 EL:0 ]
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Data Channel MTU parms [ L:1573 D:1400 EF:41 EB:4 ET:32 EL:0 ]
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Local Options hash (VER=V4): '47de3ccc'
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Expected Remote Options hash (VER=V4): '1a647362'
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 TLS: Initial packet from XXX.XXX.XXX.XXX:40151, sid=724c3c4b a822e41f
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 VERIFY OK: depth=1, /C=BR/ST=SP/L=Sao-Paulo/O=Braslink/CN=server/emailAddress=mike@ultra.net.br
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 VERIFY OK: depth=0, /C=BR/ST=SP/L=Sao-Paulo/O=Braslink/CN=client/emailAddress=mike@ultra.net.br
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Sep  3 13:30:54 vpn openvpn[2517]: XXX.XXX.XXX.XXX:40151 [client] Peer Connection Initiated with XXX.XXX.XXX.XXX:40151
Sep  3 13:30:54 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 MULTI: no dynamic or static remote --ifconfig address is available for client/XXX.XXX.XXX.XXX:40151
Sep  3 13:30:55 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 PUSH: Received control message: 'PUSH_REQUEST'
Sep  3 13:30:55 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 SENT CONTROL [client]: 'PUSH_REPLY,ping 10,ping-restart 120' (status=1)
Sep  3 13:30:55 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 MULTI: Learn: 00:0f:8f:42:77:f0 -> client/XXX.XXX.XXX.XXX:40151
Sep  3 13:30:55 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 MULTI: Learn: 00:14:22:11:06:8a -> client/XXX.XXX.XXX.XXX:40151
Sep  3 13:30:57 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 MULTI: Learn: 00:07:50:e7:ba:e1 -> client/XXX.XXX.XXX.XXX:40151
Sep  3 13:30:57 vpn openvpn[2517]: client/XXX.XXX.XXX.XXX:40151 MULTI: Learn: 00:00:0c:07:ac:03 -> client/XXX.XXX.XXX.XXX:40151
Sep  3 13:31:03 vpn kernel: [   68.501476] tap0: no IPv6 routers present

Log equiamento B

Sep  3 12:07:32 routerlinux openvpn[3196]: OpenVPN 2.1_rc11 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] built on Sep 18 2008
Sep  3 12:07:32 routerlinux openvpn[3196]: /usr/bin/openssl-vulnkey -q -b 1024 -m <modulus omitted>
Sep  3 12:07:32 routerlinux openvpn[3196]: Control Channel Authentication: using 'keys/ta.key' as a OpenVPN static key file
Sep  3 12:07:32 routerlinux openvpn[3196]: Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 12:07:32 routerlinux openvpn[3196]: Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 12:07:32 routerlinux openvpn[3196]: Control Channel MTU parms [ L:1573 D:166 EF:66 EB:0 ET:0 EL:0 ]
Sep  3 12:07:32 routerlinux openvpn[3196]: Data Channel MTU parms [ L:1573 D:1450 EF:41 EB:4 ET:32 EL:0 ]
Sep  3 12:07:32 routerlinux openvpn[3196]: Local Options hash (VER=V4): '1a647362'
Sep  3 12:07:32 routerlinux openvpn[3196]: Expected Remote Options hash (VER=V4): '47de3ccc'
Sep  3 12:07:32 routerlinux openvpn[3198]: NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
Sep  3 12:07:32 routerlinux openvpn[3198]: Socket Buffers: R=[111616->131072] S=[111616->131072]
Sep  3 12:07:32 routerlinux openvpn[3198]: UDPv4 link local: [undef]
Sep  3 12:07:32 routerlinux openvpn[3198]: UDPv4 link remote: XXX.XXX.XXX:1194
Sep  3 12:07:32 routerlinux openvpn[3198]: TLS: Initial packet from XXX.XXX.XXX.XXX:1194, sid=ec8a7fa4 3ee31dbe
Sep  3 12:07:32 routerlinux openvpn[3198]: VERIFY OK: depth=1, /C=BR/ST=SP/L=Sao-Paulo/O=Braslink/CN=server/emailAddress=mike@ultra.net.br
Sep  3 12:07:32 routerlinux openvpn[3198]: VERIFY OK: nsCertType=SERVER
Sep  3 12:07:32 routerlinux openvpn[3198]: VERIFY OK: depth=0, /C=BR/ST=SP/L=Sao-Paulo/O=Braslink/CN=server/emailAddress=mike@ultra.net.br
Sep  3 12:07:32 routerlinux openvpn[3198]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sep  3 12:07:32 routerlinux openvpn[3198]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 12:07:32 routerlinux openvpn[3198]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sep  3 12:07:32 routerlinux openvpn[3198]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Sep  3 12:07:32 routerlinux openvpn[3198]: Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Sep  3 12:07:32 routerlinux openvpn[3198]: [server] Peer Connection Initiated with XXX.XXXX.XXX.XXX:1194
Sep  3 12:07:33 routerlinux openvpn[3198]: SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Sep  3 12:07:33 routerlinux openvpn[3198]: PUSH: Received control message: 'PUSH_REPLY,ping 10,ping-restart 120'
Sep  3 12:07:33 routerlinux openvpn[3198]: OPTIONS IMPORT: timers and/or timeouts modified
Sep  3 12:07:33 routerlinux openvpn[3198]: TUN/TAP device tap0 opened
Sep  3 12:07:33 routerlinux openvpn[3198]: TUN/TAP TX queue length set to 100
Sep  3 12:07:33 routerlinux openvpn[3198]: GID set to nogroup
Sep  3 12:07:33 routerlinux openvpn[3198]: UID set to nobody
Sep  3 12:07:33 routerlinux openvpn[3198]: Initialization Sequence Completed
Sep  3 12:17:01 routerlinux /USR/SBIN/CRON[3202]: (root) CMD (   cd / && run-parts --report /etc/cron.


Feito isso basta configurar uma maquina de sua rede com o ip da outra rede , lembrando que como é uma bridge, todo o trafego atravessa pro outro lado, inclusive netbios e outros pacotes.


Grafico Gerado do Trafego na VPN

Apenas lembrando essa vpn foi feita de um datacenter com um link de 200 MB para outro com 200 MB mas utilizando um terceiro link de 100 MB, como pode ser verificado a mesma consegue trafegar uma quantidade bem grande de dados, de um lado havia um P4 3.2 com 2 GB de ram, e do ultro um dual Xeon 3.2 com 4 GB de ram, o ambiente foi montado devido a necessidade de migrar de um datacenter para o outro fisicamente sem que houvesse a necessidade de alterações de IPS (isso graças ao fato de utilizarmos BGP e os ips obviamente são nossos), o trafego maximo que atravessou a vpn foi de 96 MB


image:Colohouse-vpn-eth0-day.png

Ferramentas pessoais
Inutilidades