Roteador Banana Pi R64 - Debian, Wireguard, RKN

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.

Roteador Banana Pi R64 - Debian, Wireguard, RKN

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.

Roteador Banana Pi R64 - Debian, Wireguard, RKN

A seguir, a maneira mais fácil é carregar o sistema operacional de um cartão SD: baixe por link imagem e preencha-a:

unzip -p 2019-08-23-ubuntu-16.04-lite-preview-bpi-r64-sd-emmc.img.zip | pv | sudo dd of=/dev/mmcblk0 bs=10M status=noxfer

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:

root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x48]

Em seguida, você precisa gravar o pré-carregador em uma partição de inicialização especial

root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro 
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0

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, portado Armê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):

$ grep current_vpn group_vars/all 
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-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:

- name: start bird
  systemd:
    name: bird
    state: started
    enabled: yes

e como fazer o mesmo via Python:

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:

install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")

veja o código da função instalar_bird().

Esse recurso chamado pybook implementado aqui. Ainda não há documentação sobre o pybook, mas corrigirei esse problema mais tarde.

O que ele pensa rio acima sobre isso.

Monitoramento. Prometeu

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)

Exemplo de configuração de monitoramento:

ansible-playbook ./monitoring.py -l monitoring-preprod

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):

bash << 'EOF'
HOSTNAME=hm-bananapi-1
IP_ADDRESS=`ssh -G $HOSTNAME | awk '/^hostname / { print $2 }'`

ssh monitoring-preprod sudo sponge /etc/prometheus/auto_http/$HOSTNAME.json << EOF2
[
  {
    "targets": ["$IP_ADDRESS:9100"],
    "labels": {
      "env": "prod",
      "hostname": "$HOSTNAME"
    }
  }
]
EOF2
EOF

TODO: 2 provedores, 2 BPI, failover anycast

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
  • antena wi-fi, por exemplo

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:

sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Message 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Message 50 (seq 4) timeout
...

Apenas uma reinicialização ajuda. Precisamos seguir em frente entender.

Ethernet

A Ethernet funciona, mas após aproximadamente 64 horas os pacotes (DHCP) do RXNUMX param de chegar.
Reiniciar a interface ajuda:

ifdown br0; sleep 30; ifup br0

O driver é novo, ainda não foi aceito no kernel, espero que seja o chinês Landen Chao termina.

Fonte: habr.com

Adicionar um comentário