OpenVPN e PfSense Site to Site

Esse tutorial ensina a criar e configurar uma VPN site to site usando o PfSense e OpenVPN. 

English version: Click

Além disso, esse é mais um tutorial de nossa seria de tutoriais sobre VPNs. Caso tenha interesse, pesquise aqui no site sobre VPN. 

A figura abaixo demonstra o cenário que vamos usar. Nesse cenário, vamos usar máquinas virtuais com o VirtualBox e redes Virtuais.

Utilizamos um cenário com máquinas virtuais para facilitar ao leitor a criação de um ambiente de testes antes de implantar em ambiente de produção.

Nesse caso, estamos usando redes em modo rede interna “Internal Network” do VirtualBox nas LANs entre os computadores e o PfSense.

Para a rede WAN, entre os servidor pfsense e o cliente pfsense, estamso usando a “NAT network” do VirtualBox usando a subnet “10.0.2.0/24”.

NameClient Site PfSense
WAN Subnet10.0.2.0/24
LAN Subnet192.168.24.0/24
LAN Address192.168.24.1
InternalNetwork nameLAN1
Cert CNClient_VPN_Cert
Client Site (OpenVPN + PfSense) information

NameServer Site PfSense
WAN Subnet10.0.2.0/24
LAN Subnet192.168.56.0/24
LAN Address192.168.56.1
InternalNetwork nameLAN2
CA Namesite_vpn_CA
Cert CNserver_site_cert
Server Site (OpenVPN + PfSense) information

Nota. Para o cenário sugerido, teremos que desabilitar o bloqueio de IP privado no PfSense. Isso porque nesse tutorial estamos usando IP privado na WAN.

Para desativar o bloqueio de IP privado na WAN, vá em Interfaces->WAN e desmarque as opções: Block private networks e Block bogon networks.

Configurando o lado do Servidor OpenVPN

Vamos iniciar as configurações do lado do servidor de nossa VPN site to site.

Estamos supondo que você sabe instalar e configurar o pfsense em uma máquina virtual do VirtualBox. Caso não saiba e queira replicar o laboratório, pode clicar no link abaixo.

Instalar pfSense no VirtualBox

Criando a Autoridade Certificadora

Inicialmente, vamos criar uma unidade certificadora. Para isso, vamos clicar em “System” e depois em “Cert Manager”.

Depois, na aba de “CAs”, vamos clicar em “Add” para poder adicionar uma nova Autoridade Certificadora.

Em seguida vamos começar a preencher os campos da figura abaixo e explicar o que devemos inserir em cada campo.

Descriptive name: Aqui vamos dar o nome da Autoridade Certificadora. Em nosso caso estamos usando o nome “site_vpn_CA”.

Method: Vamos criar um certificado interno no servidor. Portanto vamos usar a opção “Create na internal Certificate Authority”.

Trust Store: Permite adicionar o certificado a Trust Store do sistema operacional. No entanto, não vamos usar essa opção nesse tutorial.

Randomize Serial: Vai permitir que a autoridade certificadora a assine os certificados de forma randômica e isso melhora a segurança.

Key type: O tipo de chave que vamos usar na criptografia e em seguida o tamanho da chave. Nesse caso estamos usando um tamanho de 2048.

DIgest Algorithm: O método usado quando a autoridade certificadora é assinada. Aqui, vamos usar o sha256.

Key type: O tipo de chave que vamos usar na criptografia e em seguida o tamanho da chave. Nesse caso estamos usando um tamanho de 2048.

DIgest Algorithm: O método usado quando a autoridade certificadora é assinada. Aqui, vamos usar o sha256.

Lifetime: Estamos usando o padrão que é de quase 10 anos. Podemos mudar esse valor para uma data que atenda a nossa necessidade.

Coomon Name: Aqui podemos usar um nome que escolhermos. Nesse caso, usamos o “internal-ca”.

Country Code,State or Province,City e Organization: Essa é a parte onde inserimos informações sobre o código do país, estado, cidade e o nome da organização. Nesse caso, estamos usando informações fictícias de uma organização situada em São Paulo.

Em seguida vamos clicar em “Save” para criar a nova Autoridade Certificadora.

Na figura abaixo, podemos observar que a Autoridade Certificadora foi criada com sucesso.

Criando o certificando do Servidor OpenVPN

Agora, vamos criar o certificado do servidor site to site do nosso OpenVPN. Para isso, vamos clicar em “System” e depois em “Cert Manager”.

Depois disso, vamos clicar na aba “Certificates” e em seguida vamos clicar em “Add/Sign”.

Vamos iniciar descrevendo os campos e os valores que foram usados nesse certificado do servidor OpenVPN.

Method: Nesse caso, vamos usar um certificado interno no servidor. Portanto vamos usar a opção “Create an internal Certificate”.

Descriptive name: O nome de descrição para o certificado. Em nosso caso, o nome é “server_site_cert”.

Certificate Authority: Aqui vamos usar a autoridade certificadora que criamos. Nesse caso, nossa CA é “site_vpn_CA”.

Podemos observar que muitos campos foram preenchidos automaticamente com as informações que inserimos na criação da Autoridade Certificadora.

Lifetime: o campo Lifetime precisa ser preenchido com o valor menor ou igual a 398. Dessa forma, evitamos que um Lifetime maior que 398 crie incompatibilidades com alguns sistemas.

Common Name: Aqui vamos colocar o nome do certificado “server_site_cert”.

Certificate Type: nesse campo, é importante mudar o certificado para “Server Certificate”.

Em seguida, vamos clicar em “Save”.

Depois de clicar em “Save” e vamos ver uma tela como a tela abaixo.

Criando o Certificado do cliente Site

Agora, vamos criar o certificado para o outro pfsense que fará a conexão no nosso servidor OpenVPN.

Nesse caso, estamos assumindo que o nosso servidor OpenVPN aceitará a conexão do cliente OpenVPN que roda no pfsense cliente.

Agora, vamos criar o certificado do cliente site to site do nosso OpenVPN. Para isso, vamos clicar em “System” e depois em “Cert Manager”.

Depois disso, vamos clicar na aba “Certificates” e em seguida vamos clicar em “Add/Sign”.

Vamos iniciar descrevendo os campos e os valores que foram usados nesse certificado do cliente OpenVPN.

Method: Nesse caso, vamos usar um certificado interno no servidor. Portanto vamos usar a opção “Create an internal Certificate”.

Descriptive name: O nome de descrição para o certificado. Em nosso caso, o nome é “client_site_cert”.

Certificate Authority: Aqui vamos usar a autoridade certificadora que criamos. Nesse caso, nossa CA é “site_vpn_CA”.

Podemos observar que muitos campos foram preenchidos automaticamente com as informações que inserimos na criação da Autoridade Certificadora.

Lifetime: Estamos usando o padrão que é de quase 10 anos. Podemos mudar esse valor para uma data que atenda a nossa necessidade.

Common Name: Aqui vamos colocar o nome do certificado “client_site_cert”.

Certificate Type: nesse campo, é importante mudar o certificado para “User Certificate”. Isso porque, esse será o certificado do cliente site to site.

Em seguida, vamos clicar em “Save”.

Depois de clicar em “Save” e vamos ver uma tela como a tela abaixo.

Exportar os certificados

Agora, vamos exportar os certificados e a chave do cliente. Esses certificados serão incluídos na configuração do cliente site to site OpenVPN no outro PfSense.

Inicialmente vamos exportar o certificado da Autoridade Certificadora do servidor OpenVPN. Para isso, vamos clicar em System -> Certificate Manager -> CAs.

Vamos fazer o download do certificado da CA.

Agora vamos clicar na aba Certificates e vamos exportar o certificado do cliente e a chave do cliente OpenVPN.

Nesse caso, vamos fazer o download do certificado e da chave do cliente para poder incluir esses dados na configuração do cliente OpenVPN site to site.

Configurando o Servidor OpenVPN site to site

Para configurar o servidor OpenVPN na modalidade site to site, vamos seguir os passos a seguir.

Inicialmente vamos selecionar a aba de VPN e em seguida vamos clicar em OpenVPN.

Em seguida, na aba de Servers, vamos clicar em “Add”.

Agora vamos descrever as informações adicionadas nos campos da figura abaixo.

Description: vamos inserir o nome do nosso servidor OpenVPN que será usado para conexão site to site.

Server mode: aqui vamos escolher a opção “Peer to Perr (SSL/TLS)”. Isso porque estamos configurando o OpenVPN site to site usando TLS/SSL.

Device mode: Vamos usar o modo “tun-Layer 3 Tunnel Mode” para permitir o tráfego da camada 3 (IP) dentro da nossa VPN.

Protocol: podemos escolher entre TCP e UDP na camda de transporte. Além disso, podemos escolher entre IPv6 e IPv4 ou usar ambos ao mesmo tempo. Para esse tutorial, vamos usar apenas UDP e IPv4.

Interface: Aqui vamos indicar qual interface o servidor OpenVPN vai operar. Nesse caso, estamos usando um servidor VPN para permitir acesso externo de clientes. Portanto vamos usar a interface WAN.

Local Port: Informa a porta que o servidor OpenVPN vai usar para aguardar a comunicação com os clientes. Vamos escolher a porta padrão 1194. No entanto, se você já estiver usando essa porta com outro serviço, você pode mudar a porta para que não haja conflito.

TLS Configuration: Vamos deixar marcados os campos relativos à configuração do TLS.

Peer Certificate Authority: Aqui vamos selecionar a Autoridade Certificadora que criamos para nossa VPN.

Peer Certificate Revocation list: Por enquanto não vamos criar a lista para revocar certificados.

Server certificate: Vamos usar o certificado que criamos para o servidor OpenVPN site to site.

DH Parameter Length: Vamos usar um tamanho de Diffie-Hellman (DH) igual a 2048.

ECDH Curve: vamos deixar como padrão a Elliptic Curve usada para key exchange.

Data Encryption Negotiation: permite a negociação do algoritmo de criptografia entre cliente e servidor.

Data Encryption Algorithms: aqui temos os algoritmos que podem ser negociados entre cliente e servidor.

Fallback Data Encryption Algorithm: Aqui podemos indicar o algoritmo que será usado quando a negociação dos algoritmos listados acima falhar.

Auth Digest Algorithm: Aqui vamos indicar o método de autenticação entre cliente e servidor VPN.

Hardware Crypto: Como o nome diz, esse campo possibilita usar hardware de aceleração. No entanto, não vamos usar nesse tutorial.

Certificate Depth: Vamos negar certificados com hierarquia menor do que o certificado criado com a CA. Isso evita que sejam aceitos certificados criados com CAs que forma geradas a partir da CA original.

Client Certificate Key Usage Validation: permite que apenas os clientes com certificados validos possam se conectar.

IPv4 Tunnel Network: Aqui vamos indicar a rede que será usada no túnel VPN entre o cliente e o servidor VPN. Vale ressaltar, que devemos usar uma rede que não é usada por outra rede interna. Em nosso caso, vamos usar a rede 10.0.8.0/24.

IPv6 Tunnel Network: Semelhante ao IPv4. No entanto não vamos usar nesse tutorial.

Redirect IPv4 Gateway: Se selecionarmos esse campo, faremos com que os clientes usem o gateway do servidor OpenVPN como gateway padrão. Dessa forma, todo o tráfego para Internet passará pelo servidor OpenVPN. Nesse tutorial, não vamos habilitar o Redirect Gateway.

Redirect IPv6 Gateway: Semelhante ao IPv4. No entanto não vamos usar nesse tutorial.

IPv4 Local Network: Aqui podemos definir a rede local que será acessada pelos clientes OpenVPN. Nesse caso, vamos escolher a rede da LAN do servidor OpenVPN 192.168.56.0/24.

IPv6 Local Network: Semelhante ao IPv4. No entanto não vamos usar nesse tutorial.

IPv4 Remote network(s): Aqui vamos inserir a rede LAN do OpenVPN cliente.

IPv6 Remote network(s): Semelhante ao IPv4. No entanto não vamos usar nesse tutorial.

Concurrent Connections: Número de clientes que podem acessar o servidor OpenVPN ao mesmo tempo. Se estivermos rodando o servidor OpenVPN em um hardware mais limitado, podemos reduzir o número de clientes concorrentes.

Allow Compression & Compression: permite a compressão dentro da VPN. No entanto, não vamos para garantir uma maior segurança.

Type-of-Service: Esse campo pode ser marcado quando queremos inserir algum tipo de qualidade de serviço para o tráfego da VPN.

Inter-Client Communication: Se marcarmos essa opção os clientes do OpenVPN poderão se comunicar. Essa comunicação entre clientes vai depender da necessidade do projeto de VPN.

Duplicate Connections: Marcando essa opção o mesmo usuário de VPN pode manter mais de uma conexão com a VPN. Pode ser útil em caso de múltiplos dispositivos do usuário.

Dynamic IP: permite manter a conexão do cliente mesmo que mude o IP.

Topology: Temos a opção de usar o “Subnet” para permitir um IP para cada cliente na rede VPN ou isolar os clientes usando a opção “net30”. Nesse tutorial vamos usar a opção “Subnet”.

Inactive: Vamos usar o tempo de inatividade = 0. Dessa forma, vamos evitar que o cliente site to site seja desconectado por inatividade. Ao usar o valor 0 todos os outros campos do ping settings serão ignorados.

Para as configurações avançadas, deixamos os campos com as informações default.

Custom Options: Aqui podemos inserir opções adicionais como por exemplo uma rota.

UDP Fast I/0: Uma otimização com VPN operando em UDP e tun/tap.

Exit Notify: Enviar notificação explicita para conexão.

Send/Receive Buffer: Aqui podemos indicar o tamanho do buffer. No entanto, vamos deixar o default.

Gateway Creation: Usado para permitir rotas para interfaces virtuais.

Verbosity Level: vai indicar o nível de detalhes dos logs da VPN.

Depois de clicar em “Save”, vamos ver uma tela como a da figura abaixo.

Agora, podemos clicar VPN->OpenVPN->Server e vamos clicar no ícone como na figura abaixo para editar. O Nosso objetivo e copiar a chave TLS do servidor em um arquivo que depois passaremos para o cliente Site VPN.

Agora vamos até a seção Cryptographic Settings e vamos copiar a TLS Key (selecionar tudo e copiar). Depois disso podemos salvar o conteúdo em um arquivo com o nome TLS_KEY_Server.txt.

Vamos enviar esse arquivo para o Cliente Site VPN juntamente com os certificados que já fizemos download anteriormente.

Criando o Client-Specific Overrides

Agora vamos criar o Client-Specific Overrides para permitir que haja a ligação de um certificado e a subrede do cliente. Dessa forma, essa ligação permite a criação de rota para a subrede.

Em nosso caso a subrede do site cliente OpenVPN será 192.168.24.0/24.

Para acessar o Client-Specific Overrides vamos clicar em VPN->OpenVPN-> Client-Specific Overrides

Agora vamos dar o nome que será usado no nosso cliente site VPN. Nesse caso vamos usar o nome “client_site_cert”. Vamos usar esse nome nos campos Description e Common Name.

Nota. Em Common Name devemos usar o mesmo Common name que usamos na configuração do certificado do nosso cliente.

Agora vamos procurar o campo “IPv4 Remote Network/s” e vamos inserir a subnet da LAN do nosso cliente site VPN.

Em nosso caso a subnet da LAN do nosso cliente VPN é o 192.168.24.0/24.

Depois disso, vamos clicar em SAVE.

Criando a regra no Firewall do Servidor

Agora vamos criar a regra do firewall para permitir a conexão da nossa VPN.

Para isso, vamos clicar no menu Firewall e em seguida vamos selecionar Rules -> WAN. Depois disso vamos clicar em Add para adicionar uma nova regra.

Agora vamos comentar as regras que vamos inserir no firewall.

Vamos usar as opções abaixo.

Action = Pass. Para permitir a passagem de tráfego.

Interface = WAN. Vamos configurar a regra para a interface WAN pois essa interface que receberá o tráfego da VPN.

Address Family= IPv4. Usaremos IPv4 nessa configuração.

Protocol = UDP. Nossa VPN utilizará o protocolo UDP.

Os campos da figura abaixo se referem a origem e destino da regra e descreveremos abaixo.

Source = any. Nesse caso estamos aceitando tráfego de qualquer IPv4 ao selecionarmos “any”. Vale ressaltar, que uma medida de segurança seria identificar qual é o IP do Cliente Site VPN e inserir esse IP aqui nesse campo.

Destination = WAN address. Nesse caso vamos deixar o destino como endereço da interface WAN do servidor OpenVPN.

Destination Port Range = 1194. Aqui vamos usar a porta padrão do nosso servidor OpenVPN.

Description = VPN site to site. Aqui vamos colocar um nome para facilitar a identificação da regra.

Agora vamos clicar em SAVE e depois em Apply Changes para que as configurações sejam efetuadas.

Criando a regra de túnel no Servidor VPN

Agora, ainda dentro do menu Firewall->rules, vamos clicar na opção OpenVPN e clicar em ADD para adicionar uma nova regra para o túnel OpenVPN.

Agora vamos descrever os campos que usaremos na figura abaixo.

Action= Pass. Permitir o tráfego.

Interface = OpenVPN.

Address Family = IPv4. Vamos permitir o tráfegoIPv4 dentro da VPN. No entanto, você pode habilitar aqui também o tráfego IPv4+IPv6.

Protocol = Any. Vamos permitir qualquer protocolo dentro da VPN.

Source = Any.

Destination = Any.

Nota. Podemos limitar as suberedes que serão acessadas com a VPN descrevendo-as nos campos Source e Destination. Dessa forma, podemos limitar mais para aumentar a segurança.

Agora vamos clicar em SAVE e depois em Apply Changes para que as configurações sejam efetuadas.

Configurando o OpenVPN no outro lado (Client site)

Vamos realizar as configurações do lado do cliente OpenVPN. Ou seja, vamos configurar o PfSense do lado do cliente site to site de nossa VPN.

Importando os Certificados

Agora, vamos importar para o cliente os certificados que havíamos exportado anteriormente quando estávamos configurando o servidor OpenVPN. 

Vamos clicar em System > Cert Manager e depois vamos escolher a aba CAs.

Depois, na aba de “CAs”, vamos clicar em “Add” para poder adicionar uma nova Autoridade Certificadora.

Em seguida vamos começar a preencher os campos da figura abaixo e explicar o que devemos inserir em cada campo.

Agora vamos dar um nome para a CA do servidor VPN e vamos importar a Autoridade Certificadora.

Descriptive Name = VPN_Server_CA. Aqui estamos apenas dando um nome para a autoridade certificadora.

Method = Import an existing Certificate Authority. Aqui vamos usar aquele arquivo que exportamos da autoridade certificadora do nosso servidor VPN.

Certificate Data= Aqui vamos abrir o arquivo da CA do nosso servidor VPN e em seguida vamos selecionar todo o texto e depois vamos colar aqui.

A figura abaixo mostra o momento em que selecionamos o texto do arquivo do CA do servidor VPN.

Abaixo estamos colando o texto copiado no campo “Certificate data”.

Depois vamos clicar em SAVE.

Adicionar Certificado do cliente

Agora vamos configurar a porte do certificado do cliente. Para isso, vamos clicar em System > Cert Manager e depois clicar na aba Certificates.

Em seguida, vamos clicar em ADD para criar um novo certificado.

Agora vamos preencher os campos com as informações abaixo.

Method=Import an existing Certificate. Isso porque vamos usar o certificado de cliente VPN que havíamos exportado lá do servidor VPN.

Descriptive Name= Client_VPN_Cert. Apenas um nome para descrever o certificado do cliente.

Certificate Type =X.509 (PEM) . O tipo do certificado.

Certificate Data= Aqui vamos abrir o arquivo do certificado do cliente em algum editor e vamos copiar todo o conteúdo e vamos colar aqui nesse campo.

Private Key Data= Aqui vamos abrir o arquivo certificate private key do cliente em algum editor e vamos copiar todo o conteúdo e vamos colar aqui nesse campo.

Depois vamos clicar em SAVE.

Criando o VPN Client Site

Vamos configurar a parte do cliente OpenVPN. Para isso, vamos clicar em VPN > OpenVPN e depois clicar na aba Client.

Em seguida, vamos clicar em Add para criar nosso novo cliente.

Agora vamos descrever os campos que serão usados.

Description= Cliente site VPN. Apenas a descrição do nosso cliente VPN.

Server Mode = Peer to Peer (SSL/TLS). Devemos usar esse modo, pois usamos o mesmo no lado do servidor.

Device mode= tun. Vamos usar o modo “tun-Layer 3 Tunnel Mode” para permitir o tráfego da camada 3 (IP) dentro da nossa VPN.

Protocol =UDP on IPv4 only. Vamos usar o mesmo que usamos no servidor.

Interface= WAN. Isso porque usaremos a WAN para conectar com o servidor OpenVPN.

Server host or address = O IP da interface WAN do servidor OpenVPN. EM nosso caso o IP será o 10.0.2.15. Em um ambiente real esse IP será o IP público do servidor OpenVPN.

Server Port=1194. A mesma porta que usamos no servidor.

Enable authentication of TLS packets = Vamos marcar (Checked).

Automatically generate a shared TLS authentication key = Vamos desmarcar essa opção (Unchecked).

TLS Key = Aqui vamos colar o conteúdo do arquivo que copiamos a TLS Key lá do servidor VPN.

Em nosso caso, criamos o arquivo TLS_KEY_Server.txt no qual copiamos o TLS Key do servidor VPN.

Peer Certificate Authority= Aqui vai ser a CA que importamos do Servidor VPN.

Client Certificate= Aqui vai ser o certificado do cliente que importamos no início da configuração.

Criando o túnel OpenVPN

Agora, ainda dentro do menu Firewall->rules, vamos clicar na opção OpenVPN e clicar em ADD para adicionar uma nova regra para o túnel OpenVPN.

Agora vamos descrever os campos que usaremos na figura abaixo.

Action= Pass. Permitir o tráfego.

Interface = OpenVPN.

Address Family = IPv4. Vamos permitir o tráfegoIPv4 dentro da VPN. No entanto, você pode habilitar aqui também o tráfego IPv4+IPv6.

Protocol = Any. Vamos permitir qualquer protocolo dentro da VPN.

Source = Any.

Destination= Any.

Nota. Podemos limitar as suberedes que serão acessadas com a VPN descrevendo-as nos campos Source e Destination. Dessa forma, podemos limitar mais para aumentar a segurança.

Agora vamos clicar em SAVE e depois em Apply Changes para que as configurações sejam efetuadas.

Testando a VPN

Podemos verificar no cliente Site VPN acessando o menu Status->OpenVPN .

Caso o status da sua VPN ainda não esteja UP. Você pode clicar no icone de “Restart OpenVPN Service” como apontado pela seta na figura abaixo.

Agora você pode fazer um ping de um cliente de um lado da VPN por exemplo da rede 192.168.56.0/24 para a rede 192.168.24.0/24.

Para ver a prática veja o Vídeo no linlk abaixo.

Juliana Mascarenhas

Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer

Referências:

https://docs.netgate.com/pfsense/en/latest/recipes/openvpn-s2s-tls.html

https://docs.netgate.com/pfsense/en/latest/recipes/index.html#openvpn