17 de outubro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Configurar OpenVPN server

OpenVPN server

Eu já havia escrito um extenso artigo enquanto implementava o OpenVPN server. Mas aí surgiram problemas; o tempo estava acabando, havia prazo e tive que iniciar outro processo que não a documentação oficial – digo de passagem, não é das melhores, considerando a grandeza do projeto. Mas o projeto é incrível e merece todos os elogios. E não só o projeto, mas a Digital Ocean também, que das 5 ou 6 implementações que fiz, foi a que me passou mais confiança.

Já adianto que essa confiiguração completa funciona no Raspberry e outros embarcados que rodem Linux, mas esse é um artigo da minha área de especialização, não sobre embarcados. A leitura é recomendada, mas não vou ficar triste se tiver poucos views, eu entendo.

Acredito que todas as implementações que fiz estavam certas, no final o sintoma era o mesmo; uma configuração no security group no EC2 da Amazon. Bem, durante décadas fiz backend de operadoras de telecom. Eu que escolhia o hardware, a arquitetura e fazia a implementação, nuvem é coisa nova pra mim, confesso. Mas a partir do momento que coloquei as cartas na mesa, tive o apoio da equipe, que em menos de 5 minutos apontou a configuração e a VPN deu seus primeiros sinais de vida! Então, para quem quiser fazer a configuração do OpenVPN server, visite o link da DigitalOcean. Mas não estou escrevendo artigo apenas para apontar outro artigo; vamos dar uma incrementada.

Passar rotas pelo OpenVPN

Não era fundamental, mas fica muito mais elegante iniciar a conexão VPN e as rotas se acertarem sozinhas. Aqui vou exemplificar com uma rede classe C. No arquivo de configuração do OpenVPN (/etc/openvpn/server.conf) inclua a linha :

push "route 192.168.100.0 255.255.255.0"

Nesse exemplo estamos passando a rota para a rede 192.168.100 que, obviamente, trafegará pela interface de túnel.

OpenVPN resolvendo nome de hosts

Resolver nomes é papel do DNS. Mas dá pra ajeitar a coisa.

Em /etc/hosts do OpenVPN server, coloque os hosts. Exemplo:

192.168.100.90 webserver.dominio.com
192.168.100.91 repositorio.dominio.com.br

Agora o servidor já sabe resolver esses hosts. Para que ele resolva para hosts conectados a ele, adicione uma linha apontando a interface que tem a rota ao arquivo /etc/openvpn/server.conf:

push "dhcp-option DNS 192.168.100.40"

Supondo então que a interface do túnel seja da rede 10.10.0.x e a interface ethernet do servidor seja 192.168.100.40, devemos agora editar o arquivo /etc/resolv.conf e adicionar:

nameserver 192.168.100.40

Mas quem está resolvendo nomes? – Por ora, ninguém. Vamos instalar o dnsmasq para cumprir esse papel. Tenha calma, basicamente instalamos e configuramos “1” linha!

sudo su
apt-get update
apt-get install dnsmasq

Edite o arquivo /etc/dnsmasq.conf e adicione a linha:

listen-address=192.168.100.40

Claro, troque o endereço pelo DNS que corresponder à sua rede. Aqui estou usando tudo fictício para não explicitar detalhes da infraestrutura.

Terminando o processo, reinicie o dnsmasq e o OpenVPN. Faça a conexão com o client VPN e repare que a rota para a rede aparecerá tão logo suba a interface tun. Faça um ping ou uma conexão a um host que passará pela interface tun para testar a resolução de nomes. Tudo feito!

Só como dica extra, um POSTROUTING é necessário para fazer o encaminhamento dos pacotes. Vi pessoas fazendo de várias maneiras, até instalando programas que são uma camada sobre o iptables, que é a ferramenta de interação com o netfilter, que é o firewall do kernel Linux. Não precisa usar nada, basta esse conjunto simples de regras. Crie um arquivo, por exemplo, frw.sh e coloque isso:

echo "1" >/proc/sys/net/ipv4/ip_forward
/sbin/iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -d 192.168.100.0/24 -j MASQUERADE
/sbin/iptables -A FORWARD -s 192.168.100.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -d 192.168.100.0/24 -mstate --state ESTABLISHED,RELATED -j ACCEPT

Mais uma vez, atente-se em trocar o IP para a respectiva rede.

Para iniciar junto com o sistema podemos por exemplo, transformar esse firewall em serviço. Nesse artigo mostro como criar um serviço no Raspberry.