
Alguns de nós não usam a internet sem VPN por diversos motivos: alguns precisam de um IP dedicado, sendo mais simples e barato comprar um VPS com dois IPs do que adquirir um endereço do provedor; outros querem acessar todos os sites, e não apenas os permitidos na Rússia; outros ainda precisam de IPv6, mas o provedor não oferece…
Na maioria das vezes, a conexão VPN é estabelecida no próprio dispositivo que está sendo usado no momento, o que é bastante justificável se você tem apenas um computador e um telefone que raramente usa ao mesmo tempo. No entanto, se em sua rede doméstica há vários dispositivos, ou, por exemplo, existem alguns nos quais não é possível configurar a VPN, seria mais conveniente criar o túnel diretamente no roteador doméstico, para evitar a configuração de cada dispositivo individualmente.
Se você já configurou o OpenVPN no seu roteador, provavelmente ficou desagradavelmente surpreso com a velocidade de funcionamento. Os SoCs de roteadores baratos, sem grandes dificuldades, conseguem lidar com tráfego de quase um gigabit, devido ao fato de que as funções de roteamento e NAT são realizadas em um chip separado, projetado especificamente para essa tarefa, enquanto os processadores principais desses roteadores são bastante fracos, pois praticamente não possuem carga. Esse compromisso permite alcançar alta velocidade de operação do roteador e reduzir significativamente o preço do dispositivo — roteadores com processadores potentes custam várias vezes mais, e são posicionados não apenas como caixas para distribuição de internet, mas também como NAS, apoiadores de torrents e sistemas multimídia para o lar.
Meu roteador, TP-Link TL-WDR4300, não pode ser chamado de novo — o modelo apareceu em meados de 2012 e possui um processador de 560 MHz da arquitetura MIPS32 74Kc, cuja potência é suficiente apenas para 20-23 Mb/s de tráfego criptografado via OpenVPN, o que, em termos de velocidade da internet doméstica moderna, é bem pouco.
Como podemos aumentar a velocidade do túnel criptografado? Meu roteador é bastante funcional, suporta 3×3 MIMO e, de modo geral, funciona bem, não gostaria de trocá-lo.
Como agora é comum criar páginas da internet de 10 megabytes, desenvolver aplicações de desktop em node.js e empacotá-las em um arquivo de 100 megabytes, aumentar a capacidade computacional em vez de otimizar, vamos fazer algo terrível — transferir a conexão VPN para o poderoso computador de placa única Orange Pi One, que instalaremos dentro do corpo do roteador, sem ocupar as portas de rede e USB existentes, por apenas $9.99*!
* + frete, + impostos, + para cerveja, + MicroSD.
OpenVPN
Não se pode dizer que o processador do roteador seja totalmente fraco — ele consegue criptografar e hashear dados com o algoritmo AES-128-CBC-SHA1 a uma velocidade de 50 Mb/s, que é visivelmente mais rápido do que o funcionamento do OpenVPN, enquanto o moderno cifrador de fluxo CHACHA20 com hash POLY1305 chega a 130 megabits por segundo! Mas por que a velocidade do túnel VPN é tão baixa? Tudo se deve à mudança de contexto entre o espaço do usuário e o espaço do núcleo: o OpenVPN criptografa o tráfego e se comunica com o mundo externo no contexto do usuário, enquanto a própria roteirização ocorre no contexto do núcleo. O sistema operacional precisa constantemente alternar entre os dois para cada pacote recebido ou enviado, e essa operação não é rápida. Esse problema é comum a todos os aplicativos VPN que funcionam através do driver TUN/TAP, e não se pode afirmar que a baixa velocidade seja causada por uma má otimização do OpenVPN (embora, é claro, existam áreas que poderiam ser melhoradas). Nenhum cliente VPN em espaço de usuário consegue entregar até um gigabit com a criptografia desligada no meu notebook, quanto mais em sistemas com processadores fracos.
Orange Pi One
O single board Orange Pi One da Xunlong é a proposta mais vantajosa em termos de desempenho/preço no momento. Por $9,99* você obtém um sólido processador quad-core ARM Cortex-A7, funcionando de forma estável a 1008 MHz, e claramente mais potente que vizinhos como Raspberry Pi Zero e Next Thing C.H.I.P. na mesma faixa de preço. Os pontos positivos terminam aqui. A Xunlong não dá a mínima atenção ao software de suas placas e, no momento do lançamento do One, não disponibilizou nem mesmo o arquivo de configuração da placa, para não falar de imagens prontas. A Allwinner — fabricante do SoC — também não é muito cuidadosa com o suporte ao seu produto. Eles se preocupam apenas com a mínima funcionalidade no Android 4.4.4, o que significa que somos obrigados a usar o kernel da versão 3.4 com patches do Android. Felizmente, existem entusiastas que compilam distribuições, ajustam o kernel e escrevem código para suporte às placas no kernel mainline, ou seja, fazem o trabalho do fabricante para que esse dispositivo funcione de maneira aceitável. Para minhas necessidades, escolhi a distribuição Armbian, que é frequentemente e convenientemente atualizada (novos kernels são instalados diretamente através do gerenciador de pacotes, e não pela cópia de arquivos para uma partição específica, como normalmente acontece com a Allwinner), e também suporta a maioria dos periféricos, ao contrário das demais.
Roteador
Para não sobrecarregar o fraco processador do roteador com criptografia e acelerar nossa conexão VPN, podemos transferir essa tarefa para o processador mais potente do Orange Pi, conectando-o ao roteador de alguma forma. Penso em conectar via Ethernet ou USB — ambos os padrões são suportados por ambos os dispositivos, mas não queria ocupar as portas já existentes. Felizmente, há uma solução.
O chip do hub USB GL850G, que é utilizado no roteador, suporta 4 portas USB, duas das quais não estão soldadas. Não está claro por que o fabricante não as soldou, suponho que para evitar que os usuários conectem imediatamente 4 dispositivos que consomem muita energia (como discos rígidos), já que a fonte de alimentação padrão do roteador não é projetada para essa carga. De qualquer forma, isso nos beneficia.

Para obter mais uma porta USB, basta soldar dois fios nos pinos 8(D-) e 9(D+) ou 11(D-) e 12(D+).

No entanto, não é suficiente apenas conectar dois dispositivos USB e esperar que tudo funcione como aconteceria com o Ethernet. Em primeiro lugar, precisamos configurar um deles para funcionar no modo USB Client, e não USB Host; em segundo lugar, precisamos decidir como os dispositivos irão se reconhecer. Existem muitos drivers chamados USB Gadgets (pelo nome da subsistema do núcleo Linux) que permitem emular diferentes tipos de dispositivos USB: adaptador de rede, placa de som, teclado e mouse, pen drive, câmera, console via porta serial. Como nosso dispositivo funcionará com a rede, a emulação de um adaptador Ethernet será a mais adequada.
Existem três padrões Ethernet-over-USB:
- Remote NDIS (RNDIS). Um padrão desatualizado da Microsoft, usado principalmente na época do Windows XP.
- Ethernet Control Model (ECM). Um padrão simples que encapsula quadros Ethernet em pacotes USB. É ótimo para modems com conexão USB, onde é conveniente transmitir quadros sem processamento, mas devido à sua simplicidade e limitações do barramento USB, não funciona com muita rapidez.
- Ethernet Emulation Model (EEM). Um protocolo mais inteligente que leva em conta as limitações do USB e agrega otimamente vários quadros em um, aumentando assim a largura de banda.
- Network Control Model (NCM). O protocolo mais recente. Tem as vantagens do EEM e otimiza ainda mais o trabalho com o barramento.
Para fazer qualquer um desses protocolos funcionar na nossa placa, como sempre, teremos que enfrentar algumas dificuldades. Como a Allwinner se interessa apenas pelas partes do núcleo Android, apenas o Android Gadget funciona corretamente — aquele código que implementa a conexão com adb, a exportação de dispositivos pelo protocolo MTP e a emulação de pen drives em dispositivos Android. O próprio Android Gadget suporta o protocolo RNDIS, mas no núcleo da Allwinner ele está quebrado. Se você tentar compilar o núcleo com qualquer outro USB Gadget, o dispositivo simplesmente não aparecerá no sistema, não importa o que você faça.
Para resolver o problema, na verdade, é necessário encontrar o local de inicialização do controlador USB no código modificado do Android Gadget android.c, mas existe uma manobra alternativa para fazer funcionar, pelo menos, a emulação de Ethernet via USB:
--- sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:40.427088792 +0300
+++ sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:45.339088792 +0300
@@ -57,7 +57,7 @@
static sunxi_udc_io_t g_sunxi_udc_io;
static u32 usb_connect = 0;
static u32 is_controller_alive = 0;
-static u8 is_udc_enable = 0;
+static u8 is_udc_enable = 1;
/* is udc enable by gadget? */
#ifdef CONFIG_USB_SUNXI_USB0_OTG
static struct platform_device *g_udc_pdev = NULL;Este patch ativa forçadamente o modo USB client, permitindo o uso de Gadgets USB comuns no Linux.
Agora, é necessário recompilar o núcleo com este patch e o gadget necessário. Escolhi o EEM, pois, com base nos testes, ele mostrou-se mais eficiente que o NCM.
A equipe do Armbian fornece para todas as placas suportadas na distribuição. Basta baixá-lo, colocar nosso patch em userpatches/kernel/sun8i-default/otg.patch, editar um pouco compile.sh e escolher o gadget necessário:

O núcleo será compilado em um pacote deb, que é fácil de instalar na placa via dpkg.
Basta conectar a placa via USB e configurar nosso novo adaptador de rede para obter o endereço via DHCP. Para isso, é necessário adicionar aproximadamente o seguinte em /etc/network/interfaces:
auto usb0
iface usb0 inet dhcp
hwaddress ether c2:46:98:49:3e:9d
pre-up /bin/sh -c 'echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role'É melhor definir o endereço MAC manualmente, pois ele será aleatório a cada reinicialização do dispositivo, o que é inconveniente e problemático.
Conecte o cabo MicroUSB ao conector OTG, conecte a energia do roteador (pode ser alimentado nos pinos 2 e 3 da header, e não apenas no conector de alimentação).
Agora, configure o roteador. Basta instalar o pacote com o driver EEM e adicionar nosso novo dispositivo USB de rede à ponte da zona de firewall local:
opkg install kmod-usb-net-cdc-eem
Para rotear todo o tráfego no túnel VPN, você precisa adicionar uma regra de SNAT no endereço IP da placa do lado do roteador, ou fornecer o endereço da placa como o endereço do gateway através do dnsmasq. A última opção é feita adicionando a seguinte linha em /etc/dnsmasq.conf:
dhcp-option = tag:lan, option:router, 192.168.1.100onde 192.168.1.100 — Endereço IP da sua placa. Não se esqueça de configurar o endereço do roteador nas configurações de rede na própria placa!
Para isolar os contatos da placa dos contatos do roteador, foi utilizada uma esponja de melamina. Ficou assim:

Conclusão
A rede funciona via USB surpreendentemente rápido: 100-120 Mb/s, eu esperava menos. O OpenVPN processa cerca de 70 Mb/s de tráfego criptografado, o que também não é muito, mas para minhas necessidades é suficiente. A tampa do roteador não fecha completamente, deixando uma pequena folga. Os estetas podem remover os conectores Ethernet e USB Host da placa, o que permitirá que a tampa se feche completamente, e ainda sobrarão espaço.
Ou melhor, não se dedique a essa pornografia e compre .
Fonte: habr.com
