Enrutador Banana Pi R64 - Debian, Wireguard, RKN

La Banana Pi 64 es una computadora de placa única similar a la Raspberry Pi, pero con múltiples puertos Ethernet, lo que la convierte en un enrutador de distribución de Linux de propósito general.

Enrutador Banana Pi R64 - Debian, Wireguard, RKN

Sí, Openwrt ya existe, pero tiene su propia GUI y CLI; está Mikrotik, pero nuevamente tiene su propia GUI / CLI, y Wireguard no funciona de inmediato ... En general, quiero un enrutador con configuraciones flexibles, mientras permanece dentro del marco de Linux estándar, con el que trabaja cada día.

En el artículo bajo los nombres BPI, R64, placa única, quiero decir lo mismo: la placa única Banana Pi R64.

Selección de imagen. Descargar a través de eMMC

La primera habilidad que se adquiere cuando se trabaja con SBC en general, y con R64 en particular, significa aprender a cargar un sistema operativo y poder interactuar con él, porque R64 no tiene un puerto de monitor (HDMI, por ejemplo). Cuando todo se cayó: Wifi dejó de funcionar, red Ethernet, Bluetooth, USB, etc. Hay un UART, a través de cuya interfaz siempre puede ver qué salió mal y también ejecutar un par de comandos desde la consola, si es necesario.

Algoritmo de conexión a R64 a través de USB-UART:

  • vaya a la tienda de piezas de radio para obtener un cable USB-UART (PL2303, Serial-to-USB)
  • conectamos un extremo USB a la computadora y el otro, UART, a R64, con tres de cuatro cables, como en la imagen a continuación
  • en la consola de la computadora ejecutar sudo minicom

Después de eso, en la mayoría de los casos, aparecerá la consola de placa única = éxito.
Se pueden ver más detalles aquí.

Enrutador Banana Pi R64 - Debian, Wireguard, RKN

A continuación, la forma más sencilla es cargar el sistema operativo desde la tarjeta SD: descargar por enlace imagen y subirla:

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

insertamos la tarjeta en la ranura SD R64, la encendemos, observamos la carga de uboot primero en la consola conectada, luego el arranque estándar de Linux.

Una opción de arranque alternativa es usar una tarjeta de 64 Gb ya integrada en el R8, llamada eMMC. De acuerdo con las instrucciones en la wiki, reescribimos la imagen en el dispositivo.
/dev/mmcblk0 a BPI, reinicie, retire la tarjeta SD, habilite BPI nuevamente... y no funciona. Cómo llegar allá Boot select no esperes

El hecho es que, al menos para BPI, debe establecer un indicador especial para poder iniciar desde una unidad flash interna:

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]

A continuación, debe escribir el precargador en una partición de arranque especial

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

El fabricante de R64 (China) publicó este binario aquí. Se desconoce lo que hace (no hay códigos fuente), pero sin él tampoco funcionará.

En general, después de eso, las imágenes comienzan a cargarse desde eMMC. Si desea resolverlo y crear imágenes desde cero, entonces para ambos casos (SD / eMMC) debe escribir algunos archivos más (precargador para la tarjeta SD, ATF, u-boot), solo para llegar al kernel bota. Este tema sigue está desarrollando, pero para nosotros lo principal es que funcione y esté bien.

Ahora, para ser honesto, no uso la descarga de eMMC, las tarjetas SD son suficientes, pero pasé mucho tiempo haciéndolo funcionar, así que déjalo en el artículo.

Elección del sistema operativo. armbiano

La primera tarea de la aplicación es lanzar una VPN, por supuesto, Wireguard. Inmediatamente resultó que no estaba ensamblado desde el lado del kernel y no había encabezados. Reconstruí el kernel y, por costumbre con x86, construí el módulo del kernel usando DKMS. Sin embargo, la velocidad de montaje en arm64 incluso de pequeñas utilidades me sorprendió desagradablemente. Y luego se requería otro módulo del núcleo, y así sucesivamente. En general, resulta que es mejor ensamblar todo lo relacionado con el kernel en una computadora portátil x86 de tubo tibio, luego transferirlo a R64 mediante una simple copia, reinicio y prueba.

Otra cosa es la parte del espacio de usuario. En mi caso de elegir Debian, todo para la arquitectura arm64 ya está en packages.debian.org y no hay necesidad de reconstruir nada.

Para no producir otra bicicleta, yo portado Armbiano en BPI R64.
O más bien: la parte del espacio de usuario es Armbian, y el núcleo se toma del repositorio Frank-A. La última imagen se puede descargar aquí.

Toda la actividad en el desarrollo de la parte de software de R64 se lleva a cabo en foro. En términos generales, el propio fabricante busca popularizar el enrutador Openwrt, pero gracias a la actividad del desarrollador Frank de Alemania, todas las funciones terminan rápidamente en el kernel de Debian. Sorprendentemente, Frank está activo en todos los hilos del foro.

Organización del espacio de trabajo: cables

Por separado, quiero decirle cómo colocar el SBC (no solo BPI) sobre la mesa durante el desarrollo / prueba para no conducir un cable Ethernet desde la fuente de Internet a través de toda la habitación / oficina. El caso es que, por un lado, es necesario proporcionar Internet a la pieza de hierro y, por otro lado, todo se puede romper en esta pieza de hierro, y especialmente Wifi.

Primero decidí comprar un "silbato" USB-Wifi barato, enchufarlo en el único puerto del BPI y olvidarme de los cables. Para hacer esto, compré un TP-LINK TL-WN725N USB 2.0 económico, pero muy pronto quedó claro que no despegaría: para que el silbato funcionara, se necesitaba un controlador del kernel que, por supuesto, no estaba allí. (Más tarde compilé el controlador RTL8XXXU necesario, pero aún no es práctico). Y el cable de ethernet arruinó la vista de la habitación por un tiempo.

Como resultado, logré deshacerme del cable con la ayuda de Tenda MW3 (sistema de malla Wifi): simplemente coloqué un cubo debajo de la mesa y conecté el BPI al puerto LAN de este último con un cable Ethernet de un metro. Éxito.

Protector de alambre, RKN, Pájaro

Una de las cosas para las que uso Banana PI es para tener acceso gratuito a sitios bloqueados por la RKN, en particular, para que funcionen Telegram y llamadas a Slack. Ya se han propuesto artículos sobre este tema en Habré: tiempo, два, tres.

Implementé la implementación de una solución de este tipo usando Ansible: enlace.

Se supone que el VPS ejecuta Ubuntu 18.04. Comprobé el rendimiento de dos hosters en Europa: Amazon y Digital Ocean.

Entonces, instalamos el Armbian anterior en R64, está disponible a través de ssh con el nombre hm-bananapi-1 y tiene acceso a internet. Desplegamos scripts de automatización ansible secuencialmente y ejecutamos la instalación en 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

A continuación, debe implementar nuestra VPN en el VPS de la misma manera:

ansible-playbook ./router.py -l current-vpn

Aquí, el argumento siempre es current-vpn, y el propio nombre del VPS está configurado en una variable (en este caso, es 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

Oh, sí, antes de todas estas operaciones, debe generar secretos (en particular, claves Wireguard) en una carpeta ./secrets, el directorio debería verse como tan.

Automatización de Ansible en Python

Puede notar que en lugar del formato YAML, los comandos de Ansible están codificados en scripts de Python. A modo de comparación, cómo habilitar el demonio pájaro de la manera habitual:

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

y cómo lo mismo a través de Python:

with mapping:
    append("name", "start bird")
    with mapping("systemd"):
        append("name",  "bird")
        append("state", "started")
        append("enabled", "yes")

Escribir comandos de Ansible con código Python le permite reutilizar el código y, en general, todas las posibilidades de un lenguaje de propósito general están abiertas. Por ejemplo, instalando bird en R64 y VPS:

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

ver código de función instalar_pájaro().

Esta característica se llama pybook implementado aquí. Todavía no hay documentación sobre pybook, entonces corregiré este defecto.

que piensa el río arriba sobre esto

Supervisión. Prometeo

Total: telegram funciona, linkedin y pornhub también, en general, la experiencia de usuario es buena. Pero todo se puede romper, y los hierros chinos también.

Las actualizaciones del kernel también pueden ser interesantes: por ejemplo, quería actualizar el kernel 5.4 => 5.6, bueno, hay Wireguard listo para usar, no es necesario parchear... Dicho y hecho: los parches transferidos minuciosamente de 5.4 a 5.6, el núcleo comenzó, el túnel al VPS hizo ping, pero el pájaro no puede conectarse con el error "Error de BGP"... "Retrocedió con horror" (c) a 5.4; pasar a 5.6 se pospuso en TODO.

Por lo tanto, además de instalar el enrutador y el VPS, agregué monitoreo (en x86 Ubuntu 18.04), que se instala en un host separado con los siguientes componentes:

  • prometheus, alertmanager, blackbox_exporter - todo en docker
  • las alertas se envían al canal de Telegram utilizando el bot metalmatze/alertmanager-bot, también en docker
  • tor para el bot, de modo que el bot pueda alertar situaciones cuando Internet está disponible, pero el telegrama aún no funciona y el bot en sí no puede conectarse
  • aplicado alertas: NodeVPNTroubles (sin ping a VPS), BirdVPNTroubles (sin sesión de Bird), AntifilterDownloadTroubles (no se pudieron cargar las direcciones IP bloqueadas), SiteTroubles (desafortunado telegrama no disponible)
  • alertas del sistema como HostGrowingDiskReadLatency (la tarjeta SD barata deja de leerse)

Ejemplo de configuración de monitoreo:

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

La detección automática para Prometheus está configurada en la carpeta /etc/prometheus/auto_http, un ejemplo de cómo agregar un host a la supervisión (los hosts no se supervisan de forma predeterminada):

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 proveedores, 2 BPI, conmutación por error anycast

Además de todo, planeé conectarme a dos proveedores para que Internet siguiera funcionando, incluso si un proveedor tenía problemas con la red, o se olvidaba de pagar Internet, etc., y otros factores humanos.

Se describe la experiencia de usuario más avanzada en el tema de multi-wan aquí para el sistema Mwan3 bajo Openwrt. Esta solución tiene una gran funcionalidad, pero configurar y operar en general para múltiples wan es bastante problemático. Solo un ejemplo: si llega a algunos sitios desde dos direcciones IP a la vez, es posible que no les guste, dejarán de funcionar => "Internet no funciona".

Dada esta experiencia, decidí que multihoming no es una prioridad todavía, solo conmutación por error. Aunque parece que en las últimas versiones de Linux todo debería funcionar con un comando como:

ip route add default 
    nexthop via 192.168.1.1 weight 10 
    nexthop via 192.168.2.1 weight 5

Entonces, para que no haya un punto único de falla, tomamos 2 BPI, cada uno se conecta a un proveedor, los conectamos y se comunican entre sí mediante enrutamiento dinámico a través de bird / OSPF.

Además, en cada uno anunciamos la misma dirección IP si el servicio está disponible (Internet, DNS). Es decir, no pondremos nosotros mismos la ruta por defecto, sino a través de pájaro. La solución espiada aquí .

Esta funcionalidad aún no se implementó, el insidioso coronavirus la arruinó (no todo vino de aliexpress; otra tienda en línea, Layta, prometió entregar en una semana, y pasó más de un mes; el segundo proveedor no logró estirar el cable antes de la cuarentena, solo logré hacer un agujero en la pared para perforar el cable).

Cómo pedir R64

La propia tabla en la tienda oficial SinoVoip.
También es mejor ordenar de inmediato:

  • nutrición + informar estándar de enchufe de la UE o EE. UU.
  • disipador de calor: radiadores/ventiladores; porque tanto la CPU se calienta como el chip del interruptor
  • antena wifi, por ejemplo

Hay un matiz: el precio de la entrega desde hace algún tiempo se ha vuelto inadecuadamente alto en la tienda oficial. La gerente Judy Huang me aseguró que no había ningún error y que puede elegir ePacket por $ 5, pero vi que para Rusia solo hay EMS por> 33 $. Desagradable, pero no crítico. Además, si elige cualquier otro país para la entrega (pasé por todos los continentes), la entrega costará ~ 5 $. ¿Rusófobos?... Pero luego descubrí que para Francia el precio de envío también es de ~$30, y me calmé.

Como resultado, Judy se ofreció a hacer un pedido, pero no a pagar (indirecta: ponga menos en la tarjeta para que el pago no se realice automáticamente); escríbele y ella reducirá el precio del envío a la normalidad. Éxito.

Temas

No todo funciona perfectamente todavía.

Rendimiento

Los comandos de Ansible=Python se ejecutan lentamente, incluso los inactivos, durante 20-30 segundos; un orden de magnitud más largo que en una computadora portátil x86. Además, al principio se realizan con bastante rapidez, ~ 3 segundos, luego se ralentizan bruscamente. Quizás esto se deba al calentamiento de la CPU (estrangulamiento). El código Go también es de ejecución prolongada:

# запрос метрик для прометея из 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, pero se detiene en Armbian después de aproximadamente un día, escribe:

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
...

Solo reiniciar ayuda. tenemos que ir más lejos entender.

Ethernet

Ethernet funciona, pero después de ~ un día, los paquetes (DHCP) de R64 dejan de llegar.
Reiniciar la interfaz ayuda:

ifdown br0; sleep 30; ifup br0

El controlador es nuevo, el kernel aún no ha sido aceptado, espero que el chino Landen Chao finalizar.

Fuente: habr.com

Añadir un comentario