Instalando e Configurando o OpenVPN no FreeBSD 9.0

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

  1. IP Externo da matriz: 200.200.200.1 IP Externo da filial: 200.200.200.2
  2. Rede interna da Matriz: 192.168.10.0/24
  3. Rede interna da filial: 192.168.11.0/24
  4. Rede da vpn 10.254.0.0/24
  5. Interface da vpn: tun0

Vamos obter os ports caso ainda não os tenha

portsnap fetch && portsnap extract && portsnap update

Matriz

Agora vamos acessar o ports do openvpn e vamos instalar, deixe as opções padrões quando questionado

cd /usr/ports/security/openvpn
make install clean distclean

Agora vamos criar o diretório que vai conter a configuração da openvpn

mkdir /usr/local/etc/openvpn

Agora precisamos copiar os binários para criação de chaves

cp -Rfa /usr/local/share/doc/openvpn/easy-rsa/2.0 /usr/local/etc/openvpn/easy-rsa

Agora precisamos acertar as permissões do diretório que contém os binários

chmod 0755 /usr/local/etc/openvpn/easy-rsa/*

Agora vamos acertar a quantidade de bits da criptografia da chave da CA

vim /usr/local/etc/openvpn/easy-rsa/vars
[...]
export KEY_SIZE=2048

Agora vamos acessar o diretório para a criação da ca.key e carregar as variáveis

cd /usr/local/etc/openvpn/easy-rsa && source vars && ./clean-all

Agora vamos gerar a CA

cd /usr/local/etc/openvpn/easy-rsa
./build-ca 
Generating a 2048 bit RSA private key
.........................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:BR
State or Province Name (full name) [CA]:PR
Locality Name (eg, city) [SanFrancisco]:Curitiba
Organization Name (eg, company) [Fort-Funston]:Douglas
Organizational Unit Name (eg, section) [changeme]:TI
Common Name (eg, your name or your server's hostname) [changeme]:server
Name [changeme]:server
Email Address [mail@host.domain]:douglas.q.santos@gmail.com

Agora vamos gerar a chave do nosso servidor

cd /usr/local/etc/openvpn/easy-rsa
./build-key-server server
Generating a 2048 bit RSA private key
..................................................................................+++
.....+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:BR
State or Province Name (full name) [CA]:PR
Locality Name (eg, city) [SanFrancisco]:Curitiba
Organization Name (eg, company) [Fort-Funston]:Douglas
Organizational Unit Name (eg, section) [changeme]:TI
Common Name (eg, your name or your server's hostname) [server]:
Name [changeme]:server
Email Address [mail@host.domain]:douglas.q.santos@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'BR'
stateOrProvinceName   :PRINTABLE:'PR'
localityName          :PRINTABLE:'Curitiba'
organizationName      :PRINTABLE:'Douglas'
organizationalUnitName:PRINTABLE:'TI'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'douglas.q.santos@gmail.com'
Certificate is to be certified until Jun 23 00:26:07 2022 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Agora precisamos gerar as chaves de Diffie-Hellman

./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
....................................................................
..........................................+.........................
....................................................................
.............+......................................................
....................................................................
..............................................................+.....
....................................................................
...............................................................++*++

Agora vamos gerar a chave compartilhada para servir de TLS

openvpn --genkey --secret keys/shared.key

Agora vamos criar o arquivo de configuração do servidor

vim /usr/local/etc/openvpn/server.conf 
# porta usada para os clientes conectarem no servidor
port    1194
 
# protocolo usado na conexao
proto   tcp

#Melhorar aplicações remotas
mssfix 1400

# device usado pelo openvpn
dev tun
 
# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-server
 
# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth    keys/shared.key 0
 
# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca  certs/ca.crt
 
# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert    certs/server.crt
key keys/server.key
 
# Parametros Diffie-Hellman
dh  keys/dh2048.pem
 
# Rede usada pelo tunel openvpn
server  10.254.0.0 255.255.255.0
 
# define o arquivo onde sera guardados os ips que os clientes
# obtiverem na conexao, assim os mesmos sempre irao pegar os
# mesmos ips
ifconfig-pool-persist   ipp.txt
 
# define o diretorio onde irao ficar as configuracoes individuais para cada
# cliente, assim você podera habilitar as duas redes se comunicarem.
client-config-dir   ccd
 
# Define a rota para a rede da matriz poder enxergar a rede da filial
route 192.168.11.0 255.255.255.0
 
# Define a rota para a rede da filial poder enxergar a rede da matriz
push "route-delay 2 600"
push "route 192.168.10.0 255.255.255.0"

# Redireciona todo o trafego pela vpn utilizando a vpn como default gw do cliente
#push "redirect-gateway def1"

# Podemos definir quais servidor dns e qual servidor wins o cliente vai ter que utilizar
#push "dhcp-option DNS 192.168.10.248"
#push "dhcp-option DNS 192.168.10.249"
#push "dhcp-option WINS 192.168.10.248"
 
# Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel
client-to-client
 
# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120
 
# Tipo de criptografia usada
cipher  DES-EDE3-CBC
 
# habilita compressão no link VPN
comp-lzo
 
# Numero maximo de clientes (filiais)
max-clients 10
 
# usuário e grupo sob o qual o openvpn ira rodar
user    nobody
group   nobody
 
# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun
 
# Log de status das conexoes
status  /var/log/openvpn/status.log
 
# define um arquivo de log, pois o default é o /var/log/syslog
log /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
 
# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb    3
 
# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute    20

Agora vamos gerar a chave para a nossa filial

cd /usr/local/etc/openvpn/easy-rsa
./build-key filial1
Generating a 2048 bit RSA private key
............................................+++
...................................................................................................................+++
writing new private key to 'filial1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:BR
State or Province Name (full name) [CA]:PR
Locality Name (eg, city) [SanFrancisco]:Curitiba
Organization Name (eg, company) [Fort-Funston]:Douglas
Organizational Unit Name (eg, section) [changeme]:TI
Common Name (eg, your name or your server's hostname) [filial1]:
Name [changeme]:filial1
Email Address [mail@host.domain]:douglas.q.santos@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'BR'
stateOrProvinceName   :PRINTABLE:'PR'
localityName          :PRINTABLE:'Curitiba'
organizationName      :PRINTABLE:'Douglas'
organizationalUnitName:PRINTABLE:'TI'
commonName            :PRINTABLE:'filial1'
name                  :PRINTABLE:'filial1'
emailAddress          :IA5STRING:'douglas.q.santos@gmail.com'
Certificate is to be certified until Jun 23 00:37:42 2022 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Agora vamos criar alguns diretórios para os nosso certificados

cd /usr/local/etc/openvpn/
mkdir certs ccd keys

Agora vamos copiar os certificados para o diretório keys

cd /usr/local/etc/openvpn
cp easy-rsa/keys/*.crt certs/

Agora vamos copiar as chaves para o diretório keys

cd /usr/local/etc/openvpn
cp easy-rsa/keys/*.key easy-rsa/keys/dh2048.pem keys/

Agora vamos criar o arquivo de rotas

O arquivo /etc/openvpn/ccd/filial1 é responsável por definir rotas individuais para os clientes, ou seja, sem ele, o servidor não vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.

echo "iroute 192.168.11.0 255.255.255.0" > /usr/local/etc/openvpn/ccd/filial1

Agora vamos ajustar as permissões de arquivos e diretórios

cd /usr/local/etc/openvpn
chown -R nobody:nobody *
chmod 0440 keys/* certs/* ccd/* server.conf

Criando o diretório de log

Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos.

mkdir /var/log/openvpn

Agora vamos habilitar o openvpn no /etc/rc.conf

vim /etc/rc.conf
[...]
# OpenVPN
openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
openvpn_if="tun"
#Habilita o roteamento
gateway_enable="YES"

Agora vamos iniciar o serviço

/usr/local/etc/rc.d/openvpn start

Agora vamos analisar os logs para ver se está tudo ok

tail -n 100 /var/log/openvpn/openvpn.log 
Tue Jun 26 21:51:24 2012 OpenVPN 2.2.2 amd64-portbld-freebsd9.0 [SSL] [LZO2] [eurephia] built on Jun 24 2012
Tue Jun 26 21:51:24 2012 NOTE: your local LAN uses the extremely common subnet address 192.168.0.x or 192.168.1.x.  Be aware that this might create routing conflicts if you connect to the VPN server from public locations such as internet cafes that use the same subnet.
Tue Jun 26 21:51:24 2012 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Tue Jun 26 21:51:24 2012 Diffie-Hellman initialized with 2048 bit key
Tue Jun 26 21:51:24 2012 Control Channel Authentication: using 'keys/shared.key' as a OpenVPN static key file
Tue Jun 26 21:51:24 2012 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 21:51:24 2012 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 21:51:24 2012 TLS-Auth MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:0 ]
Tue Jun 26 21:51:24 2012 Socket Buffers: R=[42080->65536] S=[9216->65536]
Tue Jun 26 21:51:24 2012 ROUTE default_gateway=192.168.1.1
Tue Jun 26 21:51:24 2012 TUN/TAP device /dev/tun0 opened
Tue Jun 26 21:51:24 2012 /sbin/ifconfig tun0 10.254.0.1 10.254.0.2 mtu 1500 netmask 255.255.255.255 up
Tue Jun 26 21:51:24 2012 /sbin/route add -net 192.168.11.0 10.254.0.2 255.255.255.0
add net 192.168.11.0: gateway 10.254.0.2
Tue Jun 26 21:51:24 2012 /sbin/route add -net 10.254.0.0 10.254.0.2 255.255.255.0
add net 10.254.0.0: gateway 10.254.0.2
Tue Jun 26 21:51:24 2012 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Tue Jun 26 21:51:24 2012 GID set to nobody
Tue Jun 26 21:51:24 2012 UID set to nobody
Tue Jun 26 21:51:24 2012 TCPv4 link local (bound): [undef]:1194
Tue Jun 26 21:51:24 2012 TCPv4 link remote: [undef]
Tue Jun 26 21:51:24 2012 MULTI: multi_init called, r=256 v=256
Tue Jun 26 21:51:24 2012 IFCONFIG POOL: base=10.254.0.4 size=62
Tue Jun 26 21:51:24 2012 IFCONFIG POOL LIST
Tue Jun 26 21:51:24 2012 Initialization Sequence Completed
Tue Jun 26 21:51:24 2012 IPv6 in tun mode is not supported in OpenVPN 2.2

O Lado servidor já está ok.

Agora vamos configurar o lado da filial1, ainda no servidor, pois vamos mover as configurações para a filial via scp ou rsync.

cd /usr/local/etc/openvpn
mkdir -p filial1/{certs,keys}
cp certs/{ca.crt,filial1.crt} filial1/certs/
cp keys/{filial1.key,shared.key} filial1/keys/

Agora vamos criar o arquivo de configuração da filial /usr/local/etc/openvpn/filial1/filial1.conf

vim /usr/local/etc/openvpn/filial1/filial1.conf
# Especifica que este certificado eh de um cliente
client
 
# Define o ip do servidor para o cliente conectar
remote  200.200.200.1
 
# porta usada para os clientes conectarem no servidor
port    1194
 
# protocolo usado na conexao
proto   tcp

#Melhorar aplicações remotas
mssfix 1400
 
# device usado pelo openvpn
dev tun
 
# Diz que o certificado foi assinado pelo servidor
ns-cert-type    server
 
# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-client
 
# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth    keys/shared.key 1
 
# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca  certs/ca.crt
 
# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert    certs/filial1.crt
key keys/filial1.key
 
# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120
 
# Tipo de criptografia usada
cipher  DES-EDE3-CBC
 
# habilita compressão no link VPN
comp-lzo
 
# Ativa a opcao de se conectar, caso o cliente nao esteja na internet, ou
# o mesmo tenha perdido a conexao.
resolv-retry    infinite
 
# Nao especifica uma porta local para o cliente ouvir.
nobind
 
# usuário e grupo sob o qual o openvpn ira rodar
user    nobody
group   nobody
 
# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun
 
# Log de status das conexoes
status  /var/log/openvpn/openvpn-status.log
 
# define um arquivo de log, pois o default é o /var/log/syslog
log /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
 
# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb    3
 
# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute    20

Agora vamos empacotar a nossa configuração da filial e enviar para ela as configurações

tar -czvf filial1.tar.gz filial1/
a filial1
a filial1/certs
a filial1/keys
a filial1/filial1.conf
a filial1/keys/shared.key
a filial1/keys/filial1.key
a filial1/certs/filial1.crt
a filial1/certs/ca.crt

Agora vamos enviar essa configuração para a nossa filial

scp filial1.tar.gz 200.200.200.2:/tmp

Filial

Agora na vamos configurar a filial

Vamos obter os ports caso ainda não os tenha

portsnap fetch && portsnap extract && portsnap update

Agora vamos acessar o ports do openvpn e vamos instalar, deixe as opções padrões quando questionado

cd /usr/ports/security/openvpn
make install clean distclean

Agora vamos criar o diretório que vai conter a configuração da openvpn

mkdir /usr/local/etc/openvpn

Agora vamos desempacotar a os arquivos e certificados e mover para o local correto da openvpn.

cd /tmp
tar -xzvf filial1.tar.gz
mv filial1/* /usr/local/etc/openvpn/
rm -rf /tmp/filial1*

Agora vamos ajustar as permissões de arquivos e diretórios

cd /usr/local/etc/openvpn
chown -R nobody:nobody *
chmod 0440 keys/* certs/* filial1.conf 

Agora vamos criar o diretório que vai armazenas os logs

mkdir /var/log/openvpn

Agora vamos habilitar o openvpn no /etc/rc.conf

vim /etc/rc.conf
[...]
# OpenVPN
openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/filial1.conf"
openvpn_if="tun"
#Habilita o roteamento
gateway_enable="YES"

Agora vamos iniciar o serviço

/usr/local/etc/rc.d/openvpn start

Agora vamos analisar os logs do nosso openvpn da filial

tail -n 100 /var/log/openvpn/openvpn.log 
Tue Jun 26 22:10:43 2012 OpenVPN 2.2.2 amd64-portbld-freebsd9.0 [SSL] [LZO2] [eurephia] built on Jun 26 2012
Tue Jun 26 22:10:43 2012 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Tue Jun 26 22:10:43 2012 Control Channel Authentication: using 'keys/shared.key' as a OpenVPN static key file
Tue Jun 26 22:10:43 2012 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 22:10:43 2012 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 22:10:43 2012 LZO compression initialized
Tue Jun 26 22:10:43 2012 Control Channel MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:0 ]
Tue Jun 26 22:10:43 2012 Socket Buffers: R=[42080->65536] S=[9216->65536]
Tue Jun 26 22:10:43 2012 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Tue Jun 26 22:10:43 2012 Local Options hash (VER=V4): '53f7fc82'
Tue Jun 26 22:10:43 2012 Expected Remote Options hash (VER=V4): 'b5edb94e'
Tue Jun 26 22:10:43 2012 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
Tue Jun 26 22:10:43 2012 TCPv4 link local: [undef]
Tue Jun 26 22:10:43 2012 TCPv4 link remote: 200.200.200.1:1194
Tue Jun 26 22:10:43 2012 TLS: Initial packet from 200.200.200.1:1194, sid=66dce345 935e830c
Tue Jun 26 22:10:43 2012 VERIFY OK: depth=1, /C=BR/ST=PR/L=Curitiba/O=Douglas/OU=TI/CN=server/name=server/emailAddress=douglas.q.santos@gmail.com
Tue Jun 26 22:10:43 2012 VERIFY OK: nsCertType=SERVER
Tue Jun 26 22:10:43 2012 VERIFY OK: depth=0, /C=BR/ST=PR/L=Curitiba/O=Douglas/OU=TI/CN=server/name=server/emailAddress=douglas.q.santos@gmail.com
Tue Jun 26 22:10:43 2012 Data Channel Encrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Tue Jun 26 22:10:43 2012 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 22:10:43 2012 Data Channel Decrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Tue Jun 26 22:10:43 2012 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Tue Jun 26 22:10:43 2012 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 2048 bit RSA
Tue Jun 26 22:10:43 2012 [server] Peer Connection Initiated with 200.200.200.1:1194
Tue Jun 26 22:10:46 2012 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Tue Jun 26 22:10:46 2012 PUSH: Received control message: 'PUSH_REPLY,route-delay 2 600,route 192.168.10.0 255.255.255.0,route 10.254.0.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 10.254.0.6 10.254.0.5'
Tue Jun 26 22:10:46 2012 OPTIONS IMPORT: timers and/or timeouts modified
Tue Jun 26 22:10:46 2012 OPTIONS IMPORT: --ifconfig/up options modified
Tue Jun 26 22:10:46 2012 OPTIONS IMPORT: route options modified
Tue Jun 26 22:10:46 2012 OPTIONS IMPORT: route-related options modified
Tue Jun 26 22:10:46 2012 ROUTE default_gateway=192.168.11.2
Tue Jun 26 22:10:46 2012 TUN/TAP device /dev/tun0 opened
Tue Jun 26 22:10:46 2012 /sbin/ifconfig tun0 10.254.0.6 10.254.0.5 mtu 1500 netmask 255.255.255.255 up
Tue Jun 26 22:10:48 2012 /sbin/route add -net 192.168.10.0 10.254.0.5 255.255.255.0
add net 192.168.10.0: gateway 10.254.0.5
Tue Jun 26 22:10:48 2012 /sbin/route add -net 10.254.0.0 10.254.0.5 255.255.255.0
add net 10.254.0.0: gateway 10.254.0.5
Tue Jun 26 22:10:48 2012 GID set to nobody
Tue Jun 26 22:10:48 2012 UID set to nobody
Tue Jun 26 22:10:48 2012 Initialization Sequence Completed

Vamos efetuar testes

Da filial vamos tentar pingar o ip interno da matriz 192.168.10.1

ping  -c 3 192.168.10.1
PING 192.168.10.1 (192.168.10.1): 56 data bytes
64 bytes from 192.168.10.1: icmp_seq=0 ttl=64 time=1.141 ms
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=1.179 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=1.267 ms

--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.141/1.196/1.267/0.053 ms

Tabela de rotas da nossa filial

netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.11.2       UGS         0      599    em0
10.254.0.0/24      10.254.0.5         UGS         0        0   tun0
10.254.0.5         link#6             UH          0        0   tun0
10.254.0.6         link#6             UHS         0        0    lo0
127.0.0.1          link#5             UH          0     1713    lo0
192.168.10.0/24    10.254.0.5         UGS         0        5   tun0
192.168.11.0/24    link#1             U           0     1835    em0
192.168.11.1       link#1             UHS         0        0    lo0
200.200.200.0/24   link#3             U           0      146    em1
200.200.200.2      link#3             UHS         0        0    lo0

Agora na matriz vamos tentar pingar a rede interna da filial 192.168.11.1

ping -c 3 192.168.11.1
PING 192.168.11.1 (192.168.11.1): 56 data bytes
64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=1.906 ms
64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=1.206 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=1.516 ms

--- 192.168.11.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.206/1.543/1.906/0.286 ms

NÃO ESQUEÇA DE LIBERAR ROTAMENTO NOS SERVIDORES SE VOCÊ PRECISAR ACESSAR OUTRA MAQUINA FORA AS DUAS PONTAS DA VPN.

Vamos ajustar o rc.conf para habilitar o pf e o servidor a trabalhar como gateway.

vim /etc/rc.conf
[...]
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"  # where pflogd should store the logfile
pflog_flags=""                  # additional flags for pflogd startup
gateway_enable="YES"  

Habilitando manualmente o servidor a trabalhar como gateway.

sysctl net.inet.ip.forwarding=1

E CASO ACHE NECESSÁRIO MASCARE AS REDES

vim /etc/pf.conf
ext_if = "tun0" # macro para a interface externa - use tun0 for PPPoE
int_if = "em0"  # macro para a interface interna
localnet = $int_if:network
# ext_if IP pode ser dinamico, por isso usamos ($ext_if)
nat on $ext_if from $localnet to any -> ($ext_if)
block all
pass from { lo0, $localnet } to any keep state

Agora precisamos carregar as regras.

pfctl -f /etc/pf.conf

Pronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 tcp de sua interface externa e tudo na interface da vpn que é tun0.

Caso necessite configurar mais uma filial, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial1 para filial2 e mais os passos abaixo.

Também não esqueça de inserir mais uma entrada como abaixo no arquivo server.conf.

route 192.168.11.0 255.255.255.0 -> filial1
route 192.168.12.0 255.255.255.0 -> filial2

E precisamos tambem criar mais uma entrada no diretório ccd com a rota para a nova filial

echo "iroute 192.168.12.0 255.255.255.0" > /etc/openvpn/ccd/filial2

Caso precise passar mais rotas para as filiais faça como abaixo.

push "route 192.168.10.0 255.255.255.0"
push "route 192.168.9.0 255.255.255.0"

Referências