Routeur Banana Pi R64 - Debian, Wireguard, RKN

Le Banana Pi 64 est un ordinateur monocarte similaire au Raspberry Pi, mais avec plusieurs ports Ethernet, ce qui en fait un routeur de distribution Linux à usage général.

Routeur Banana Pi R64 - Debian, Wireguard, RKN

Oui, Openwrt existe déjà, mais il a sa propre interface graphique et CLI ; il y a Mikrotik, mais encore une fois il a sa propre GUI/CLI, et Wireguard ne fonctionne pas prêt à l'emploi... En général, je veux un routeur avec des paramètres flexibles, tout en restant dans le cadre du Linux standard, avec lequel vous travaillez tous les jours.

Dans l'article sous les noms BPI, R64, carte unique, je veux dire la même chose - la carte unique Banana Pi R64 elle-même.

Sélection d'images. Télécharger via eMMC

La toute première compétence à acquérir lorsque l'on travaille avec SBC en général, et avec R64 en particulier, cela signifie apprendre à y charger un système d'exploitation et pouvoir interagir avec lui, car R64 n'a pas de port moniteur (HDMI, par exemple). Quand tout est tombé - le Wifi a cessé de fonctionner, le réseau Ethernet, Bluetooth, USB, etc., il y a un UART, à travers l'interface duquel vous pouvez toujours voir ce qui ne va pas, et également exécuter quelques commandes à partir de la console, si nécessaire.

Algorithme de connexion au R64 via USB-UART :

  • courir au magasin de pièces radio pour un câble USB-UART (PL2303, série vers USB)
  • nous connectons une extrémité USB à l'ordinateur et l'autre, UART, à R64, avec trois fils sur quatre, comme dans l'image ci-dessous
  • dans l'exécution de la console de l'ordinateur sudo minicom

Après cela, dans la plupart des cas, la console monocarte apparaîtra = succès.
Plus de détails peuvent être vus ici.

Routeur Banana Pi R64 - Debian, Wireguard, RKN

Ensuite, le plus simple est de charger le système d'exploitation depuis la carte SD : téléchargez par lien image et téléchargez-la :

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 la fente SD R64, l'allumons, observons d'abord le chargement de uboot sur la console connectée, puis le démarrage Linux standard.

Une autre option de démarrage consiste à utiliser une carte 64 Go déjà intégrée dans le R8, appelée eMMC. Selon les instructions sur le wiki, nous réécrivons l'image sur l'appareil
/dev/mmcblk0 vers BPI, redémarrez, retirez la carte SD, réactivez BPI... et ça ne marche pas. Comment aller là Boot select ne tiens pas.

Le fait est qu'au moins pour BPI, vous devez définir un indicateur spécial afin de pouvoir démarrer à partir d'un lecteur flash interne :

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]

Ensuite, vous devez écrire le préchargeur sur 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 du R64 (Chine) a publié ce fichier binaire ici. Ce qu'il fait est inconnu (il n'y a pas de codes sources), mais sans lui, cela ne fonctionnera pas non plus.

En général, après cela, les images commencent à se charger à partir d'eMMC. Si vous voulez comprendre et créer des images à partir de zéro, alors dans les deux cas (SD / eMMC), vous devez écrire quelques fichiers supplémentaires (préchargeur pour la carte SD, ATF, u-boot), juste pour accéder au noyau botte. Ce sujet est encore développe, mais pour nous, l'essentiel est que cela fonctionne et que ça va.

Maintenant, pour être honnête, je n'utilise pas le téléchargement eMMC, les cartes SD suffisent, mais j'ai passé pas mal de temps à le faire fonctionner, alors laissez-le être dans l'article.

Choix du système d'exploitation. Armbien

La première tâche de l'application est de lancer un VPN, bien sûr Wireguard. Il s'est immédiatement avéré qu'il n'était pas assemblé du côté du noyau et qu'il n'y avait pas d'en-têtes. J'ai reconstruit le noyau et, par habitude avec x86, j'ai construit le module du noyau en utilisant DKMS. Cependant, la vitesse d'assemblage sur arm64 de même de petits utilitaires m'a désagréablement surpris. Et puis un autre module de noyau était nécessaire, et ainsi de suite. En général, il s'avère que tout ce qui concerne le noyau vaut mieux être assemblé sur un ordinateur portable x86 à tube chaud, puis transféré sur R64 par simple copie, redémarré et testé.

Une autre chose est la partie espace utilisateur. Dans mon cas où j'ai choisi Debian, tout pour l'architecture arm64 est déjà sur packages.debian.org et il n'est pas nécessaire de reconstruire quoi que ce soit.

Afin de ne pas produire un autre vélo, j'ai porté Armbien sur BPI R64.
Ou plutôt : la partie userspace est Armbian, et le core est tiré du repository Franck-UN. La dernière image peut être téléchargée ici.

Toute activité sur le développement de la partie logicielle de R64 est réalisée sur forum. D'une manière générale, le fabricant lui-même cherche à populariser le routeur Openwrt, mais grâce à l'activité du développeur allemand Frank, toutes les fonctionnalités se retrouvent rapidement dans le noyau Debian. Étonnamment, Frank est actif dans tous les fils de discussion du forum.

Organisation de l'espace de travail : fils

Séparément, je veux vous dire comment placer le SBC (pas seulement le BPI) sur la table pendant le développement/les tests afin de ne pas y faire passer un câble Ethernet depuis la source Internet à travers toute la pièce/le bureau. Le fait est que, d'une part, il faut fournir Internet à la pièce de fer, et d'autre part, tout peut casser dans cette pièce de fer, et notamment le Wifi.

J'ai d'abord décidé d'acheter un "sifflet" USB-Wifi bon marché, de le brancher sur le seul port du BPI et d'oublier les fils. Pour ce faire, j'ai acheté un TP-LINK TL-WN725N USB 2.0 bon marché, mais très vite, il est devenu clair qu'il ne décollerait pas: pour que le sifflet fonctionne, un pilote de noyau était nécessaire, ce qui, bien sûr, n'était pas là (plus tard, j'ai compilé le pilote RTL8XXXU nécessaire, mais ce n'est toujours pas pratique). Et le câble Ethernet a gâché la vue de la chambre pendant un moment.

Du coup, j'ai réussi à me débarrasser du câble à l'aide de Tenda MW3 (Wifi mesh system) : j'ai simplement placé un cube sous la table et connecté le BPI au port LAN de cette dernière avec un câble Ethernet au mètre. Succès.

Wireguard, RKN, oiseau

Une des choses pour lesquelles j'utilise Banana PI est d'avoir un accès gratuit aux sites bloqués par le RKN, notamment, pour que Telegram et les appels vers Slack fonctionnent. Des articles sur ce sujet ont déjà été proposés sur Habré : temps, два, trois.

J'ai implémenté le déploiement d'une telle solution en utilisant Ansible : lien.

Le VPS est censé exécuter Ubuntu 18.04. J'ai vérifié les performances sur deux hébergeurs en Europe : Amazon et Digital Ocean.

Donc, nous avons installé l'Armbian ci-dessus sur R64, il est disponible via ssh sous le nom hm-bananapi-1 et dispose d'un accès Internet. Nous déployons séquentiellement des scripts d'automatisation ansibles et exécutons l'installation elle-même sur 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, vous devez déployer notre VPN sur le VPS de la même manière :

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

Ici, l'argument est toujours current-vpn, et le nom du VPS lui-même est configuré dans une variable (dans ce cas, il s'agit de 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 des clés Wireguard) dans un dossier ./secrets, le répertoire devrait ressembler à si.

Automatisation Ansible en Python

Vous remarquerez peut-être qu'au lieu du format YAML, les commandes Ansible sont encodées dans des scripts Python. A titre de comparaison, comment activer le démon bird de la manière habituelle :

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

et comment la même via Python:

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

Écrire des commandes Ansible avec du code Python permet de réutiliser le code, et en général, toutes les possibilités d'un langage généraliste sont ouvertes. Par exemple, installer bird sur R64 et VPS :

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

voir code de fonction install_bird().

Cette fonction s'appelle pybook mis en œuvre ici. Il n'y a pas encore de documentation sur pybook, alors je corrigerai ce défaut.

Que pense-t-il en amont à ce sujet.

Surveillance. Prométhée

Total : télégramme fonctionne, linkedin et pornhub aussi, en général, l'expérience utilisateur est correcte. Mais tout peut casser, et les morceaux de fer chinois aussi.

Les mises à jour du noyau peuvent aussi être intéressantes : par exemple, je voulais mettre à jour le noyau 5.4 => 5.6, bon, il y a Wireguard prêt à l'emploi, pas besoin de patcher... Aussitôt dit, sitôt fait : patiemment transféré les correctifs de 5.4 à 5.6, le noyau a démarré, le tunnel vers le VPS a fait un ping, mais bird ne peut pas se connecter avec l'erreur "BGP Error"… "Rolled back in horror" (c) à 5.4 ; le passage à 5.6 a été reporté dans TODO.

Par conséquent, en plus d'installer le routeur et le VPS, j'ai ajouté la surveillance (sur x86 Ubuntu 18.04), qui est installée sur un hôte séparé avec les composants suivants :

  • prometheus, alertmanager, blackbox_exporter - le tout dans docker
  • les alertes sont envoyées au canal de télégramme à l'aide du bot metalmatze/alertmanager-bot - également dans docker
  • tor pour le bot, afin que le bot puisse alerter les situations où Internet est disponible, mais le télégramme ne fonctionne toujours pas et le bot lui-même ne peut pas se connecter
  • appliqué alertes: NodeVPNTroubles (pas de ping vers VPS), BirdVPNTroubles (pas de session Bird), AntifilterDownloadTroubles (échec de chargement des adresses IP bloquées), SiteTroubles (télégramme malheureusement indisponible)
  • alertes système comme HostGrowingDiskReadLatency (la carte SD bon marché cesse d'être lue)

Exemple de configuration de surveillance :

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

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

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, j'avais prévu de me connecter à deux fournisseurs pour qu'Internet continue de fonctionner, même si un fournisseur avait des problèmes avec le réseau, ou s'il oubliait de payer pour Internet, etc., et d'autres facteurs humains.

L'expérience utilisateur la plus avancée sur le thème du multi-wan est décrite ici pour le système Mwan3 sous Openwrt. Cette solution a des fonctionnalités riches, mais la configuration et le fonctionnement en général pour le multi-wan sont plutôt gênants. Juste un exemple : si vous accédez à certains sites à partir de deux adresses IP à la fois, ils risquent de ne pas l'aimer, ils cesseront de fonctionner => "Internet ne fonctionne pas".

Compte tenu de cette expérience, j'ai décidé que le multihébergement n'était pas encore une priorité, seulement le basculement. Bien qu'il semble que dans les dernières versions de Linux, tout devrait fonctionner avec une seule commande comme :

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

Ainsi, pour qu'il n'y ait pas de point de défaillance unique, nous prenons 2 BPI, chacun se connecte à un fournisseur, les connectons ensemble et communiquons entre eux par routage dynamique via bird / OSPF.

De plus, sur chacun nous annonçons la même adresse IP si le service est disponible (Internet, DNS). Autrement dit, nous ne définirons pas nous-mêmes la route par défaut, mais par oiseau. La solution espionnée ici .

Cette fonctionnalité n'a pas encore été implémentée, le coronavirus insidieux a foiré (tout ne venait pas d'aliexpress ; une autre boutique en ligne, Layta, a promis de livrer en une semaine, et plus d'un mois s'est écoulé ; le deuxième fournisseur n'a pas réussi à étirer le câble avant la quarantaine, seulement réussi à faire un trou dans le mur pour percer le câble).

Comment commander R64

La planche elle-même dans la boutique officielle SinoVoip.
Il est également préférable de commander immédiatement :

  • nutrition + informer de la norme de prise EU ou US
  • dissipateur de chaleur : radiateurs/ventilateurs ; parce que le processeur est chauffé et que la puce du commutateur
  • antenne Wi-Fi, par exemple

Il y a une nuance - le prix de la livraison depuis un certain temps est devenu insuffisamment élevé dans la boutique officielle. La responsable Judy Huang m'a assuré qu'il n'y avait pas d'erreur et que vous pouvez choisir ePacket pour 5 $, mais j'ai vu que pour la Russie, il n'y a que EMS pour> 33 $. Désagréable, mais pas critique. De plus, si vous choisissez un autre pays pour la livraison (j'ai parcouru tous les continents), la livraison vous coûtera ~5$. Russophobes?.. Mais ensuite j'ai trouvé que pour la France le prix de livraison était aussi d'environ 30$, et je me suis calmé.

En conséquence, Judy a proposé de passer une commande, mais de ne pas payer (allusion: mettre moins sur la carte pour que le paiement ne se fasse pas automatiquement) ; écrivez-lui et elle réduira le prix d'expédition à la normale. Succès.

Questions

Tout ne fonctionne pas encore parfaitement.

Performance

Les commandes Ansible=Python sont exécutées lentement, même celles qui sont inactives, pendant 20 à 30 secondes ; un ordre de grandeur plus long que sur un ordinateur portable x86. De plus, au début, ils sont exécutés assez rapidement, ~ 3 secondes, puis ils ralentissent fortement. Cela est peut-être dû à l'échauffement du CPU (throttling). Le code Go est également long :

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

Internet Gratuit

Le Wifi fonctionne, mais s'arrête sur Armbian après environ une journée, écrit :

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

Seul le redémarrage aide. Nous devons aller plus loin pour comprendre.

Ethernet

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

ifdown br0; sleep 30; ifup br0

Le pilote est nouveau, le noyau n'a pas encore été accepté, j'espère que le chinois Landen Chao finir.

Source: habr.com

Ajouter un commentaire