Como na verão 4.3, o OpenSSH pode usar o dispositivo tun/tap para criptografar um túnel. Ele é bem similar as outras soluções TLS baseado em VPN como o OpenVPN. Uma vantagem do SSH é que não há necessidade de instalar e configurar software adicional. Adicionalmente o túnel utiliza a autenticação SSH como chaves pré-compartilhadas. A desvantagem é que o encapsulamento é feito em TCP que pode resultar em desempenho pobre em um link lento. O túnel também conta com uma única conexão TPC (frágil). Essa técnica é muito útil para uma rápida configuração VPN baseada em IP. Não há limitação como com um único direcionamento de porta TCP, todos os protocolos de camada 3/4 como ICMP, TCP/UDP, etc. são direcionadas no VPN. Em todo caso, as seguintes opções são necessárias no arquivo sshd_conf:
PermitRootLogin yes PermitTunnel yes
Conexão única P2P
Aqui vamos conectar dois hosts, hclient e hserver com o túnel ponto a ponto (peer to peer tunnel). A conexão é iniciada do hclient para o hserver e é feita como root. Os pontos finais do túnel estão em 10.0.1.1 (servidor) e 10.0.1.2 (cliente) e nós críamos um dispositivo tun5 (Esse poderia também ter sido um outro número). O procedimento é muito simples:
- Conect com o SSH utilizando a opção -w do túnel
- Configure o endereço IP do túnel. Uma vez no servidor e uma vez no cliente.
Conect ao servidor
A conexão iniciada no cliente e os comandos são executados no servidor.
No servidor Linux
cli># ssh -w5:5 root@hserver srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # Executado no shell do servidor
No srevidor FreeBSD
cli># ssh -w5:5 root@hserver srv># ifconfig tun5 10.0.1.1 10.0.1.2 # Executado no shell do servidor
Configure o cliente
Comandos executados no cliente:
cli># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 # Cliente no Linux cli># ifconfig tun5 10.0.1.2 10.0.1.1 # Cliente no FreeBSD
Os dois hosts estão agora conectados e podem transparentemente comunicar com qualquer protocolo de camada 3/4 utilizando o endereço de IP do túnel.
Conectar duas redes
Em adição a configuração p2p acima, é mais útil conectar duas redes privadas com uma VPN SSH utilizando dois gates. Suponhamos por exemplo, netA seja 192.168.51.0/24 e netB 192.168.16.0/24. O procedimento é similar ao acima, precisamos somente adicionar o roteamento. O NAT deve ser ativado na interface privada somente se os gates não forem os mesmos que o gateway padrão de sua rede.
192.168.51.0/24 (netA)|gateA <-> gateB|192.168.16.0/24 (netB)
- Conecte com o SSH utilizando a opção -w do túnel.
- Configure o endereço IP do túnel. Uma vez no servidor e uma vez no cliente.
- Adicione o roteamento para as duas redes.
- Se necessário, ative o NAT na interface privada do gate.
A configuração é iniciada a partir do gateA no netA.
Conecte do gateA ao gateB
Conexão é iniciada do gateA e os comandos são executador no gateB.
gateB está no Linux
gateA># ssh -w5:5 root@gateB gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # Executado no shell do gateB gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5 gateB># echo 1 > /proc/sys/net/ipv4/ip_forward # Somente necessário se não for padrão (default gw) gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
gateB está no FreeBSD
gateA># ssh -w5:5 root@gateB # Cria os dispositivos do tun5 gateB># ifconfig tun5 10.0.1.1 10.0.1.2 # Executado no shell do gateB gateB># route add 192.168.51.0/24 10.0.1.2 gateB># sysctl net.inet.ip.forwarding=1 # Somente necessário se não for padrão (default) gw gateB># natd -s -m -u -dynamic -n fxp0 # veja se NAT gateA># sysctl net.inet.ip.fw.enable=1
Configure o gateA
Comandos executados no gateA:
gateA está no Linux
gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5 gateA># echo 1 > /proc/sys/net/ipv4/ip_forward gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
gateA está no FreeBSD
gateA># ifconfig tun5 10.0.1.2 10.0.1.1 gateA># route add 192.168.16.0/24 10.0.1.2 gateA># sysctl net.inet.ip.forwarding=1 gateA># natd -s -m -u -dynamic -n fxp0 # veja NAT gateA># sysctl net.inet.ip.fw.enable=1
As duas redes privadas agora estão transparentemente conectadas via VPN SSH. O direcionamento de IP e as configurações NAT são necessárias somente se os gates não forem os gateways padrões. Nesse caso os cliente não saberiam para aonde direcionar a resposta, e o NAT deve ser ativado.