O Banana Pi 64 é um computador de placa única semelhante ao Raspberry Pi, mas com diversas portas Ethernet, o que permite transformá-lo em um roteador baseado em uma distribuição Linux de uso geral.
Sim, já existe o Openwrt, mas tem seus próprios problemas, sua GUI e CLI; Existe o Mikrotik, mas novamente ele tem sua própria GUI/CLI, e o Wireguard não funciona imediatamente... Em geral, quero um roteador com configurações flexíveis, mas permanecendo dentro da estrutura do Linux padrão, com o qual você trabalha com todos os dias.
No artigo sob os nomes BPI, R64, placa única, quero dizer a mesma coisa - a própria placa única Banana Pi R64.
Escolhendo uma imagem. Baixe via eMMC
A primeira habilidade que você precisa adquirir ao trabalhar com SBC em geral, e com o R64 em particular, isso significa aprender a carregar um sistema operacional nele e poder interagir com ele, pois o R64 não possui porta para monitor (HDMI, por exemplo). Quando tudo caiu - Wifi, Ethernet, Bluetooth, USB, etc. pararam de funcionar.Existe um UART, através da interface onde você sempre pode ver o que deu errado, e também executar alguns comandos do console, se necessário.
Algoritmo para conexão ao R64 via USB-UART:
corremos até a loja de peças de rádio para comprar um cabo USB-UART (PL2303, serial para USB)
conecte uma extremidade USB ao computador e a outra, UART, ao R64, com três fios de quatro, como na imagem abaixo
execute no console do computador sudo minicom
Depois disso, na maioria dos casos o console de placa única aparecerá = sucesso.
você pode ver mais aqui.
A seguir, a maneira mais fácil é carregar o sistema operacional de um cartão SD: baixe por link imagem e preencha-a:
Inserimos o cartão no slot R64 SD, ligamos e observamos o console conectado carregando primeiro o uboot e depois o carregamento padrão do Linux.
Uma opção alternativa de inicialização é usar um cartão de 64 Gb já integrado ao R8, chamado eMMC. De acordo com as instruções do wiki, copiamos a imagem para o dispositivo
/dev/mmcblk0 para BPI, reinicie, remova o cartão SD, ligue o BPI novamente... e não funciona. Como ir e voltar Boot select não se preocupe.
O fato é que pelo menos para o BPI é necessário definir um sinalizador especial para poder inicializar a partir de um pen drive interno:
O fabricante R64 (China) postou este binário aqui. O que faz é desconhecido (não há códigos-fonte), mas também não funcionará sem ele.
Em geral, depois disso, as imagens começam a carregar do eMMC. Se você quiser descobrir e criar imagens do zero, então para ambos os casos (SD/eMMC) você precisa escrever vários outros arquivos (pré-carregador para cartão SD, ATF, u-boot) apenas para carregar o kernel. Este tema ainda é está desenvolvendo, mas para nós o principal é que funcione e tudo bem.
Agora faço download via eMMC, para ser sincero, não uso, basta um cartão SD, mas gastei bastante tempo para fazer funcionar, então deixe no artigo.
Selecionando um sistema operacional. armiano
A primeira tarefa do aplicativo é lançar uma VPN, naturalmente Wireguard. Foi imediatamente descoberto que o lado do kernel não estava montado e não havia cabeçalhos. Reconstruí o kernel e, como é meu hábito no x86, montei o módulo do kernel usando DKMS. No entanto, a velocidade de construção até mesmo de pequenos utilitários no arm64 me surpreendeu desagradavelmente. E então outro módulo do kernel foi necessário, etc. Em geral, tudo relacionado ao kernel é melhor montado em um laptop x86 quente e depois transferido para o R64 por meio de cópia simples, reinicializado e testado.
Outra coisa é a parte do espaço do usuário. No meu caso de escolher o Debian, tudo para a arquitetura arm64 já está em packages.debian.org e não há necessidade de reconstruir nada.
Para não produzir outra bicicleta, portadoArmênio no BPI R64.
Ou melhor, isto: a parte do espaço do usuário é Armbian, e o kernel é retirado do repositório Frank-A. A imagem mais recente pode ser baixada aqui.
Toda a atividade de desenvolvimento da parte de software do R64 é realizada em fórum. De modo geral, o próprio fabricante se esforça para popularizar o roteador para Openwrt, mas graças à atividade do desenvolvedor Frank da Alemanha, todos os recursos acabam rapidamente no kernel do Debian. Surpreendentemente, Frank está ativo em todos os tópicos do fórum.
Organização do espaço de trabalho: fios
Separadamente, gostaria de dizer como, durante o desenvolvimento/teste, colocar um SBC (não apenas um BPI) em uma mesa para não passar um cabo Ethernet de uma fonte de Internet por toda a sala/escritório. O fato é que, por um lado, você precisa fornecer um hardware com Internet, mas por outro lado, tudo nesse hardware pode quebrar, e antes de tudo o Wifi.
Primeiro resolvi comprar um “apito” USB-Wifi barato, ligá-lo na única porta do BPI e esquecer os fios. Para fazer isso, comprei um TP-LINK TL-WN725N USB 2.0 barato, mas logo ficou claro que ele não iria decolar: para que o apito funcione, você precisa de um driver de kernel, que, claro, não estava lá (mais tarde montei o driver RTL8XXXU necessário, mas ainda é impraticável). E o cabo Ethernet estragou a aparência da sala por um tempo.
Como resultado, consegui me livrar do cabo com a ajuda do Tenda MW3 (sistema Wifi mesh): simplesmente coloquei um cubo embaixo da mesa e conectei o BPI à porta LAN deste último com um cabo Ethernet de um metro de comprimento. Sucesso.
Wireguard, RKN, Pássaro
Uma das coisas para as quais quero usar o Banana PI é ter acesso gratuito a sites bloqueados pelo RKN, em particular, para que as chamadas do Telegram e do Slack possam funcionar. Artigos sobre Habré já foram propostos sobre este tema: tempo, два, três.
Implantei exatamente esta solução usando Ansible: link.
Presume-se que o VPS esteja executando o Ubuntu 18.04. Verifiquei a funcionalidade em dois hosters na Europa: Amazon e Digital Ocean.
Então, instalamos o Armbian acima no R64, ele pode ser acessado via ssh com o nome hm-bananapi-1 e tem acesso à internet. Implantamos consistentemente scripts de automação do Ansible e iniciamos a própria instalação no R64:
# зависимости для Debian-based дистрибутивов
$ sudo apt install --no-install-recommends python3-pip python3-setuptools python3-wheel git
$ which pip3
/usr/bin/pip3
# ansible с pybook, скриптование на Python
$ pip3 install https://github.com/muravjov/ansible/archive/ansible-2.10.0.dev0-pybook2019.tar.gz
$ export PATH=~/.local/bin:$PATH
$ which ansible-playbook
/home/sa/.local/bin/ansible-playbook
$ git clone https://github.com/muravjov/ansible-bpi-r64.git
$ cd ansible-bpi-r64
$ git submodule update --init
# убеждаемся в доступности hm-bananapi-1
$ ssh hm-bananapi-1 which python3
/usr/bin/python3
# собственно установка
$ ansible-playbook ./router.py -l hm-bananapi-1
Em seguida, você precisa implantar nossa VPN no VPS da mesma maneira:
ansible-playbook ./router.py -l current-vpn
Aqui o argumento é sempre current-vpn, e o nome real do VPS é configurado em uma variável (neste caso é paris-vpn-aws-t2-micro-1):
Ah, sim, antes de todas essas operações você precisa gerar segredos (em particular chaves Wireguard) na pasta ./secrets, o diretório deve se parecer com assim.
Automação Ansible em Python
Você pode notar que, em vez de estar no formato YAML, os comandos Ansible são codificados em scripts Python. Para efeito de comparação, como habilitar o daemon pássaro da maneira usual:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
Escrever comandos Ansible em Python permite reutilizar o código e, em geral, abre todas as possibilidades da linguagem de uso geral. Por exemplo, instalando bird em R64 e VPS:
Total: telegram funciona, LinkedIn e pornhub também, em geral a experiência do usuário é boa. Mas tudo pode quebrar, inclusive o hardware chinês.
As atualizações do kernel também podem ser interessantes: por exemplo, eu queria atualizar o kernel 5.4 => 5.6, bem, o Wireguard já vem pronto para uso, não há necessidade de patch... Mal dito e feito: transferi meticulosamente os patches do 5.4 para 5.6, o kernel inicializou, o túnel para o VPS fez ping, mas o pássaro não consegue se conectar com o erro "Erro BGP" ... "Reverti com horror" (c) para 5.4; A mudança para 5.6 foi adiada em TODO.
Portanto, além de instalar o roteador e o VPS, adicionei o monitoramento (no x86 Ubuntu 18.04), que é instalado em um host separado com os seguintes componentes:
prometheus, alertmanager, blackbox_exporter - tudo no docker
Os alertas são enviados para o canal de telegramas usando o bot metalmatze/alertmanager-bot - também no Docker
tor para o bot, para que o bot possa alertar situações quando há Internet, mas o telegrama ainda não funciona e o próprio bot não consegue se conectar
aplicado alertas: NodeVPNTroubles (sem ping para VPS), BirdVPNTroubles (sem sessão Bird), AntifilterDownloadTroubles (erro ao carregar endereços IP bloqueados), SiteTroubles (telegrama malfadado não está disponível)
alertas do sistema, por exemplo, HostGrowingDiskReadLatency (cartão SD barato torna-se ilegível)
O Auto Discovery for Prometheus é configurado na pasta /etc/prometheus/auto_http, um exemplo de adição de um host ao monitoramento (os hosts não são monitorados por padrão):
Além de tudo, planejei me conectar a dois provedores para que a Internet continuasse funcionando, mesmo que um provedor tivesse problemas de rede, ou se esquecesse de pagar pela Internet, etc., e outros fatores humanos.
A experiência do usuário mais avançada no tópico multi-wan é descrita aqui para o sistema Mwan3 em Openwrt. Esta solução possui funcionalidades ricas, mas configurá-la e operá-la em geral para multi-wan é bastante problemático. Apenas um exemplo: se você acessar alguns sites a partir de dois endereços IP ao mesmo tempo, eles podem não gostar, vão parar de funcionar => “a Internet não está funcionando”.
Levando em conta esta experiência, decidi que o multihoming ainda não é uma prioridade, apenas o failover. Embora pareça que nas versões mais recentes do Linux tudo deveria funcionar com um comando como:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
Assim, para evitar um único ponto de falha, pegamos 2 BPIs, conectamos cada um a um provedor, conectamos entre si e fazemos a conexão entre eles com roteamento dinâmico via bird/OSPF.
A seguir, anunciamos o mesmo endereço IP em cada um se o serviço estiver disponível (Internet, DNS). Ou seja, não definiremos a rota padrão nós mesmos, mas através do bird. Eu espiei a solução aqui .
Esta funcionalidade ainda não foi implementada, o insidioso coronavírus pregou uma peça aqui (nem tudo chegou do Aliexpress; outra loja online, Layta, prometeu entregar em uma semana, mas já se passou mais de um mês; o segundo fornecedor não teve tempo para estender o cabo antes da quarentena, apenas faça um furo na parede para o cabo).
Como encomendar R64
A placa em si está na loja oficial SinoVoipName.
Também é melhor encomendar imediatamente:
nutrição + informe o padrão de tomada da UE ou dos EUA
dissipador de calor: radiadores/ventiladores; porque tanto a CPU quanto o chip do switch estão esquentando
Há uma nuance - o preço de entrega tornou-se inadequadamente alto na loja oficial há algum tempo. A gerente Judy Huang me convenceu de que não houve erro e que você poderia escolher o ePacket por US$ 5, mas vi que para a Rússia só existe EMS por > US$ 33. Desagradável, mas não crítico. Além disso, se você escolher qualquer outro país para entrega (passei por todos os continentes), a entrega custará ~$5. Russofóbicos?.. Mas aí descobri que para a França o preço de entrega também é ~30$, e me acalmei.
Como resultado, Judy se ofereceu para fazer um pedido, mas não pagar (sugerir: coloque menos no cartão para que o pagamento automático não seja processado); escreva para ela e ela reduzirá o preço de entrega ao normal. Sucesso.
Questões
Nem tudo está funcionando perfeitamente ainda.
Desempenho
Os comandos Ansible=Python são executados lentamente, mesmo os inativos, por 20 a 30 segundos; uma ordem de magnitude maior do que em um laptop x86. Além disso, no início eles são executados rapidamente, cerca de 3 segundos, depois diminuem drasticamente. Isso pode ser devido ao aquecimento da CPU (aceleração). O código Go também leva muito tempo para funcionar:
# запрос метрик для прометея из node_exporter на Go
$ time curl -s http://172.30.1.1:9100/metrics > /dev/null
real 0m6,118s
user 0m0,005s
sys 0m0,009s
# однако температура 51 градус, не так и много
sa@bananapir64:~$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
51700
Wifi
Wifi funciona, mas no Armbian ele para após cerca de um dia, escreve: