VPN – usando SSH

Introdução e configuração do servidor

SSH normalmente é usado com a principal finalidade que é o acesso remoto, porém, com esta poderosa ferramenta, há mais coisas que podem ser feitas, uma delas é criar túneis encriptados temporários e uma VPN real.

Neste artigo irei abordar como configurar seu servidor SSH para rodar como um servidor VPN para conexão ponto a ponto. Não se trata de um configuração trabalhosa.

O túnel que será criado irá utilizar a interface TUN/TAP, nos exemplos utilizaremos a TAP para estabelecer a conexão entre cliente e servidor

Chega de papo e vamos à prática!!!!

O primeiro passo é editar o arquivo “/etc/ssh/sshd_config” no servidor (você pode usar o próprio SSH para acessar e depois editar o arquivo), adicionando a linha abaixo no arquivo:

PermitTunnel yes

É necessário também que a linha “PermitRootLogin = yes” esteja presente, já que, por segurança, apenas o ‘root’ pode criar a VPN. 

Se você não quer permitir logins como ‘root’ devido à questão da segurança, uma opção é combiná-la com a linha “PermitRootLogin = forced- commands-only”, como em:

PermitRootLogin = yes
PermitRootLogin = forced-commands-only

Ela torna o acesso como ‘root’ um pouco mais restritivo, pois permite apenas o uso do ‘root’ para a execução de comandos (como o que usaremos para criar o túnel) e não para login direto. Depois de feitas as alterações, reinicie o servidor SSH para que as alterações entrem em vigor.

Reinicie o servidor com o comando:

# /etc/init.d/ssh restart

Após configurar o servidor e reiniciar o mesmo, seu servidor estará rodando o SSH e pronto para estabelecer a conexão VPN pelo protocolo de criptografia do SSH.

Caso apareça algum erro, pode ser que a versão do SSH que você utiliza seja mais antiga, pois o SSH só tem este recurso a partir da versão 4.3.

Neste caso, recomendo que instalar a versão mais nova pelo gerenciador de pacotes ou, baixando e instalando manualmente, para então poder proceder com a configuração e conexão da VPN.

Os erros que podem aparecer, caso seu SSH esteja com uma versão anterior à ‘4.3’, são:

/etc/ssh/sshd_config: line 27: Bad configuration option: PermitTunnel
/etc/ssh/sshd_config: terminating, 1 bad configuration options

Estabelecendo a conexão – Túnel ponto a ponto

Depois de realizar a configuração no servidor, é hora de estabelecer a conexão com o mesmo e começar a usar sua VPN.

Logado como ‘root’ (no cliente), digite no terminal o comando abaixo:

# ssh -f -w 0:0 -o Tunnel=ethernet [email protected] ifconfig tap0 10.5.5.1 netmask 255.255.255.0

Obs.: É necessário digitar usando o usuário ‘root’, pois só ele tem poder administrativo para gerar o dispositivo virtual no servidor e no cliente. A autenticação realizada vai seguir a configurada no servidor, pode ser através da senha do ‘root’ ou através das chaves de autenticação ( o que é mais seguro).

Caso digite o comando sem o usuário ‘root’ ter permissão de se logar via SSH (configuração feita no “/etc/ssh/sshd_config” na primeira página), provavelmente um erro como o mostrado abaixo será retornado:

Tunel device open failed
Could not request tunnel forwarding

Caso apareça este outro erro descrito abaixo, significa que, ou o SSH do servidor não está usando uma versão mais antiga ou a opção ‘PermitTunnel’ está desabilitada:

SIOCSIFADDR: Dispositivo inexistente
tap0: ERROR while getting interface flags: Dispositivo inexistente
SIOCSIFNETMASK: Dispositivo inexistente

Explicação das opções usadas:

  • -f:- Esta opção faz com que o comando seja executado em background e não fique ocupando seu terminal durante a execução.
  • -w 0:0:- É usada para criar o túnel, neste caso criando a interface ‘tap0’ no cliente e a interface ‘tap0’ no servidor.
  • -o Tunnel=ethernet:- Indica que deve ser criada uma interface virtual TAP. O default do SSH (quando a opção é omitida) é criar uma interface TUN. A grande diferença entre as duas é que a interface TAP pode ser usada para criar um ‘bridge’, o que permite efetivamente unir as duas redes.
  • [email protected]:- O ‘192.168.222.33’ representa o endereço IP do servidor, e deve ser substituído pelo endereço IP do seu servidor SSH. O “root” refere-se ao usuário que irá logar no servidor.
  • ifconfig tap0 10.5.5.1 netmask 255.255.255.0:- Configura o endereço IP e a máscara que será usada pela interface ‘tap0’ que será criada no servidor. Você pode usar o endereço e máscara que quiser, mas ela deve ser diferente da faixa de IPs usada na rede local.

Após executar o comando no cliente e não ter gerado algum erro como comentado no inicio da página, logue no servidor como ‘root’ e execute o comando:

# ifconfig

E veja que a interface ‘tap0’ foi criada:

tap0 Encapsulamento do Link: Ethernet Endereço de HW EA:CE:66:FB:1A:DG
inet end.: 10.5.5.1 Bcast:10.5.5.255 Masc:255.255.0.0
endereço inet6: fe80::e8ce:ecff:fefb:1add/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:4 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:26 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:500
RX bytes:328 (328.0 b) TX bytes:4317 (4.2 KiB)

Observe que foi criado até um MAC para a interface virtual.

Agora é hora de configurar a interface ‘tap0’ do cliente que ainda não foi ativada. Para isto, execute no terminal como ‘root’:

# ifconfig tap0 10.5.5.2 netmask 255.255.255.0 up

Teste, usando o ping:

# ping -c 3 10.5..5.1

Definindo rotas

Todo o trabalho até então, foi apenas para estabelecer a conexão do cliente com servidor permitindo a comunicação entre ambos.

Porém, para que implantar uma VPN na rede, se não conseguir se comunicar com os outros ‘hosts’ da rede?

Como este não é o propósito do artigo, então vamos adicionar rotas para fazer com que o cliente se conecte aos ‘hosts’ da rede do servidor.

No servidor, execute os comandos abaixo para fazer o roteamento usando o ‘root’:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -s 10.5.5.2 -A POSTROUTING -o eth0 -j MASQUERADE

Explicação:

O primeiro comando faz com que o redirecionamento de pacotes seja ativado no servidor, permitindo que os pacotes do cliente seja redirecionado para os outros ‘hosts’ da rede e vice-versa.

O segundo comando faz com que todo tráfego vindo do cliente seja mascarado, neste caso estou supondo que a interface ‘eth0’ seja a interface conectada à rede local do servidor.

No cliente, ative uma rota para a rede do local do servidor:

# route add -net 192.168.222.0 netmask 255.255.255.0 gw 10.5.5.1 dev tap0

No comando acima, o ‘192.168.222.0’ indica a faixa de endereços usada na rede local do servidor. O ‘255.255.255.0’ indica a máscara, e o ‘10.5.5.1’ indica o endereço da interface ‘tap0’ do servidor.

Com isso, o cliente passa a encaminhar todas as tentativas de acesso a endereços dentro da faixa especificada para o servidor (usando a interface ‘tap0’), e o servidor as encaminha para a interface de rede local.

Conclusão

Esta é uma forma de utilizar uma VPN usando o SSH como ferramenta principal e bastante segura.

Rolar para cima