Le routeur Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 est un ordinateur à carte unique de type Raspberry Pi, mais avec plusieurs ports Ethernet, ce qui permet d'en faire un routeur basé sur une distribution Linux grand public.

Le routeur Banana Pi R64 - Debian, Wireguard, RKN

Oui, OpenWrt est déjà disponible, mais il a ses propres particularités, son interface graphique et son interface en ligne de commande ; il y a Mikrotik, mais lui aussi a son interface graphique/CLI, et Wireguard ne fonctionne pas aussi simplement... En gros, je cherche un routeur avec des réglages flexibles, tout en restant dans le cadre du Linux standard que j’utilise tous les jours.

Dans cet article, par les termes BPI, R64, et ordinateur à carte unique, je vais faire référence à la même chose — le véritable ordinateur à carte unique Banana Pi R64.

Choix de l'image. Chargement via eMMC

La toute première compétence à acquérir lorsqu'on travaille avec SBC en général, et avec le R64 en particulier, est d'apprendre à y charger un système d'exploitation et à interagir avec lui, car le R64 n'a pas de port pour moniteur (HDMI, par exemple). Lorsque tout cesse de fonctionner — le WiFi, le réseau Ethernet, le Bluetooth, l'USB et d'autres, il y a le UART, à travers l'interface de celui-ci on peut toujours voir ce qui ne va pas, ainsi que lancer quelques commandes depuis la console, si nécessaire.

Algorithme de connexion au R64 via USB-UART :

  • courons au magasin de composants électroniques pour un câble USB-UART (PL2303, Serial-to-USB)
  • nous connectons une extrémité USB à l'ordinateur, et l'autre, UART, au R64, avec trois fils sur quatre, comme sur l'image ci-dessous
  • dans la console de l'ordinateur, nous lançons sudo minicom

Après cela, dans la plupart des cas, la console de l'ordinateur à carte unique apparaîtra = succès.
On peut en savoir plus en consultant ici.

Le routeur Banana Pi R64 - Debian, Wireguard, RKN

Ensuite, il est plus simple de charger le système d'exploitation à partir de la carte SD : nous téléchargeons le le lien image et nous l'installons :

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

nous insérons la carte dans le slot SD du R64, l'allumons, et observons via la console connectée le chargement d'abord de uboot, puis le chargement standard de Linux.

Une autre option de chargement est d'utiliser la carte de 8 Go déjà intégrée dans le R64, appelée eMMC. Selon les instructions du wiki, nous écrivons l'image sur l'appareil.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Sélection de démarrage ne touche pas.

Le fait est que, pour le BPI au moins, il est nécessaire de définir un drapeau spécial pour pouvoir démarrer à partir de la mémoire flash interne :

root@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nConfiguration de démarrage [PARTITION_CONFIG: 0x00]\nroot@bpi-r64:~# .\/mmc bootpart enable 1 1 \/dev\/mmcblk1\nroot@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nConfiguration de démarrage [PARTITION_CONFIG: 0x48]

Ensuite, il faut écrire le préchargeur dans une partition de démarrage spéciale.

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

Le fabricant R64 (Chine) a publié ce binaire ici. Ce qu'il fait est inconnu (il n'y a pas de code source), mais il ne fonctionnera pas sans lui non plus.

En gros, après cela, les images commencent à se charger depuis eMMC. Si vous souhaitez comprendre et créer des images à partir de zéro, pour les deux cas (SD/eMMC), il faut écrire quelques fichiers supplémentaires (preloader pour la carte SD, ATF, u-boot), juste pour arriver au chargement du noyau. Ce sujet est toujours d'actualité évolue, mais pour nous, l'essentiel est que cela fonctionne et c'est bien ainsi.

Actuellement, je n'utilise honnêtement pas le démarrage via eMMC, les cartes SD suffisent, mais j'ai passé pas mal de temps à faire fonctionner cela, donc cela doit être dans l'article.

Choix du système d'exploitation. Armbian

La première tâche appliquée est de lancer un VPN, naturellement Wireguard. Il s'est immédiatement avéré que du côté du noyau, il n'était pas compilé, et il n'y a pas d'en-têtes. J'ai recompilé le noyau et, par habitude avec x86, j'ai compilé le module du noyau avec DKMS. Cependant, la vitesse de compilation sur arm64, même pour de petits utilitaires, m'a désagréablement surpris. Ensuite, un autre module du noyau était nécessaire, etc. En gros, tout ce qui concerne le noyau est mieux compilé sur un vieux portable x86, puis transféré par simple copie sur le R64, puis redémarré et testé.

C'est une autre affaire — la partie utilisateur. Dans mon cas avec Debian, tout pour l'architecture arm64 est déjà disponible sur packages.debian.org et il n'est pas nécessaire de recompilier quoi que ce soit.

Pour ne pas créer un nouveau vélo, j'ai porté Armbian sur BPI R64.
Autrement dit : la partie utilisateur — Armbian, et le noyau provient du dépôt de Frank. L'image la plus récente peut être téléchargée ici.

Toute l'activité de développement de la partie logicielle de R64 se déroule sur le forum. En réalité, le fabricant lui-même s'efforce de populariser le routeur sous Openwrt, mais grâce à l'activité du développeur Frank d'Allemagne, toutes les fonctionnalités se retrouvent rapidement dans le noyau pour Debian. C'est surprenant, mais Frank est actif dans chaque fil du forum.

Organisation de l'espace de travail : câbles

Je veux expliquer comment, pendant le développement/test, placer un SBC (pas seulement BPI) sur un bureau de manière à ne pas avoir à tirer un câble Ethernet depuis la source Internet à travers toute la pièce/bureau. En effet, d'une part, il faut fournir Internet à l'appareil, et d'autre part, le matériel lui-même peut rencontrer des problèmes, notamment avec le Wifi.

Au départ, j'ai décidé d'acheter une clé USB Wi-Fi bon marché, de la brancher dans le seul port du BPI et d'oublier les câbles. Pour cela, j'ai acquis une TP-LINK TL-WN725N USB 2.0 à bas prix, mais il est vite devenu évident que ça ne fonctionnerait pas : la clé nécessite un pilote du noyau qui, bien sûr, n'était pas présent (plus tard, j'ai regroupé le pilote nécessaire RTL8XXXU, mais c'est tout de même peu pratique). De plus, le câble Ethernet défigurait la pièce pendant un certain temps.

Finalement, j'ai pu me débarrasser du câble grâce au Tenda MW3 (système Wifi mesh) : j'ai simplement placé un cube sous la table et connecté le BPI au port LAN de ce dernier avec un câble Ethernet d'un mètre. Succès.

Wireguard, RKN, Bird

Un de mes souhaits pour lesquels j'utilise le Banana PI est d'avoir un accès libre aux sites bloqués par le RKN, notamment pour que Telegram et les appels dans Slack fonctionnent. À ce sujet, des articles ont déjà été proposés sur Habr : un, deux, trois.

Le déploiement de cette solution a été réalisé avec Ansible : lien.

On suppose que le VPS fonctionne sous Ubuntu 18.04. J'ai testé la fonctionnalité sur deux hébergeurs en Europe : Amazon et Digital Ocean.

Ainsi, nous avons installé l'Armbian mentionné ci-dessus sur le R64, il est accessible via ssh sous le nom de hm-bananapi-1 et a accès à Internet. Nous déployons progressivement ansible, les scripts d'automatisation et lançons l'installation proprement dite sur le 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

Ensuite, il faut déployer de manière analogue notre VPN sur le VPS :

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

Ici, l'argument est toujours current-vpn, et le nom propre du VPS est configuré dans la variable (dans ce cas, c'est 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 oui, avant toutes ces opérations, il faut générer des secrets (notamment les clés Wireguard) dans le dossier ./secrets, le répertoire doit ressembler à ainsi.

Automatisation Ansible sur Python

On peut remarquer que les commandes Ansible sont codées dans des scripts Python au lieu du format YAML. Pour comparer, voici comment démarrer le démon bird de la manière habituelle :

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

et comment faire la même chose via Python :

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

L'enregistrement des commandes Ansible avec du code Python permet de réutiliser le code et offre toutes les possibilités d'un langage de programmation général. Par exemple, installer bird sur R64 et VPS :

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

voir le code de la fonction install_bird().

Cette fonctionnalité, appelée pybook réalisée iciLa documentation sur pybook n'est pas encore disponible, je corrigerai cette lacune plus tard.

Que pense upstream à ce sujet.

Surveillance. Prometheus

En résumé : Telegram fonctionne, LinkedIn et Pornhub aussi, en gros l'expérience utilisateur est correcte. Mais tout peut casser, et les matériels chinois aussi.

Les mises à jour du noyau peuvent aussi être intéressantes : par exemple, j'ai voulu mettre à jour le noyau de 5.4 à 5.6, eh bien, il y a Wireguard intégré, pas besoin de patcher… Fait et bien fait : j'ai méticuleusement transféré les patches de 5.4 à 5.6, le noyau a démarré, le tunnel vers le VPS répond, mais bird ne peut pas se connecter avec l'erreur "Erreur BGP"… "Dans l'horreur, je suis revenu en arrière" (c) sur 5.4 ; le passage à 5.6 est en attente dans TODO.

Ainsi, en plus de l'installation du routeur et du VPS, j'ai ajouté la surveillance (sur x86 Ubuntu 18.04), qui est installée sur un hôte distinct avec les composants suivants :

  • prometheus, alertmanager, blackbox_exporter - tous dans Docker
  • les alertes sont envoyées dans un canal Telegram via le bot metalmatze/alertmanager-bot - également dans Docker
  • tor pour le bot, afin qu'il puisse alerter les situations où l'internet est présent, mais Telegram ne fonctionne toujours pas, et le bot lui-même ne peut pas se connecter
  • alertes applicatives alertes: NodeVPNTroubles (pas de ping vers le VPS), BirdVPNTroubles (pas de session Bird), AntifilterDownloadTroubles (erreur de téléchargement des IP bloquées), SiteTroubles (le malheureux Telegram est inaccessible)
  • alertes système, par exemple, HostGrowingDiskReadLatency (une carte SD bon marché cesse d'être lisible)

Exemple d'installation de la surveillance :

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

La découverte automatique pour Prometheus est configurée sur le dossier /etc/prometheus/auto_http, exemple d'ajout d'un hôte à la surveillance (par défaut, les hôtes ne sont pas surveillés) :

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 fournisseurs, 2 BPI, basculement anycast

En plus de tout cela, j'ai prévu de me connecter à deux fournisseurs, pour que l'internet continue de fonctionner, même si un fournisseur a des problèmes de réseau, ou si l'on oublie de payer pour l'internet, etc., et d'autres facteurs humains.

L'expérience utilisateur la plus avancée sur le thème de multi-wan est décrite ici pour le système Mwan3 sous Openwrt. Cette solution dispose d'une richesse fonctionnelle, mais la configuration et l'exploitation du multi-wan sont assez compliquées. Un seul exemple : si l'on accède à certains sites immédiatement avec deux adresses IP, cela peut ne pas leur plaire, ils cesseront de fonctionner => "l'internet ne fonctionne pas".

Compte tenu de cette expérience, j'ai décidé que le multihoming n'était pas encore une priorité, seulement le failover. Cependant, il semble que dans les dernières versions de Linux, tout devrait fonctionner avec une seule commande de ce type :

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

Ainsi, pour éviter un point unique de défaillance, nous prenons 2 BPI, chacun connecté à un fournisseur, les connectons entre eux et établissons une communication dynamique via Bird/OSPF.

Ensuite, nous annoncerons la même adresse IP sur chaque appareil en cas de disponibilité du service (Internet, DNS). Autrement dit, nous ne définirons pas la route par défaut nous-mêmes, mais à travers Bird. J'ai vu cette solution. ici .

Je n'ai pas encore mis en œuvre cette fonctionnalité, le coronavirus sournois a également compliqué les choses (tout n'est pas arrivé d'Aliexpress ; un autre magasin en ligne, Layta, avait promis une livraison en une semaine, mais cela fait plus d'un mois ; le deuxième fournisseur n'a pas eu le temps de tirer le câble avant le confinement, il avait seulement réussi à percer un trou dans le mur pour le câble).

Comment commander le R64

La carte elle-même dans le magasin officiel SinoVoip.
Il est également préférable de commander tout de suite :

  • alimentation + indiquer le standard de la prise EU ou USA
  • dissipateurs thermiques : radiateurs/ventilateurs ; car le CPU chauffe et le commutateur aussi
  • une antenne pour le wifi, par exemple

Il y a un détail : le prix de la livraison est devenu déraisonnablement élevé à un certain moment dans le magasin officiel. La responsable Judy Huang m’a assuré qu'il n'y avait pas d'erreur, et que je pouvais choisir ePacket pour 5 $, mais j'ai vu que pour la Russie il n'y avait que EMS pour >33 $. Désagréable, mais ce n'est pas critique. En fait, si je choisissais n'importe quel autre pays pour la livraison (j'ai essayé tous les continents), la livraison serait autour de 5 $. Des rusophobes ?.. Mais ensuite, j'ai découvert que pour la France, le prix de la livraison était aussi d'environ 30 $, et je me suis calmé.

Au final, Judy m'a proposé de passer commande, mais de ne pas payer (indice: mettre moins sur la carte pour que le paiement automatique ne passe pas) ; lui écrire et elle réduira le prix de la livraison à un niveau raisonnable. Succès.

Problèmes

Tout ne fonctionne pas encore parfaitement.

Performance

Les commandes Ansible=Python s'exécutent lentement, même celles à vide, prennent 20-30 secondes ; beaucoup plus longtemps que sur un portable x86. De plus, elles s’exécutent d'abord assez rapidement, environ 3 secondes, puis ralentissent soudainement. Cela pourrait être dû à la surchauffe du CPU (throttling). Le code Go s'exécute également longtemps :

# запрос метрик для прометея из 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

Le Wifi fonctionne, mais sur Armbian, il s'arrête après environ un jour, indiquant :

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

Un redémarrage aide, mais il faut aller plus loin. continuer à enquêter.

Ethernet

L'Ethernet fonctionne, mais après ~un jour, les paquets (DHCP) du R64 cessent d'arriver.
Un redémarrage de l'interface aide :

ifdown br0; sleep 30; ifup br0

Le driver est nouveau, il n'a pas encore été intégré au noyau, j'espère que le Chinois Landen Chao va le peaufiner.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster