Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

terça-feira, 20 de janeiro de 2015

OpenWRT: Servidor VPN com OpenVPN

Mais um artigo da série sobre o OpenWRT.

Uma das características que acho mais fascinante da a internet é a possibilidade de trabalhar de qualquer lugar. Muitas empresas já utilizam esta característica para permitir que seus funcionários trabalhem em viagem, de casa, de onde estiver. Afinal, cada posto de trabalho e o deslocamento custa um bom trocado. Para trabalhar, em geral, é necessário ter acesso as informações e serviços da rede interna da empresa.

Esta necessidade de acesso também é comum para o mundo residencial. Quando temos um serviço na rede interna em casa e que queremos acessar "de fora", a técnica mais comum é o encaminhamento de portas. Ela mapeia uma porta do roteador para um serviço de computador da rede interna. Contudo, isto expõe estes serviços a ataques externos. Normalmente, não é uma boa ideia para serviços muito populares ou sem segurança.

Também podemos fazer este acesso por encaminhamento de portas em uma conexão SSH. Funciona muito bem e, desde que o SSH não seja comprometido, é seguro. Só não é muito prático. Configurar os encaminhamentos individualmente para cada serviço pode ser um tanto trabalhoso. Os acessos não ficam muito práticos pois tudo estará em portas locais (127.0.0.1:xxxx). Não fica transparente para o usuário. Para ter um acesso de forma mais simples e transparente, podemos usar uma conexão VPN.

A VPN (virtual private network) permite a conexão de dois pontos através de uma rede virtual, como se existisse um cabo de rede ligando diretamente as duas pontas. Para os programas que utilizarem este "cabo virtual", não existirá diferença entre estar ligado diretamente na rede local ou estar a milhares de quilômetros (exceto que a velocidade da internet é algumas vezes mais lenta que a rede local). Como a internet não é um meio dos mais seguros para trafegar informações internas (alô Obama!), se tornou quase implícito a utilização de criptografia nas conexões VPN.

Existem algumas formas de prover esta conectividade. As mais comuns são pelo protocolo PPTP, L2TP/IPSEC, ou pelo OpenVPN. O primeiro, apesar de ser um dos mais antigos e mais largamente disponíveis, não é muito seguro e vou deixar de lado. O segundo também é bem comum e disponível nativamente em diversos ambientes, como Windows e Android. O OpenVPN é ótimo mas depende da disponibilidade e da instalação do cliente OpenVPN para seu ambiente. Como é um serviço completo em si, o OpenVPN é mais fácil de implementar o servidor. Vou começar por este.

O OpenVPN é relativamente tranquilo de instalar e possui clientes para diversos ambientes, inclusive plataformas mobile. A parte mais complicada é a autenticação. Esta normalmente é feita através de certificados emitidos por uma CA, que criaremos durante o processo (não precisa comprar certificados).

Você vai precisar de um roteador com OpenWRT (utilizarei o Barrier Breaker - BB - mas o AA também funciona), com 8 MB de flash ou disco expandido via unidade USB. Você também precisará editar alguns arquivos pelo terminal (SSH/Telnet). Seria bom conhecer ao menos o básico do editor vi. A interface WEB não é suficiente.

Na versão Barrier Breaker, existe 3 opções de openvpn:
  • openvpn-nossl (sem criptografia)
  • openvpn-openssl
  • openvpn-polarssl

A primeira é mais enxuta mas não utiliza criptografia, o que normalmente é um requisito de um serviço VPN. Os dois seguintes são equivalentes, variando apenas a implementação de ssl que será utilizada. O polarssl é mais enxuto tanto em funcionalidades como em tamanho. É muito interessante para ambientes com restrição de recursos como o roteador e provavelmente terá tudo que você precisa. Contudo, se você já tem o libopenssl instalado por requisito de outro pacote, não vale a pena instalar o polarssl em paralelo. No meu caso, como tenho outros pacotes que já exigem o openssl, vou instalar o segundo pacote (em destaque).

Também é interessante instalar o openvpn-easy-rsa. Ele cria a infraestutura de uma CA de fácil gerenciamento. Você poderia utilizar o certificado de outra autorizade certificadora. Porém, considero uma CA dedicada ao VPN a solução mais atraente, tanto por simplificar o gerenciamento como para restringir problemas de segurança. Afinal, o comprometimento desta CA dedicada fornecerá ao atacante acesso ao roteador, que já seria previamente um requisito para poder comprometer a CA.

opkg update
opkg install openvpn-openssl openvpn-easy-rsa

Já adiantando, se o roteador fosse utilizado como um cliente OpenVPN, o pacote seria o mesmo (openvpn-{nossl,openssl,polarssl}). Só não seria necessário o openvpn-easy-rsa.

Antes de configurar o openvpn, vamos montar a CA. O easy-rsa trabalha apenas com scripts para fornecer toda a funcionalidade de uma CA necessária para o OpenVPN. Os parâmetros que você deve querer alterar estão em /etc/easy-rsa/vars. Você vai querer alterar estes campos:

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"

Existem outros campos como tamanho de chave e expiração do certificado que você pode querer aumentar ou desativar:

export KEY_SIZE=2048
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650

Agora é só criar a CA:

# clean-all # opcional para primeira execução
# build-ca # (com o /etc/easy-rsa/vars configurado, só seguir)
# build-dh # vai demorar...

Não é necessário mas gosto de sempre gerar a lista de certificados revogados e configurá-la no OpenVPN. Caso precise revogar um certificado, tudo está pronto. Porém, a versão do easy-rsa do OpenVPN só gera o crl.pem ao revogar um certificado. Você pode gerá-lo manualmente com este comando:

# (. /etc/easy-rsa/vars;  CRL="/etc/easy-rsa/keys/crl.pem"; KEY_CN="" KEY_OU="" KEY_NAME="" $OPENSSL ca -gencrl -out "$CRL" -config "$KEY_CONFIG")

Agora podemos criar o certificado do servidor VPN e dos clientes:

# build-key-server server
# build-key cliente1
# build-key cliente2
# ...

Crie quantos clientes quiser e a qualquer tempo. Escolha nomes informativos como cliente-tablet-luiz. Quanto ao certificado do servidor, normalmente teremos apenas um durante toda a validade do certificado. Se trocar o nome de server para outra coisa, irá afetar os campos cert e key da configuração do OpenVPN.

Depois podemos configurar o servidor VPN. O arquivo de configuração fica em /etc/config/openvpn:


config 'openvpn' 'lan'

        option 'enable' '1'

        option 'port' '1194'

        option 'proto' 'udp'

        option 'dev' 'tun'
        option 'ca' '/etc/easy-rsa/keys/ca.crt'
        option 'cert' '/etc/easy-rsa/keys/server.crt'
        option 'key' '/etc/easy-rsa/keys/server.key'
        option 'dh' '/etc/easy-rsa/keys/dh2048.pem'
        option 'crl_verify' '/etc/easy-rsa/keys/crl.pem'
        option 'ifconfig_pool_persist' '/tmp/ipp.txt'
        option 'keepalive' '10 120'
        option 'comp_lzo' 'no'
        option 'persist_key' '1'
        option 'persist_tun' '1'
        option 'status' '/var/log/openvpn-status.log' 
        option 'verb' '3'
        option 'server' '192.168.2.0 255.255.255.0'
        option 'client_to_client' '1'
        list 'push' 'redirect-gateway def1'
        list 'push' 'dhcp-option DNS 192.168.1.1'
list 'push' 'route 192.168.1.0 255.255.255.0'

Os destaques tem as opções que você provavelmente quer alterar. A porta 1194 é a padrão e pode ser interessante trocá-la para evitar que uma varredura simples de rede achem seu OpenVPN. O crl_verify deve estar presente caso você tenha gerado o crl.pem que comentei anteriormente. Caso não deseje revogar certificados, remova-o. 

ifconfig_pool_persist permite que os endereços atribuídos a um cliente se mantenham na próxima conexão. Isto é equivalente ao arquivo leases do DHCP. Contudo, ao colocá-lo em /tmp, você irá perder este arquivo a cada reboot do roteador. Mude para /etc/openvpn/ipp.txt para manter mesmo após desligar o roteador ou remova a linha caso não queira manter os endereços.

A opção comp_lzo habilita a compactação do tráfego antes da criptografia. Isto poupa a quantidade de dados trafegados mas aumenta a carga sobre o roteador e também deixa a conexão um pouco mais lenta.

A opção server indica a faixa de endereços utilizada pelos clientes VPN. Ela não será a mesma da sua rede local. Procure escolher algo que não conflite com a rede local do servidor VPN e nem dos clientes (contudo algumas vezes não é possível conhecê-la previamente).

Os push finais são usados para enviar configurações ao cliente. As apresentadas criam a rota para seu cliente VPN falar com a LAN do servidor VPN. Caso contrário, ele somente irá ver o servidor VPN e não os clientes. Remova estas linhas se quer apenas acessar os serviço do roteador onde o servidor VPN está.

É hora de disparar o serviço:


/etc/init.d/openvpn start

Acompanhe pelo logread por possíveis erros. Isto é uma execução normal:

Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: OpenVPN 2.3.6 mips-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [MH] [IPv6] built on Jan  6 2015
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: library versions: OpenSSL 1.0.1j 15 Oct 2014, LZO 2.08
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: Diffie-Hellman initialized with 2048 bit key
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: Socket Buffers: R=[163840->131072] S=[163840->131072]
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: TUN/TAP device tun0 opened
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: TUN/TAP TX queue length set to 100
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: /sbin/ifconfig tun0 192.168.xx.1 pointopoint 192.168.33.2 mtu 1500
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: /sbin/route add -net 192.168.xx.0 netmask 255.255.255.0 gw 192.168.xx.2
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: UDPv4 link local (bound): [undef]
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: UDPv4 link remote: [undef]
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: MULTI: multi_init called, r=256 v=256
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: IFCONFIG POOL: base=192.168.xx.4 size=62, ipv6=0
Tue Jan 20 16:07:20 2015 daemon.notice openvpn(server)[7991]: Initialization Sequence Completed

Já está funcionando? Sim, mas não para os clientes externos. Disparamos o serviço neste ponto para o OpenVPN criar o dispositivo tun0. Isto permite que seja utilizado o Luci (interface web) para configurar o firewall. Você pode visualizar esta interface pelo "ifconfig" ou "ip add show".

No firewall, abra a porta 1194 UDP ou a que você definiu anteriormente para receber conexões externas. Está em "Rede/Firewall/Regras de Tráfego/Abrir portas no roteado".

Neste momento, os clientes já podem conectar ao serviço. Todavia, ao conectarem, existirá um cabo virtual entre o cliente e o dispositivo tun0 do roteador (versão simplificada da topologia). O problema é que tun0 não pertence a nenhuma interface do OpenWRT (e consequentemente, a nenhuma zona do firewall). Por padrão, este tráfego será descartado.

Pela interface Luci, adicione uma nova interface (sugestão de nome: vpn) no OpenWRT em Rede/Interfaces. Configure-a para ser não gerenciada e escolha o dispositivo tun0. Nesta mesma interface, você já pode atribuir uma zona do firewall. Se os clientes VPN terão privilégios iguais aos da rede local, basta adicionar a interface vpn à zona lan. Se quiser algo diferenciado, crie uma nova zona e defina a vontade as regras de filtragem.

Está pronto. Seus clientes devem estar prontos para conectar ao seu novo serviço.
Para isto, eles vão precisar:
  • /etc/easy-rsa/keys/<cliente>.crt
  • /etc/easy-rsa/keys/<cliente>.key
  • /etc/easy-rsa/keys/ca.crt
  • O endereço internet do seu roteador (pode ser o FQDN de um DNS dinâmico)
  • Saber se está usando a compactação (lzo) ou não
Para alguns clientes você vai precisar de um profile xxx.opvn. Existem algumas alternativas para criá-lo. Uma seria fazê-lo manualmente. É um arquivo texto neste formato

client
remote-cert-tls server
remote endereco-internet porta
comp-lzo yes
<ca>
conteúdo de ca.crt
</ca>
<key>
conteúdo de <cliente>.key
</key>
<cert>
conteúdo de <cliente>.crt
</cert>

Retire o comp-lzo se não usar a compactação no servidor. Também existem ferramentas para Linux e Windows que geram o .ovpn. Alternativamente, use este script diretamente no roteador.

Caso a conexão de um cliente não funcione, observe os logs tanto do OpenWRT (logread) como do cliente OpenVPN. Um sniffer de rede escutando na interface externa também ajuda. Testes de clientes VPN vindos da rede local para o endereço IP do roteador externo não irão funcionar automaticamente pois ele irá responder com o endereço IP interno e o cliente recusará a resposta vinda de outro endereço. É um problema muito parecido ao apresentado em um post antigoSe for testar de dentro da sua rede, use o IP interno do roteador (por padrão, 192.168.1.1).

Mas eu queria ter um endereço de dentro da rede (LAN) e não em uma faixa diferente (VPN). Tem como? Sim. Neste caso, o modo do túnel deve ser tap e não tun. Além disto, a interface tap0 teria que ser adicionada a br-lan. Porém, isto faz com que todas as mensagens broadcast da LAN sejam enviadas pelo túnel. Normalmente isto resulta em um bom desperdício de rede. Outro problema é que alguns clientes não suportam tap, como o android, devido a limitação da API VpnService (reclamem com o Google).

No próximo post mostro como fazer o outro lado configurando um cliente OpenVPN no roteador.

Atualizando: Alguma dúvida? Criei um fórum para o blog e vou criar um tópico para cada novo artigo.

Até a próxima.

51 comentários:

  1. Excelente!! Esse já virou pdf e está salvo permanentemente na lista!!
    Recente eu usei uma caixinha, GLinet, e coloquei um firmware prontinho para o openwrt. Ele cria duas redes wifi, uma normal e outra rede TOR.
    Tentei reproduzir no tplink WDR4300 e não tive muito sucesso.
    Adoraria se vc pudesse nos brindar com um dos seus incríveis tutoriais abordando esse assunto!!
    Muito obrigado e Parabéns pelo blog!
    abraçuu ;-)

    ResponderExcluir
    Respostas
    1. Olá Anônimo,

      TOR é interessante sim, assim como o I2P. Nunca configurei um roteador cebolão por não ter necessidade dos seus serviços. Além disto, se você pretente visitar o Tio Sam, talvez não seja uma boa ideia usá-lo: http://www.techtimes.com/articles/9779/20140708/nsa-might-tag-you-as-extremist-when-you-use-tor-other-privacy-online-services.htm

      Excluir
    2. Marcado como extremista.. boa.. nunca ouvira sobre isso! Vlw pela dica. Uma pena que vc não nos brinde com esse tutorial... em todo caso, muito obrigado!!

      Excluir
    3. Quem sabe um dia eu acorde com um humor mais extremista e escreva um artigo sobre TOR ;-)

      Excluir
  2. Bom dia Luiz.

    Qual seria um programa cliente via Windows que funcionaria pra conectar nesta VPN criada pelo Roteador ?

    GRato.

    ResponderExcluir
    Respostas
    1. Você pode perguntar ao google ;-) Existe uma seleta de clientes que oferecem interfaces distintas.
      A "oficial" é esta:

      https://openvpn.net/index.php/open-source/downloads.html

      Excluir
    2. Muito bom , Você sabe me dizer se configurando o VPN corretamente, conseguirei acessar o aplicativo torrent pela rede interna? Pergunto isso pq onde trabalho, todas as portas são bloqueadas, apenas a de internet que funciona, então não tenho acesso algum ao torrent do roteador via rede externa, seja a porta que for, a um tempo atrás usava a porta 20 mais foi fechada recentemente.

      Grato.

      Excluir
    3. André,

      Não ficou claro mas acho que você quer acessar o torrent da sua casa a partir do trabalho, certo?
      Neste caso, deve funcionar configurar a VPN na porta 443 (https) e você conectar de um cliente interno no trabalho. Uma vez a vpn estabelecida, não existe qualquer restrição ao tráfego: pode acessar seu gerenciador de torrent.

      Excluir
    4. Isso mesmo que queria saber , então vou providenciar a instalação e os testes.

      Obrigado .

      Excluir
  3. Luiz, no caso gostaria de usar OpenWrt como client OpenVpn... teria alguma luz..

    ResponderExcluir
    Respostas
    1. Anônimo, não tem muita diferença entre servidor e cliente. O que muda é que a entrada server e port são trocadas por remote. se usar autenticação por certificados, é bom que os clientes verifiquem que o certificado da outra ponta seja de um servidor (remote-cert-tls). Fora e outras coisas que fazem sentido apenas no servidor mas que não devem atrapalhar.

      As configurações do OpenVPN no OpenWRT são as mesmas. Só precisa trocar - por _ e usar dentro de uma option ou list ( quando é uma opção que aceita repetições)

      Excluir
  4. Luiz, muito bom seu tutorial, mas acabei me enrolando, meu conhecimento de Linux é básico.Acabei optando instalar o VPN Server (OpenConnect) para poder gerenciar meus torrents remotamente. Segui esse tutorial https://wiki.openwrt.org/doc/howto/openconnect-setup e só consegui conectar a VPN de dentro da minha rede rs, de fora a solicitação é descartada pela porta 443, parece que é o encaminhamento das portas que está errado. Tô quebrando a cabeça, já tentei configurar o Openvpn, porém sem sucesso. Utilizo o luci cc 15.05. ou então quero configurar vpn server pptp, só que não acho o pacote do server para instalação. Será que pode me ajudar? Muito obrigado

    ResponderExcluir
    Respostas
    1. Anônimo,

      Teste o encaminhamento com algo que não a VPN como um servidor http. Eu tentaria outras portas, pois a https(443) é as vezes bloqueada pelo provedor de internet. Se for só o encaminhamento de porta, não precisa de vastos conhecimentos em linux pois você faz tudo na configuração de firewall pela interface web.

      Pptp não é lá muito seguro e também foge do tema da postagem

      Excluir
  5. oi luiz blz estou com um problema no openvpn, o problema que tenho é que ele autentica tudo pega o ip mas não consigo acessar nada na rede nem acessar internet a partir dele. fiz tudo conforme o tutorial baixei os pacotes, criei ca server e cliente, configurei o arquivo openvpn, criei a interface, firewall, configurei a chave no cliente oque pode ser ?

    ResponderExcluir
    Respostas
    1. Caique, parece sintoma de problema no roteamento. Você criou.a i terface vpn para o dispositivo tun0? E colocou esta interface em uma zona do firewall que está autorizada para acessar a internet?

      Excluir
    2. sim criei a interface e coloquei na zona do firewall da lan como também já testei criando uma zona no firewall a parte, abrir também a porta necessária para a comunicação. vou fazer o teste com porta diferente estou achando que é a operadora que esta bloqueando a porta, vou fazer os testes e depois te falo se solucionou o problema.

      Excluir
  6. Estou com o mesmo problemas! Conecta na VPN, porém não tenho acesso a internet. O que poderia ser?

    ResponderExcluir
    Respostas
    1. MSS,

      Se a VPN conectou e você consegue pingar o roteador, o problema é roteamento ou firewall.

      Para navegar na internet, os clientes devem receber uma nova rota padrão ao conectar na internet saindo pela VPN. No roteador, o dispositivo tun0 (ou a que você está usando) deve estar configurada em uma interface do OpenWRT e esta ter acesso de encaminhar pacotes para a internet. Se tudo isto estiver certo, a configuração padrão do firewall não deve atrapalhar.

      Ah, claro, tem o DNS. Se você usa um DNS na intranet e seu cliente dependia dela para acessá-lo, não vai funcionar.

      Recomendo:

      verificar a conectividade com o roteador (ping 192...)
      verificar a conectividade com a internet (ping 8.8.8.8)
      verificar quais são seus DNS (originalmente ou fornecidos pela VPN)
      verificar a conectividade com os DNS

      Excluir
  7. Olá Luiz, tenho 2 roteadores com as configurações iguais, com 2 redes wireless (interno e visitante), ambos conectados num mesmo switch. Tem como conectar o 2º roteador ao primeiro de modo a ser visto como uma unica rede?

    ResponderExcluir
    Respostas
    1. Sim. Por um mesmo cabo você pode passar quantas redes quiser usando etiquetas de VLAN.

      Primeiro, se estão em um switch, estão operando como AP? Não recomendo usar nat nestes casos. Não vejo como o switch liga os dois sem usar Nat.

      Interno e visitante são redes distintas? Se é para isolar as redes, é entre as duas wifi ou entre estas e os outros equipamentos ligados no switch?

      Preciso ter uma visão melhor da sua rede para ajudar. Seria bom abrir um tópico no fórum do blog (links no topo e rodapé)

      Excluir
  8. Luiz como fica a configuração como TCP na Porta 443 é só trocar UDP pra TCP ou tem alguma configuração adicional?

    ResponderExcluir
    Respostas
    1. Sim, protocolo para tcp e porta para 443. Só que algumas operadoras bloqueiam estes porta (alô NET!). Só não sei onde fica a neutralidade da rede neste caso 😀

      Olha com um sniffer de rede (ex: tcpdump) se chega os pacotes.

      Excluir
  9. Boa tarde!

    Luiz primeiramente quero te agradecer pelo tutorial e pela ajuda que me deu em um tópico que abri. Queria tirar umas duvidas, eu consegui configurar tudo certinho consigo acessar meu HD no caso minha rede. A primeira duvida e se tem cliente para android, se sim como funciona,e a outra é, além de poder acessar minha rede com a vpn o que mais eu posso fazer estando na minha rede, por exemplo poderia acessar a o luci do meu roteador, ou terminal ssh se sim como funciona. E queria deixar uma dica não sei se é interessante, mas vi pessoas procurando na net, mas la vai. Eu instalei o ADBLOCK aquele app de navegador que bloqueia span, funciona muito bem apesar de sr feito para o projeto LEDE, segue o link https://github.com/openwrt/packages/tree/master/net/adblock/files.

    ResponderExcluir
    Respostas
    1. Fabiano,

      Você pode fazer qualquer coisa que quiser na sua rede. Basta a configuração do firewall permitir (ou colocar na zona LAN). A única coisa que não funciona é os recursos que dependem de mensagem broadcast na rede (ex: localizar os tocadores de UPnP, cameras IP, etc...). E sim, ssh/luci deve funcionar.

      O adblock deve estar pronto para a próxima versão do LEDE, já que o OpenWRT tende a desaparecer. Quando sair uma versão oficial do LEDE, devo comentar melhor essa separação.

      Excluir
  10. Ok entendi vou fazer testes aqui, e sobre um cliente openvpn para android saberia se é possível, por que não achei nada na internet?

    ResponderExcluir
    Respostas
    1. Sim, tem algumas alternativas. O mais tradicional é o OpenVPN connect.

      Excluir
  11. Luiz eu não consigo conectar a vpn na faculdade da timoout, nem mesmo o cliente transmission conecta, sabe me dizer o que pode ser e que testes ou ferramenta posso usar para verificar, utilizo o opensuse. Porta não é porque na empresa funciona e nos testes de porta sempre da fechada mas funciona.

    ResponderExcluir
    Respostas
    1. Devem estar bloqueando a porta ou serviços udp. Você pode tentar identificar uma porta que a faculdade libera. Gosto de testar com comandos básicos como o netcat/nc. Libera temporariamente acesso completo no firewall do seu roteador para dados vindos do IP da faculdade. Depois rode um netcat em modo servidor e teste diferentes portas com tcp ou udp.

      Sugestão: portas 1194, 8080, 8443, 443, 80

      A porta 443 provavelmente está liberada mas seu provedor pode bloqueá-la para liberar somente com contrato empresarial (ex:net)

      Teste o netcat antes localmente e do trabalho para ficar familiarizado.
      O tcpdump com os filtros adequados também é uma mão na roda

      Excluir
  12. Boa noite! Luiz vlw pela resposta, eu entendi esta parte de descobrir porta aberta, e isso e tranquilo, o problema e que la no meu roteador eu configurei uma porta xxxx fixa para o openvpn ok, o problema e que o aplicativo do openvpn que tenho no note e no smartfone quando tenta fechar conexão com a vpn, ele escolhe uma porta src aleatória la faculdade ok, então como faço para ele utilizar uma porta fixa.

    ResponderExcluir
    Respostas
    1. Acho que é a porta de origem, não de destino. TCP e UDP trabalham com um par de portas. A de destino sempre é "conhecida", enquanto a de origem é alta (>1024) e aleatória. Não é necessário fixá-la.

      Excluir
  13. Luiz,

    Minha conexão de internet esta atrás de uma rede CGNAT, não sei se você tem informações a respeito desse tipo de topologia, mas ela trás algumas limitações. Uma dessas limitações é que eu não consigo fazer o redirecionamento de portas para acesso externo. Gostaria de acessar a rede da minha casa de onde eu estiver, mas não tenho como.

    Eu assino um serviço de VPN, e como esse serviço é baseado no OpenVPN eu estava pensando em configura-lo diretamente no OpenWRT. Caso eu consiga realizar com sucesso essa configuração, seria possível eu ter acesso a minha rede externamente e fazer os ports forwarding que eu preciso?

    ResponderExcluir
    Respostas
    1. Carlos,

      Tudo depende do que o serviço VPN seu vai entregar. Se for um IP real, sim, poderá fazer os encaminhamentos diversos, liberação da porta ou mesmo criar o seu serviço VPN sobre a VPN contratada para evitar encaminhamentos de porta. Se também for um IP falso, o serviço VPN não é melhor do que seu CGNAT.

      Sinto em dizer mas CGNAT é realmente um problema complicadíssimo. A solução é só uma: IPv6. Normalmente o CGNAT aparece junto com o IPv6. Se não for seu caso, reclame com sua telecom para ela migrar logo para IPv6. Com IPv6, todos os dispositivos terão um IP real (normalmente vários) e o que vai limitar o acesso externo é o firewall do roteador.

      Excluir
    2. Luiz,

      Poderia me ajudar na configuração do client VPN no OpenWRT? Tenho um arquivo .ovpn de uma região que posso me conectar e não estou conseguindo importa-lo para dentro do openvpn do roteador.

      A configuração do arquivo é a seguinte:

      client
      dev tun
      proto udp
      cipher AES-256-CBC
      remote 162.243.109.84 1194
      resolv-retry infinite
      nobind
      tun-mtu 1500
      tun-mtu-extra 32
      mssfix 1450
      persist-key
      persist-tun
      block-outside-dns
      auth-user-pass
      comp-lzo
      reneg-sec 0
      verb 3

      Consegue me ajudar?

      Obrigado!

      Excluir
    3. Carlos,

      O modo cliente é em outro artigo ;-)
      http://luizluca.blogspot.com.br/2015/02/openwrt-cliente-vpn-com-openvpn.html

      Enfim, você precisa traduzir cada linha. Ex para a última linha:

      option 'verb' '3'

      Só o '-' fica um '_':

      option 'persist_tun' '1'

      E olhe e artigo do OpenWRT como cliente. Se estiver com mais dúvida, pode perguntar lá ou crie um tópico no fórum (links no começo e fim desta página)

      Excluir
  14. Luiz,

    Pode me dar uma ajuda, eu não consigo conectar o meu vpn na faculdade porque o protocolo udp é bloqueado. Então quero configurar o servidor vpn com udp e tcp mas no mesmo ele não aceita os dois protocolos. Tentei configurar dois server diferentes um com udp e outro com tcp mas da erro, nao aceita, sabe me dizer como pode ser feito isso?

    ResponderExcluir
    Respostas
    1. Fabiano,

      se não tiver conflitos nos nomes, nas faixas de endereços e nos dispositivos, deve funcionar.

      Excluir
  15. Luiz,
    tenho uma duvida de leigo em linux. Como Salvar as ediçoes feitas no putty?

    ResponderExcluir
    Respostas
    1. Edições onde? Na configuração do Putty? Não estou captando a dúvida.
      Não seria meio fora do tema "Servidor VPN com OpenWRT"?

      Excluir
  16. Olá Luiz, achei muito interessante essa possibilidade de fazer do roteador servidor com OpenVPN para conseguir acessar a rede interna remotamente, parabéns pelo Tutorial, mas no meu caso eu queria tentar fazer uma coisa um pouco diferente:

    Teria como eu configurar um cliente VPN no roteador para toda vez que algum dispositivo da minha rede tentasse acessar um determinado endereço exemplo: (http://77.81.234.244:55452/user/live/...) que esse acesso fosse através da VPN e para os demais acessos fosse normal, sem VPN.
    (Isso seria o endereço de um servidor IPTV que é bloqueado pelo meu provedor local de internet, já falei várias vezes com o administrador do provedor de internet mas ele não sabe o que está bloqueando e não deu jeito, pensei que fosse o roteador mas na casa de todos os clientes que usa o mesmo provedor o serviço não funciona).
    Eu uso um cliente OpenVPN no celular android, outro no computador, mas para assistir na SmartTV tenho que usar o computador ou fazer uma gambiarra na rede, eu queria me livrar de clientes nos meus dispositivos e deixar que o roteador se encarregasse de se conectar com o servidor e direcionar o acesso na VPN quando fosse acessar o IPTV, pensei em algo como criar uma nova interface wan(wan-openvpn) que recebesse internet da mesma do mesmo roteador mas que ficasse conectada em um servidor OpenVPN e utilizando o pacote mwan3 usado para load balance, fazer com quê em alguma regra de acesso todos que tentassem acessar determinado ip(no caso o servidor IPTV) fosse direcionado o acesso para a interface "wan-openvpn".

    Não sei se deu pra enteNder direito, mas se sim, por favor me dá uma força de como pode ser feito e como fazer, tenho só alguns conhecimentos básicos de Linux e OpenWRT, já instalei uma vez o OpenVPN como servidor no Linux, criei certificados, chaves, fiz acesso e tal, mas no openWRT é um pouco diferente.

    ResponderExcluir
    Respostas
    1. Outra coisa esse roteador que uso OpenWRT já está com mwan3 instalado, mas não o client VPN, não sei quanta memória será necessário mas vê como está a situação da memória atual, se é possível instalar algum client OpenVPN ou outro.

      Memory

      Total Available 13048 kB / 28860 kB (45%)
      Free 3636 kB / 28860 kB (12%)
      Cached 7316 kB / 28860 kB (25%)
      Buffered 2096 kB / 28860 kB (7%)

      se a memória for pouca poderia até remover algum pacote que não é utilizado ou não fará falta.

      Excluir
    2. Pierre,

      Normalmente o "bloqueio" é culpa nossa. Se o outro lado for exposto na internet por encaminhamento de porta, pode ser que o serviço não esteja preparado para isso. As vezes o servidor coloca referência ao próprio IP ao invés da URL (http://192.168.9.1...) e isso quebra ao encaminhar porta. O wireshark nos dois lados diria com certeza.

      Bem, vamos ao seu problema. Como você está considerando OpenVPN, creio que você tem acesso aos dois lados da solução. Ou você quer fazer uma "ponte" (ex: sua casa conecta no servidor no trabalho que, então, acessa o serviço IPTV)?

      Se você gerencia os dois lados, o mais fácil é simplesmente rotear a rede interna. Se você configurá-las de forma a não conflitar, (ex: 192.168.1.0/24 e 192.168.3.0/24), você pode informar que a rede remota está alcançável por tal cliente VPN.
      Meu uso do OpenVPN é primariamente para interligar 4 redes privadas. Só esporadicamente uso a VPN para acessar de um dispositivo isolado (Road Warrior).

      Quanto a memória, parece estar tranquila. Cached e buffered podem ser consideradas "livre". Assim, quase metade da RAM está disponível. O OpenVPN vai usar só uns 5MB. Ele é bem econômico.

      Excluir
  17. Olá Luiz,

    Quando vou rodar o serviço, me deparo com esse erro, o que poderia ser?

    Obrigado

    [EPOLL] [MH/PKTINFO] [AEAD]
    Tue Nov 7 21:15:35 2017 daemon.notice openvpn(lan)[4465]: library versions: OpenSSL 1.0.2k 26 Jan 2017, LZO 2.09
    Tue Nov 7 21:15:35 2017 daemon.notice openvpn(lan)[4465]: Diffie-Hellman initialized with 2048 bit key
    Tue Nov 7 21:15:35 2017 daemon.err openvpn(lan)[4465]: OpenSSL: error:0906D06C:lib(9):func(109):reason(108)
    Tue Nov 7 21:15:35 2017 daemon.err openvpn(lan)[4465]: OpenSSL: error:140AD009:lib(20):func(173):reason(9)
    Tue Nov 7 21:15:35 2017 daemon.err openvpn(lan)[4465]: Cannot load certificate file /etc/easy-rsa/keys/server.crt
    Tue Nov 7 21:15:35 2017 daemon.notice openvpn(lan)[4465]: Exiting due to fatal error
    Tue Nov 7 21:15:40 2017 daemon.notice openvpn(lan)[4469]: OpenVPN 2.4.3 mips-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD]
    Tue Nov 7 21:15:40 2017 daemon.notice openvpn(lan)[4469]: library versions: OpenSSL 1.0.2k 26 Jan 2017, LZO 2.09
    Tue Nov 7 21:15:40 2017 daemon.notice openvpn(lan)[4469]: Diffie-Hellman initialized with 2048 bit key
    Tue Nov 7 21:15:40 2017 daemon.err openvpn(lan)[4469]: OpenSSL: error:0906D06C:lib(9):func(109):reason(108)
    Tue Nov 7 21:15:40 2017 daemon.err openvpn(lan)[4469]: OpenSSL: error:140AD009:lib(20):func(173):reason(9)
    Tue Nov 7 21:15:40 2017 daemon.err openvpn(lan)[4469]: Cannot load certificate file /etc/easy-rsa/keys/server.crt
    Tue Nov 7 21:15:40 2017 daemon.notice openvpn(lan)[4469]: Exiting due to fatal error

    ResponderExcluir
    Respostas
    1. O openvpn não consegue ler /etc/easy-rsa/keys/server.crt.
      Pode ser por permissão de leitura ou o formato está errado.
      Faz o cat no arquivo para testar a permissão e ver se tem cara de certificado

      Excluir
    2. O arquivo server.crt estava vazio. Gerei novamente e agora rodou, vou continuar para ver se consigo fazer funcionar a vpn desta vez. Obrigado!

      Excluir
  18. Boa noite , seu artigo me deu um grande apoio , obrigado ! Tem alguma novidade da re-unificacao do openwrt e lede ?

    ResponderExcluir
    Respostas
    1. O projeto foi reunificado, como a página inicial do openwrt.org já declara. O lede-project agora redireciona para OpenWrt.
      Na prática, o OpenWrt está morto e o LEDE foi renomeado para OpenWrt, tomando o controle dos ativos no nome do finado projeto.

      Ele continua vivo e forte e devemos ter uma nova versão em breve. Era para ser lançado as versões de teste por agora, mas ainda estão acertando os últimos patches de kernel. Tem alguns dispositivos com problemas com o kernel mais recente (4.14).
      Quando tiver o lançamento da prévia da próxima versão eu escrevo sobre.

      Excluir
  19. Olá Luiz, excelente post. consegui montar tanto o servidor openvpn quanto o cliente, mas ´so consigo pingar do cliente para o servidor, não do servidor para o cliente, li aquele seu post de roteamento entendi, basicamante criar uma tabela de roteamento que podemos escolher o a origem do ping, se é pela wan ou pela lan, então tentei fazer a mesma coisa com pfSense, pois não sei fazer o escripty no openwrt.
    Só que mesmo escolhendo a origem do ping pela lan, também não pinga. com certeza é alguma configuração de rota.
    No openwrt criei uma rota estática pela Luci, mas também não pinga. Fui na interface openvpn e criei a rota também, mas não pinga.
    Cara estou quebrando a cabeça.
    Ah, estou pingando de dentro do roteador, não de um cliente conectado

    ResponderExcluir
    Respostas
    1. Wellio, Wireshark é seu amigo.

      http://luizluca.blogspot.com/2017/05/openwrtlede-capturando-pacotes-de.html

      As versões atuais já fazem captura pelo ssh diretamente na interface gráfica.

      Se não conseguir resolver, compartilha mais dados, como as tabelas de roteamento e conf do openvpn. Mas tudo isso seria melhor em um tópico próprio no fórum.

      https://luizluca.blogspot.com/p/forum.html

      Excluir
  20. Luiz Boa tarde!!

    Tenho um cenário que tenho um PFSENSE como servidor de openvpn e então para uma das pontas cliente tenho um openwrt configurado.. Ate o momento tudo ok.. a VPN fecha tudo certinho.. ele fecha cliente servidor numa boa, mais gostaria que este cliente openwrt após conseguir conectar ao servidor também tivesse comunicação com outros cliente conectados a esse pfsense. Tento jogar as rotas mais não vai só consigo chegar até ao servidor .. meu openwrt é 10.100.0.0/28 , meu servidor pfsense é 10.0.0.0/24 - TUNEO VPN É 172.4.0.0/30. e quando conseguir conectar gostaria de comunicação também com outras redes conectada a esse pfsense como por exemplo 10.10.0.0/24.

    ResponderExcluir
    Respostas
    1. Está um pouco offtopic (OpenWrt) mas vamos lá. Existe um roteador virtual dentro da VPN que precisa saber qual rede é para qual cliente. No servidor e nos clientes, você precisa criar rotas para as redes de destino direcionando à interface tun. Porém, o OpenVPN precisa criar internamente rotas para cada uma dessas redes para o seu respectivo cliente. Isso é feito pela configuração iroute no ccd. O OpenVPN normalmente é executado com ums porta de gerenciamento (para um cliente texto como Telnet) ou escreve seu estado interno em arquivo (no caso do OpenWrt em /var/run). Lá você consegue ver as rotas internas do roteador virtual do OpenWrt.

      Excluir