Instalando e Configurando o OpenVPN no CentOS 7

Vou abordar nesse how to a instalação e configuração da OpenVPN no Centos 7

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

  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
  6. Liberar o roteamento caso precise acessar outra maquina fora as pontas da vpn echo 1 > /proc/sys/net/ipv4/ip_forward
  7. Não esquecer de mascarar as redes se necessário. iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialcentos7_en para que não falte nenhum pacote ou configuração.

Vamos fazer um update dos repositórios e um upgrade do sistema e depois instalar o nosso openvpn e deixar ele habilitado para subir na inicialização.

Matriz

Vamos mandar atualizar os repositórios e atualizar o sistema.

yum check-update ; yum update -y 

Agora precisamos mandar instalar o pacote da openvpn e do git

yum install openvpn git -y

Nas últimas versões do Openvpn já não temos mais o easy-rsa com isso temos que obter

cd /etc/openvpn && git clone https://github.com/OpenVPN/easy-rsa

Agora vamos ajustar a localização dos arquivos que precisamos

mv /etc/openvpn/easy-rsa/easyrsa3/ /etc/openvpn/easy-rsa3

Agora vamos remover o diretório que não precisamos mais

rm -rf /etc/openvpn/easy-rsa

Agora vamos ajustar o nome do nosso diretório

mv /etc/openvpn/easy-rsa3 /etc/openvpn/easy-rsa

Vamos editar o arquivo que vai ser base para as nossas chaves o arquivo /etc/openvpn/easy-rsa/vars.

Primeiro vamos fazer uma copia do arquivo de exemplo para o nosso arquivo real

cp /etc/openvpn/easy-rsa/vars.example /etc/openvpn/easy-rsa/vars
vim /etc/openvpn/easy-rsa/vars
[...]
# Organizational fields (used with 'org' mode and ignored in 'cn_only' mode.)
# These are the default values for fields which will be placed in the
# certificate.  Don't leave any of these fields blank, although interactively
# you may omit any specific field by typing the "." symbol (not valid for
# email.)

set_var EASYRSA_REQ_COUNTRY     "BR"
set_var EASYRSA_REQ_PROVINCE    "Parana"
set_var EASYRSA_REQ_CITY        "Curitiba"
set_var EASYRSA_REQ_ORG         "Douglas"
set_var EASYRSA_REQ_EMAIL       "douglas.q.santos@gmail.com"
set_var EASYRSA_REQ_OU          "IT"

# Choose a size in bits for your keypairs. The recommended value is 2048.  Using
# 2048-bit keys is considered more than sufficient for many years into the
# future. Larger keysizes will slow down TLS negotiation and make key/DH param
# generation take much longer. Values up to 4096 should be accepted by most
# software. Only used when the crypto alg is rsa (see below.)

set_var EASYRSA_KEY_SIZE        2048

[...]
# In how many days should the root CA key expire?

set_var EASYRSA_CA_EXPIRE       3650

# In how many days should certificates expire?

set_var EASYRSA_CERT_EXPIRE     3650

[...]

Agora temos que carregar as variáveis no ambiente

cd /etc/openvpn/easy-rsa && ./easyrsa init-pki

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

Agora vamos gerar os certificados e chaves

Certificado de autoridade (CA). Os valores já estão pré-estabelecidos, faltando apenas o Common Name e informar a senha.

cd /etc/openvpn/easy-rsa && ./easyrsa build-ca

Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
....................................................................................................................................+++
..........................................................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/ca.key'
Enter PEM pass phrase: #SENHA
Verifying - Enter PEM pass phrase: #SENHA
-----
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:OpenVPN CA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt

Agora vamos gerar as chaves e os certificados do servidor

cd /etc/openvpn/easy-rsa && ./easyrsa gen-req server nopass

Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
......................+++
..................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/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.
-----
Common Name (eg: your user, host, or server name) [server]: #ENTER

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/pki/private/server.key

Agora nós precisamos assinar a chave para o nosso servidor, aqui precisamos confirmar a assinatura e informar a senha do CA que geramos a pouco.

cd /etc/openvpn/easy-rsa && ./easyrsa sign server server

Note: using Easy-RSA configuration from: ./vars


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 3650 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: #SENHA
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :PRINTABLE:'server'
Certificate is to be certified until Jan 23 19:35:55 2025 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt

Parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

cd /etc/openvpn/easy-rsa && ./easyrsa gen-dh
Note: using Easy-RSA configuration from: ./vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[...]
DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem

Agora vamos criar uma chave compartilhada.

Criando uma chave compartilhada para servir de tls.

cd /etc/openvpn/easy-rsa && openvpn --genkey --secret pki/shared.key

Arquivo de configuração da matriz /etc/openvpn/server.conf

vim /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/dh.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/ips.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 configurar as chaves e certificados para a nossa filial

cd /etc/openvpn/easy-rsa && ./easyrsa gen-req filial1 nopass

Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
..................................................+++
.......................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/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.
-----
Common Name (eg: your user, host, or server name) [filial1]:

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/filial1.req
key: /etc/openvpn/easy-rsa/pki/private/filial1.key

Agora nós precisamos assinar a chave para o nosso cliente, aqui precisamos confirmar a assinatura e informar a senha do CA

cd /etc/openvpn/easy-rsa && ./easyrsa sign client filial1

Note: using Easy-RSA configuration from: ./vars


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a client certificate for 3650 days:

subject=
    commonName                = filial1


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: #SENHA
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :PRINTABLE:'filial1'
Certificate is to be certified until Jan 23 19:42:48 2025 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/filial1.crt

Vamos criar alguns diretórios que são necessários e copiar alguns arquivos.

mkdir /etc/openvpn/{certs,ccd,keys,ipp}
cd /etc/openvpn/easy-rsa/pki
cp ca.crt issued/* /etc/openvpn/certs/
cp dh.pem shared.key private/* /etc/openvpn/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" > /etc/openvpn/ccd/filial1

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

cd /etc/openvpn
chown -R nobody:nobody keys certs ccd
chmod 0400 keys/* certs/* ccd/* ipp

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

mkdir /var/log/openvpn

Agora vamos inserir na inicialização do sistema o Openvpn

systemctl -f enable openvpn@server.service

Vamos iniciar o nosso servidor openvpn

systemctl start openvpn@server.service

Vamos verificar os logs

tail -f /var/log/openvpn/openvpn.log
Mon Jan 26 17:45:34 2015 GID set to nobody
Mon Jan 26 17:45:34 2015 UID set to nobody
Mon Jan 26 17:45:34 2015 Listening for incoming TCP connection on [undef]
Mon Jan 26 17:45:34 2015 TCPv4_SERVER link local (bound): [undef]
Mon Jan 26 17:45:34 2015 TCPv4_SERVER link remote: [undef]
Mon Jan 26 17:45:34 2015 MULTI: multi_init called, r=256 v=256
Mon Jan 26 17:45:34 2015 IFCONFIG POOL: base=10.254.0.4 size=62, ipv6=0
Mon Jan 26 17:45:34 2015 IFCONFIG POOL LIST
Mon Jan 26 17:45:34 2015 MULTI: TCP INIT maxclients=10 maxevents=14
Mon Jan 26 17:45:34 2015 Initialization Sequence Completed

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 /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 /etc/openvpn/filial1/filial1.conf

vim /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
remote-cert-tls 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/
filial1/
filial1/filial1.conf
filial1/keys/
filial1/keys/filial1.key
filial1/keys/shared.key
filial1/certs/
filial1/certs/ca.crt
filial1/certs/filial1.crt

Filial

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialcentos7_en para que não falte nenhum pacote ou configuração.

Vamos fazer uma atualização dos repositórios e vamos fazer uma atualização do sistema.

yum check-update ; yum update

Agora precisamos instalar a openvpn

yum install openvpn -y

Agora na matriz

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

scp filial1.tar.gz 200.200.200.2:/tmp

Na filial novamente

Agora vamos descompactar e mover a configuração da nossa openvpn para o lugar certo.

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

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

mkdir /var/log/openvpn

Agora vamos inserir na inicialização do sistema o Openvpn.

systemctl -f enable openvpn@filial1.service

Agora vamos iniciar a nossa openvpn

systemctl start openvpn@filial1.service

Vamos analisar os logs da filial

tail -f /var/log/openvpn/openvpn.log
Mon Jan 26 17:50:02 2015 TUN/TAP device tun0 opened
Mon Jan 26 17:50:02 2015 TUN/TAP TX queue length set to 100
Mon Jan 26 17:50:02 2015 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Mon Jan 26 17:50:02 2015 /sbin/ip link set dev tun0 up mtu 1500
Mon Jan 26 17:50:02 2015 /sbin/ip addr add dev tun0 local 10.254.0.6 peer 10.254.0.5
Mon Jan 26 17:50:04 2015 /sbin/ip route add 192.168.10.0/24 via 10.254.0.5
Mon Jan 26 17:50:04 2015 /sbin/ip route add 10.254.0.0/24 via 10.254.0.5
Mon Jan 26 17:50:04 2015 GID set to nobody
Mon Jan 26 17:50:04 2015 UID set to nobody
Mon Jan 26 17:50:04 2015 Initialization Sequence Completed

Vamos efetuar testes

Da filial vamos tentar pingar o ip interno da matriz 192.168.10.1

ping 192.168.10.1 -c 3
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_req=1 ttl=64 time=1.42 ms
64 bytes from 192.168.10.1: icmp_req=2 ttl=64 time=1.01 ms
64 bytes from 192.168.10.1: icmp_req=3 ttl=64 time=1.05 ms

--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.015/1.166/1.428/0.187 ms

Tabela de rotas da nossa filial

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.254.0.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.254.0.0      10.254.0.5      255.255.255.0   UG    0      0        0 tun0
192.168.11.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.10.0    10.254.0.5      255.255.255.0   UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth0

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

ping 192.168.11.1 -c 3
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_req=1 ttl=64 time=0.454 ms
64 bytes from 192.168.11.1: icmp_req=2 ttl=64 time=0.853 ms
64 bytes from 192.168.11.1: icmp_req=3 ttl=64 time=0.804 ms

--- 192.168.11.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.454/0.703/0.853/0.180 ms

Tabela de rotas da nossa matriz

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.254.0.2      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.254.0.0      10.254.0.2      255.255.255.0   UG    0      0        0 tun0
192.168.11.0    10.254.0.2      255.255.255.0   UG    0      0        0 tun0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth0

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

echo 1 > /proc/sys/net/ipv4/ip_forward

E CASO ACHE NECESSÁRIO MASCARE AS REDES

iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Pronto, seu openvpn esta instalado e matriz/filial estão 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 também 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"

Caso uma filial precise acessar a outra podemos fazer da seguinte forma.

  1. Filial 3 192.168.3.0/24
  2. Filial 4 192.168.3.0/24

A filial 3 precisa chegar na 4, então vamos inserir a seguinte linha no arquivo de configuração da VPN da filial 3

vim /etc/openvpn/filial3.conf
[...]
route 192.168.4.0 255.255.255.0

E agora no arquivo de configuração da filial4 precisamos fazer o mesmo procedimento

vim /etc/openvpn/filial4.conf
[...]
route 192.168.3.0  255.255.255.0

Com isso as filiais já tem rotas uma para a outra por causa do parâmetro client-to-client na configuração do servidor.

Aqui não podemos de incluir as outras configuração padrões no servidor principal de openvpn, caso precise acessar os servidores das filiais não podemos esquecer de habilitar o repasse de pacotes com o seguinte comando

echo "net.ipv4.ip_forward = 1">> /etc/sysctl.conf
sysctl -p

Também precisamos mascarar a rede da vpn que em nosso caso é 10.254.0.0/24 nas filiais com o seguinte comando.

iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Referências