quarta-feira, 17 de fevereiro de 2010

Túnel VPN entre redes privadas

Suponha-se uma rede privada A, com vários servidores e clientes, com atribuições de IPs na subrede 10.0.0.0/8. Suponha-se outra rede privada B, com vários clientes na subrede 192.168.2.0/24.
Estas duas redes estão "separadas" pela Internet, pelo que normalmente os computadores atrás de uma não conseguem aceder a serviços dos computadores na outra.

Depois desta configuração, o cliente na rede B conseguirá aceder a todos os serviços na rede A, agindo como se estivesse dentro da própria rede A. Com configurações adicionais, os restantes computadores na rede B podem conseguir aceder à rede A através do cliente configurado.

Exemplo de topologia:
Rede A   --INTERNET--  Rede B
| |
servidor cliente


Detalhes do ambiente:

  • Na rede A é permitida a entrada de tráfego por secure shell (SSH) num host específico dessa rede, aqui chamado gateway. O acesso à rede é feito através de um servidor, que pode ser distinto da gateway, algures dentro da rede A;

  • A gateway usa o servidor SSH Dropbear. Tanto a gateway como o servidor são routers que correm OpenWRT Kamikaze. Outros ambientes podem ter detalhes de configuração diferentes.



TODO:
  • Descobrir como utilizar resolução de nomes iterativa, tendo em conta respostas NXDOMAIN: a ideia é utilizar a resolução de nomes da rede B mas quando se obtém uma resposta negativa, recorrer à resolução de nomes do servidor na rede A;

  • Investigar melhor os parâmetros nos ficheiros de configuração.



No servidor (dentro da rede A):
  1. Instalar, configurar e activar o servidor OpenVPN:
    root@server:~# apt-get install openvpn
    root@server:~# egrep -v "\#|;|^$" /etc/openvpn/server.conf
    port 1194
    proto tcp-server
    dev tun
    ifconfig 192.168.100.1 192.168.100.20
    keepalive 10 120
    status openvpn-status.log
    verb 3
    root@server:~# /etc/init.d/openvpn enable ; /etc/init.d/openvpn start


No cliente (dentro da rede B):
  1. Automatizar logins na gateway:
    user@client:~$ cd .ssh/
    user@client:~/.ssh$ ssh-keygen -t dsa
    user@client:~/.ssh$ ssh-copy-id -i id_dsa.pub root@gateway.redeA.com
    user@client:~/.ssh$ ssh root@gateway.redeA.com "cat .ssh/authorized_keys >> /etc/dropbear/authorized_keys; rm .ssh/authorized_keys"

  2. Automatizar encaminhamento de portos assim que houver ligação
    user@client:~$ grep "post-" /etc/network/interfaces
    post-up su user -c "ssh -N root@gateway.redeA.com -L 1090:server:1194" &
    post-down pkill -u user -f "ssh -N root@gateway.redeA.com -L 1090:server:1194"

  3. Instalar, configurar e activar cliente VPN
    root@client:~# apt-get install openvpn


    user@client:~$ cat /etc/openvpn/client.conf
    dev tun
    ifconfig 192.168.100.20 192.168.100.1
    up ./defroute.sh
    down ./remroute.sh
    keepalive 1 120
    proto tcp-client
    remote localhost 1090
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    verb 3
    tun-mtu 1500
    mssfix 1450

    user@client:~$ cat /etc/openvpn/defroute.sh
    #!/bin/sh
    route add -net 10.0.0.0 netmask 255.0.0.0 gw $5
    mv /etc/resolv.conf /etc/resolv.conf.back
    echo "nameserver IP_DO_SERVIDOR `cat /etc/resolv.conf.back | awk '{print $2}'`" > /etc/resolv.conf

    user@client:~$ cat /etc/openvpn/remroute.sh
    #!/bin/sh
    route del -net 10.0.0.0 netmask 255.0.0.0 gw $5
    mv /etc/resolv.conf.back /etc/resolv.conf

    user@client:~$ grep OPTARGS /etc/default/openvpn
    OPTARGS="--script-security 2"


    root@client:~# invoke-rc.d openvpn restart


Referências:
OpenWRT Wiki: Why Public Key Authentication - Disable password login
comp.security.ssh newsgroup: "Re: Possible to setup a SSH port forwarding only (!) in background without showing a Terminal window?"
Documentação do pacote openvpn (em /usr/share/doc/openvpn).

Sem comentários: