Uma VPN (Virtual Private Network ou Rede Virtual Privada) consiste, basicamente, na extensão geográfica de uma rede local a partir de um meio inseguro (como a Internet). O processo é feito com tunelamento “protegido” (com criptografia, por exemplo) entre as redes envolvidas. Ou seja, é uma forma rápida, segura e de baixo custo para interconectar redes geograficamente distantes ou fornecer o acesso remoto aos recursos da empresa.

A construção de uma VPN pode ser feita de diferentes maneiras.

Conforme exposto na publicação anterior, tenho optado preferencialmente pela solução Tinc para construção de VPNs site-to-site. Mas, entre gateways Linux, também é comum encontrar implementações baseadas no OpenVPN (tunelamento SSL) ou Racoon (tunelamento IPSEC). Já a construção de VPNs client-to-gateway costuma ser baseada no protocolo PPTP ou IPSEC.

Como demonstrei uma alternativa de configuração para construção de VPNs PPTP site-to-site, nada mais justo que demonstrar o processo de configuração do servidor… 😉

Vale lembrar que, cada conexão é negociada por um serviço que trabalha sob socket tcp/1723, mas o túnel final é GRE (Generic Routing Encapsulation). Como o GRE não é orientado a conexão, será possível estabelecer apenas um túnel POR ORIGEM (IP público).

1. Ajustes mínimos de firewall e módulos de kernel

Por ser uma VPN baseada no protocolo GRE, é preciso carregar o módulo de kernel ip_gre, e o suporte a encriptação MPPE (Microsoft Point-to-Point Encryption) é implementado pelo módulo ppp_mppe. Ambos devem ser carregados manualmente.

Regras de INPUT (iptables) devem ser definidas para liberar o acesso ao serviço pptpd e fluxo de pacotes GRE. Mas, para controlar o tráfego entre diferentes redes, o administrador deverá configurar limites de acesso na cadeia FORWARD.

modprobe ip_gre
modprobe ppp_mppe
iptables -A INPUT -d 0/0 -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -d 0/0 -p gre -j ACCEPT

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

Esta configuração deve ser prevista pelo script de firewall ou incluída no arquivo rc.local”

 

2. Configuração do servidor pptpd (arquivo /etc/pptp.conf)

A instalação e configuração do servidor em si é extremamente simples. Os maiores ajustes estão presentes na configuração do serviço pppd, onde podemos informar opções de autenticação, criptografia, servidores de DNS e WINS, por exemplo.

# – Instalação do serviço

apt-get install pptpd

# – Configuração

# TAG: option
#       Specifies the location of the PPP options file.
#       By default PPP looks in '/etc/ppp/options'
#
option /etc/ppp/options.pptpd

# TAG: logwtmp
#       Use wtmp(5) to record client connections and disconnections.
#
logwtmp

# TAG: localip
# TAG: remoteip
#       Specifies the local and remote IP address ranges.
listen 0.0.0.0
localip 10.50.1.1
remoteip 10.50.1.100-150

Em “listen“, configure o endereço “autorizado” para negociar as conexões de VPN (porta tcp/1723). Assim como em diferentes serviços, ao configurar o endereço como 0.0.0.0, o socket fica disponível globalmente – ou seja, passa a aceitar conexão em qualquer endereço.

Neste exemplo, a faixa de endereçamento definida para os clientes varia de 10.50.1.100 a 10.50.1.150 (remoteip), utilizando como referência local – e servindo como gateway – o endereço 10.50.1.1 (localip).

Como a interface de rede criada é ponto-a-ponto (PPP), o gateway padrão para os clientes remotos pode ser definido como o endereço configurado em localip, o próprio endereço atribuído ao cliente ou interface PPP“.

 

3. Definição das opções de rede em /etc/ppp/options.pptpd

Os principais ajustes de rede são feitos neste arquivo. É possível trabalhar com qualquer opção disponível para o serviço pppd (invocado sob demanda).

root@fwsrv:~# vim /etc/ppp/options.pptpd

# Name of the local system for authentication purposes 
# (must match the second field in /etc/ppp/chap-secrets entries)
name pptpd

# Authentication
refuse-pap
refuse-chap
refuse-mschap

require-mschap-v2
require-mppe-128

# Network and routing
ms-dns 10.67.50.10
ms-wins 10.67.50.10
proxyarp
mru 1460
mtu 1460

# Disable compression
nobsdcomp 
novj
novjccomp

# Deny IPX
noipx

# turn off logging to stderr, since this may be redirected to pptpd
nologfd

# timeouts
idle 1800
lcp-echo-interval 30
lcp-echo-failure 4

nodefaultroute
auth
#plugin winbind.so
#ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1" 

A opção proxyarp permite ativar a função de pseudo-bridge sobre a interface ppp (tende ser utilizada em conjunto com bcrelay em pptpd.conf) O objetivo prático é permitir que pacotes em broadcast atravessem a VPN. Logo, será irrelevante caso o administrador configure um segmento de rede exclusivo para a VPN.

As opções icp-echo-interval e icp-echo-failure são úteis porque determinam a tolerância a falhas sobre interfaces ppp. Com icp-echo-interval é possível determinar o intervalo de tempo para (re)transmissão de echo (a cada 30s) e icp-echo-failure o limite máximo de falhas. Ou seja, o cliente será desconectado caso o servidor não receba nenhum sinal de echo no intervalo de 2 minutos (30s * 4). É um ajuste interessante em VPNs PPTP ou conexões PPPoE também.

Para autenticação de usuários demonstraremos a configuração de um banco local, através do arquivo /etc/ppp/chap-secrets. Mas, existem alternativas muito mais flexíveis.

Caso exista interesse em ativar autenticação integrada com o AD, ingresse o concentrador ao domínio através do Winbind (Samba). Basta que o Winbind tenha visão dos usuários, não é necessário configurar a integração posix (a configuração do nsswitch é opcional). Neste caso, remova o comentário das duas últimas linhas. Também é possível integrar o pppd a um servidor Radius“.

 

4. Autenticação local

root@fwsrv:~# vim /etc/ppp/chap-secrets

# Secrets for authentication using CHAP                                                                                                              
# client       server     secret              IP addresses                                                                                         
fltunel2         *          s3nhavpn2           10.50.1.52                                                                                          
fltunel3         *          s3nhavpn3           10.50.1.53                                                                                          

Os usuários são definidos na primeira coluna e a senha na terceira. A reserva de IP pode ser feita pela última coluna. E, para alocação dinâmica (dentro do intervalo programado), basta configurar a última coluna como “*” ao invés do IP.

Por fim, basta reiniciar o serviço pptpd:

service pptpd restart

ou

systemctl restart pptpd

Espero que o material seja útil! 😉