segunda-feira, 16 de janeiro de 2012

Script para manter VPN PPTP ativa

VPN
Aqui em casa, uso um link de internet residencial da PredialNet que sempre me atendeu muito bem exceto para downloads via BitTorrent, que eram lentos e instáveis. Apenas recentemente descobri que a causa disso é que, por padrão, a PredialNet bloqueia muitas portas no seu link padrão, e algumas dessas portas são necessárias para que os downloads via BitTorrent (e também outros protocolos P2P, como eDonkey) mantenham-se rápidos e estáveis.

Como muitos clientes precisam que essas portas estejam liberadas, a PredialNet disponibiliza uma VPN que pode ser usada para acessar a internet sem aquelas restrições. Usando essa VPN, os downloads via BitTorrent são muito mais rápidos, o Skype funciona melhor, e muitos outros serviços também. O problema é que essa VPN é muito instável, então eu precisei desenvolver um método para mantê-la ativa, reconectando-a automaticamente sempre que ficasse indisponível.

NOTA: o procedimento descrito abaixo foi testado no Fedora 16 x86_64 usando o ambiente desktop Gnome 3 e o gerenciador de redes NetworkManager.

Antes de mais nada, certifique-se de que o pacote NetworkManager-pptp esteja instalado no sistema:

# yum -y install NetworkManager-pptp

NetworkManager: Selecione a interface para usar o novo serviço
Agora, é necessário criar uma nova conexão VPN. Para isso, clique no ícone de gerenciamento de conexões de rede e em Configurações de rede. Depois, clique no sinal de + para criar uma nova conexão, selecione VPN e clique em Criar.

Outra opção é executar o comando nm-connection-editor, acessar a aba VPN e clicar em Adicionar.

NetworkManager: Escolha o tipo de conexão VPN
Depois, você deverá selecionar o tipo de VPN a ser criada. Nesse caso, é Protocolo de Encapsulamento Ponto a Ponto (PPTP). Selecione-o e clique em Criar.

NetworkManager: Editando VPN PredialNet, VPN
NetworkManger: Opções PPTP avançadas
No campo Nome da conexão, insira um nome para identificar essa nova conexão. Eu usei "VPN PredialNet". Na aba VPN, insira os dados de conexão da VPN. No caso da PredialNet, os dados são:
  • Gateway: 172.16.10.35;
  • Usuário: conectar;
  • Senha: conectar.

Depois, clique em Avançado para ajustar algumas opções da VPN. Selecione a opção Usar criptografia ponto a ponto (MPPE) e, na caixa de seleção Segurança, escolha a opção 128 bits (mais seguro). Selecione também a opção Enviar pacotes PPP de eco e clique em OK e depois em Salvar.

Depois disso, você poderá iniciar a VPN através do gerenciador de conexão do NetworkManager. Porém, no caso da PredialNet, a conexão era muito instável. A qualquer momento a VPN simplesmente parava de trafegar dados e o único jeito de fazer tudo voltar ao normal era reiniciar a conexão VPN. Para resolver esse problema, criei um script que monitorava o status da conexão e a reiniciava automaticamente sempre que fosse detectado que ela não estava mais trafegando dados.

O script faz uso da ferramenta nmcli, que permite gerenciar as conexões do NetworkManager via linha de comando. A sintaxe simplificada do comando é mostrada abaixo.

# nmcli con [ação] [identificador]

As ações podem ser up, para iniciar a conexão, e down, para finalizá-la. Os identificadores podem ser id [nome] ou uuid [UUID]. Para ver nome e UUID das conexões do NetworkManager, basta executar o comando nmcli con, como mostrado abaixo.

# nmcli con
NAME                      UUID                                   ...
dennetwork - automática   143f3170-9b9e-4cfa-9a4e-5fda85aa695f   ...
VPN PredialNet            f2f8f227-ff76-42dc-a6ac-283860919aca   ...

Fazendo o teste para ver se conseguimos iniciar nossa VPN pela linha de comando, obtemos um erro referente à senha inválida para a VPN:

# nmcli con up id "VPN PredialNet"
Estado da conexão ativa: desconhecido
Caminho da conexão ativa: /org/freedesktop/NetworkManager/ActiveConnection/315
estado: Conexão VPN (precisa de autenticação) (2)
Erro: a ativação da conexão falhou: sem segredos VPN válidos.

Para resolver esse problema é preciso editar o arquivo /etc/NetworkManager/system-connections/[nome] e fazer algumas alterações. Use se editor de texto favorito editar o arquivo, eu uso o vim.

# vim "/etc/NetworkManager/system-connections/VPN PredialNet"

Procure pela opção password-flags e mude o seu valor para 0. Depois, insira o seguinte código abaixo no final do arquivo:

[vpn-secrets]
password=[senha da VPN]

Salve o arquivo, feche-o e tente conectar-se à VPN novamente usando o nmcli:

# nmcli con up id "VPN PredialNet"
Estado da conexão ativa: desconhecido
Caminho da conexão ativa: /org/freedesktop/NetworkManager/ActiveConnection/316
estado: Conexão VPN (precisa de autenticação) (2)
estado: Conexão VPN (3)
estado: Conexão VPN (obtendo configuração de IP) (4)
Conexão ativada

Pronto, o nmcli já consegue iniciar a conexão VPN. Agora só falta um passo antes de criarmos o nosso script. Crie um arquivo de configuração em /etc/vpn-monitor e insira o UUID da conexão (vide comando nmcli con acima) e a interface em que ela é estabelecida (normalmente ppp0):

VPN_UUID="f2f8f227-ff76-42dc-a6ac-283860919aca"
VPN_IFACE="ppp0"

Agora, crie o arquivo /usr/local/bin/vpn-monitor com o conteúdo abaixo.

#!/bin/bash
#
# vpn-monitor
# Monitora o estado da VPN Predial Net e reinicia a conexão em caso de falha
#
# Autor: Davidson Paulo 
# Data: 16 de Janeiro de 2012

## Variáveis
. /etc/vpn-monitor

## Funções
start_pptp() {
 echo "==> Iniciando VPN"
 nmcli con up uuid "$VPN_UUID"
}

stop_pptp() {
 echo "==> Parando VPN"
 nmcli con down uuid "$VPN_UUID"
}

vpnIsUp() {
 route_ip="$(ifconfig $VPN_IFACE 2> /dev/null | fgrep P-a-P | awk '{ print $4 }' | cut -d: -f2)"
 [ -n "$route_ip" ] && ping -c 1 -w 5 $route_ip > /dev/null 2>&1 
 RETVAL=$?
 if [ $RETVAL -ne 0 ] ; then
 echo "==> VPN offline"
 fi
 return $RETVAL
}

trap "stop_pptp ; exit $?" SIGHUP SIGINT SIGTERM

while true ; do
 if ! vpnIsUp ; then
  stop_pptp
  start_pptp
 else
  echo "[VPN OK]"
 fi
 sleep 5
done

exit 0

Por fim, dê permissão de execução ao script e execute-o. Sua conexão VPN será estabelecida e a comunicação verificada a cada 5 segundos. Se for detectado problema com a VPN, ela será reiniciada automaticamente.

# chmod +x /usr/local/bin/vpn-monitor
# vpn-monitor
==> VPN offline
==> Parando VPN
Aviso: conexão inativa
==> Iniciando VPN
Estado da conexão ativa: desconhecido
Caminho da conexão ativa: /org/freedesktop/NetworkManager/ActiveConnection/318
estado: Conexão VPN (precisa de autenticação) (2)
estado: Conexão VPN (3)
estado: Conexão VPN (obtendo configuração de IP) (4)
Conexão ativada
[VPN OK]

O script é executado em primeiro plano e pode ser interrompido a qualquer momento pressionando-se Ctrl+C. Ao fazer isso, a VPN é derrubada antes de o script ser interrompido.

Com esse script, eu posso ir dormir tranquilo, sabendo que meus downloads via BitTorrent não serão interrompidos por falha na VPN. Simplesmente sensacional.

Esse script deve funcionar com pouca ou nenhuma alteração em qualquer distribuição que utilize o NetworkManager como gerenciador de conexões de rede, tais como Ubuntu, Linux Mint, openSUSE e outras.

E aí, gostou da dica? Deixe seu comentário. Um grande abraço e até a próxima!

1 comentários:

Muito obrigado por comentar. Seu comentário será publicado imediatamente.