Banana Pi R64-router - Debian, Wireguard, RKN

De Banana Pi 64 is een computer met één board, vergelijkbaar met de Raspberry Pi, maar met meerdere Ethernet-poorten, waardoor het een algemene Linux-distributierouter is.

Banana Pi R64-router - Debian, Wireguard, RKN

Ja, Openwrt bestaat al, maar het heeft zijn eigen GUI en CLI; er is Mikrotik, maar nogmaals, het heeft zijn eigen GUI / CLI, en Wireguard werkt niet out of the box ... Over het algemeen wil ik een router met flexibele instellingen, terwijl ik binnen het kader van standaard Linux blijf, waarmee je werkt elke dag.

In het artikel onder de namen BPI, R64, single-board, bedoel ik hetzelfde - de Banana Pi R64 single-board zelf.

Afbeelding selectie. Downloaden via eMMC

De allereerste vaardigheid om mee te werken SBC in het algemeen, en met R64 in het bijzonder, betekent dit dat je moet leren hoe je er een besturingssysteem in laadt en ermee kunt communiceren, omdat de R64 geen monitorpoort heeft (bijvoorbeeld HDMI). Toen alles uitviel - Wifi werkte niet meer, Ethernet-netwerk, Bluetooth, USB, enz. Er is een UART, via de interface waarvan je altijd kunt zien wat er mis is gegaan, en indien nodig ook een paar commando's vanaf de console kunt uitvoeren.

Verbindingsalgoritme op R64 via USB-UART:

  • ren naar de radio-onderdelenwinkel voor een USB-UART-kabel (PL2303, serieel-naar-USB)
  • we verbinden het ene USB-uiteinde met de computer en het andere, UART, met R64, met drie van de vier draden, zoals in de onderstaande afbeelding
  • in de computerconsole uitgevoerd sudo minicom

Daarna verschijnt in de meeste gevallen de console met één bord = succes.
U kunt meer details bekijken hier.

Banana Pi R64-router - Debian, Wireguard, RKN

Vervolgens is de eenvoudigste manier om het besturingssysteem van de SD-kaart te laden: downloaden door link afbeelding en upload deze:

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

we steken de kaart in de R64 SD-sleuf, zetten hem aan, observeren eerst het laden van uboot op de aangesloten console en vervolgens de standaard Linux-boot.

Een alternatieve opstartoptie is het gebruik van een 64Gb-kaart die al in de R8 is ingebouwd, genaamd eMMC. Volgens de instructies op de wiki herschrijven we de afbeelding naar het apparaat
/dev/mmcblk0 naar BPI, herstart, verwijder SD-kaart, schakel BPI opnieuw in... en het werkt niet. Hoe daar te komen Boot select houd niet op.

Feit is dat je in ieder geval voor BPI een speciale vlag moet instellen om te kunnen opstarten vanaf een interne flashdrive:

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]

Vervolgens moet je preloader naar een speciale opstartpartitie schrijven

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

R64-fabrikant (China) heeft dit binaire bestand gepost hier. Wat hij doet is onbekend (er zijn geen broncodes), maar zonder hem gaat het ook niet lukken.

Over het algemeen beginnen de afbeeldingen daarna te laden vanuit eMMC. Als je het wilt uitzoeken en helemaal opnieuw afbeeldingen wilt maken, dan moet je voor beide gevallen (SD / eMMC) nog een paar bestanden schrijven (preloader voor de SD-kaart, ATF, u-boot), gewoon om bij de kernel te komen laars. Dit onderwerp is nog steeds ontwikkeld zich, maar voor ons is het belangrijkste dat het werkt en oké.

Nu, om eerlijk te zijn, ik gebruik geen eMMC-download, SD-kaarten zijn voldoende, maar ik heb behoorlijk wat tijd besteed om het te laten werken, dus laat het in het artikel staan.

Keuze van het besturingssysteem. Armbiaans

De eerste toepassingstaak is het starten van een VPN, natuurlijk Wireguard. Het bleek meteen dat het niet vanaf de kernelzijde was samengesteld en dat er geen headers waren. Ik heb de kernel opnieuw opgebouwd en, uit gewoonte met x86, de kernelmodule gebouwd met behulp van DKMS. De montagesnelheid op arm64 van zelfs kleine nutsvoorzieningen verraste me echter onaangenaam. En toen was er nog een kernelmodule nodig, enzovoort. Over het algemeen blijkt dat alles wat met de kernel te maken heeft, beter kan worden geassembleerd op een x86-laptop met warme buis en vervolgens kan worden overgebracht naar R64 door simpelweg te kopiëren, opnieuw op te starten en te testen.

Een ander ding is het gebruikersruimtegedeelte. In het geval dat ik voor Debian kies, staat alles voor de arm64-architectuur al op packages.debian.org en is het niet nodig om iets opnieuw op te bouwen.

Om niet nog een fiets te produceren, heb ik geporteerd armbiaan op BPI R64.
Of beter gezegd: het userspace gedeelte is Armbian, en de core komt uit de repository openhartig-A. De nieuwste afbeelding kan worden gedownload hier.

Alle activiteiten met betrekking tot de ontwikkeling van het softwaregedeelte van R64 worden uitgevoerd forum. Over het algemeen probeert de fabrikant zelf de Openwrt-router populair te maken, maar dankzij de activiteit van de ontwikkelaar Frank uit Duitsland komen alle functies snel in de Debian-kernel terecht. Verrassend genoeg is Frank actief in elke forumthread.

Organisatie van de werkruimte: draden

Afzonderlijk wil ik u vertellen hoe u de SBC (niet alleen BPI) tijdens het ontwikkelen / testen op tafel kunt plaatsen om er geen Ethernet-kabel vanaf de internetbron door de hele kamer / kantoor naar toe te leiden. Feit is dat je aan de ene kant het stuk ijzer van internet moet voorzien, en aan de andere kant kan alles in dit stuk ijzer breken, en vooral wifi.

Eerst besloot ik om een ​​goedkope USB-Wifi "fluit" te kopen, deze aan te sluiten op de enige poort op de BPI en de kabels te vergeten. Om dit te doen, kocht ik een goedkope TP-LINK TL-WN725N USB 2.0, maar al snel werd duidelijk dat het niet van de grond zou komen: om het fluitje te laten werken, was een kerneldriver nodig, die er natuurlijk niet was (later heb ik het benodigde RTL8XXXU-stuurprogramma gecompileerd, maar het is nog steeds onpraktisch). En de ethernetkabel verpestte een tijdje het zicht op de kamer.

Het resultaat was dat ik met behulp van Tenda MW3 (Wifi mesh-systeem) van de kabel af kwam: ik plaatste simpelweg een kubus onder de tafel en verbond de BPI met een meter ethernetkabel op de LAN-poort van laatstgenoemde. Succes.

Draadbeschermer, RKN, Vogel

Een van de dingen waarvoor ik Banana PI gebruik, is om gratis toegang te hebben tot sites die met name door de RKN zijn geblokkeerd, zodat Telegram en oproepen naar Slack werken. Artikelen over dit onderwerp zijn al voorgesteld op Habré: tijd, два, drie.

Ik heb de implementatie van zo'n oplossing geïmplementeerd met behulp van Ansible: link.

De VPS zou Ubuntu 18.04 draaien. Ik controleerde de prestaties op twee hosters in Europa: Amazon en Digital Ocean.

Dus we hebben de bovenstaande Armbian op R64 geïnstalleerd, deze is beschikbaar via ssh onder de naam hm-bananapi-1 en heeft toegang tot internet. We implementeren sequentieel weerbare, automatiseringsscripts en voeren de installatie zelf uit op 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

Vervolgens moet u onze VPN op dezelfde manier op de VPS implementeren:

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

Hier is het argument altijd current-vpn en is de VPS-naam zelf geconfigureerd in een variabele (in dit geval is het 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 ja, voor al deze operaties moet je geheimen (in het bijzonder Wireguard-sleutels) in een map genereren ./secrets, zou de directory eruit moeten zien zo.

Ansible-automatisering in Python

U merkt misschien dat in plaats van de YAML-indeling de Ansible-opdrachten zijn gecodeerd in Python-scripts. Ter vergelijking, hoe u de bird-daemon op de gebruikelijke manier kunt inschakelen:

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

en hoe hetzelfde via Python:

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

Door Ansible-commando's met Python-code te schrijven, kun je de code hergebruiken, en in het algemeen zijn alle mogelijkheden van een algemene taal open. Bijvoorbeeld bird installeren op R64 en VPS:

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

zie functiecode installeer_bird().

Deze functie wordt genoemd pybook geïmplementeerd hier. Er is nog geen documentatie op pybook, dan zal ik dit defect corrigeren.

Wat denkt hij stroomopwaarts in dit geval.

Toezicht houden. Prometheus

Totaal: telegram werkt, ook linkedin en pornhub, over het algemeen is de gebruikerservaring ok. Maar alles kan breken, ook Chinese stukken ijzer.

Kernelupdates kunnen ook interessant zijn: ik wilde bijvoorbeeld de kernel 5.4 => 5.6 updaten, nou, er is Wireguard uit de doos, patchen is niet nodig ... Zo gezegd, zo gedaan: nauwgezet overgedragen patches van 5.4 naar 5.6, de kernel startte op, de tunnel naar de VPS pingde, maar bird kan geen verbinding maken met fout "BGP Error"… "Rolled back in horror" (c) naar 5.4; de overgang naar 5.6 werd uitgesteld in TODO.

Daarom heb ik, naast het installeren van de router en VPS, monitoring toegevoegd (op x86 Ubuntu 18.04), die op een aparte host is geïnstalleerd met de volgende componenten:

  • prometheus, alertmanager, blackbox_exporter - alles in docker
  • waarschuwingen worden naar het telegramkanaal gestuurd met behulp van de metalmatze/alertmanager-bot bot - ook in docker
  • tor voor de bot, zodat de bot situaties kan waarschuwen wanneer internet beschikbaar is, maar het telegram nog steeds niet werkt en de bot zelf geen verbinding kan maken
  • toegepast waarschuwingen: NodeVPNTroubles (geen ping naar VPS), BirdVPNTroubles (geen Bird-sessie), AntifilterDownloadTroubles (kan geblokkeerde IP-adressen niet laden), SiteTroubles (helaas telegram niet beschikbaar)
  • systeemwaarschuwingen zoals HostGrowingDiskReadLatency (goedkope SD-kaart wordt niet meer gelezen)

Voorbeeld van bewakingsopstelling:

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

Auto Discovery voor prometheus is ingesteld op de map /etc/prometheus/auto_http, een voorbeeld van het toevoegen van een host aan monitoring (hosts worden niet standaard gecontroleerd):

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 providers, 2 BPI's, anycast failover

Naast alles was ik van plan om verbinding te maken met twee providers zodat het internet zou blijven werken, zelfs als een provider problemen had met het netwerk, of ze vergaten te betalen voor internet, enz., en andere menselijke factoren.

De meest geavanceerde gebruikerservaring op het gebied van multi-wan wordt beschreven hier voor Mwan3-systeem onder Openwrt. Deze oplossing heeft een rijke functionaliteit, maar het opzetten en bedienen in het algemeen voor multi-wan is nogal lastig. Slechts een voorbeeld: als u vanaf twee IP-adressen tegelijk naar sommige sites komt, vinden ze het misschien niet leuk, ze werken niet meer => "het internet werkt niet."

Gezien deze ervaring heb ik besloten dat multihoming nog geen prioriteit is, alleen failover. Al lijkt het erop dat in de nieuwste versies van linux alles zou moeten werken met één commando zoals:

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

Dus, om een ​​single point of failure te voorkomen, nemen we 2 BPI's, elk verbinden met één provider, verbinden ze met elkaar en maken de communicatie met elkaar dynamisch gerouteerd via bird / OSPF.

Verder kondigen we op elk hetzelfde IP-adres aan als de service beschikbaar is (internet, DNS). Dat wil zeggen dat we de standaardroute niet zelf uitzetten, maar via vogel. De oplossing bespioneerd hier .

Deze functionaliteit is nog niet geïmplementeerd, het verraderlijke coronavirus heeft het verknoeid (niet alles kwam van aliexpress; een andere online winkel, Layta, beloofde binnen een week te leveren, en er is meer dan een maand verstreken; de tweede provider slaagde er niet in om de kabel voor quarantaine, slaagde er alleen in om een ​​gat in de muur te maken om voor de kabel te boren).

Hoe R64 te bestellen

Het bord zelf in de officiële winkel ChineesVoip.
Ook is het beter om direct te bestellen:

  • voedsel + informeer EU- of US-stekkerstandaard
  • koellichaam: radiatoren/ventilatoren; omdat zowel de CPU wordt verwarmd als de switch-chip
  • wifi-antenne, bij voorbeeld

Er is een nuance - de prijs van levering is al een tijdje onvoldoende hoog in de officiële winkel. Manager Judy Huang verzekerde me dat er geen vergissing was en dat je ePacket kunt kiezen voor $ 5, maar ik zag dat er voor Rusland alleen EMS is voor> 33 $. Onaangenaam, maar niet kritisch. Bovendien, als u een ander land kiest voor bezorging (ik ben door alle continenten gegaan), kost bezorging ~ 5 $. Russofoben?.. Maar toen ontdekte ik dat voor Frankrijk de leveringsprijs ook ~ $ 30 is, en gekalmeerd.

Als gevolg hiervan bood Judy aan om een ​​bestelling te plaatsen, maar niet te betalen (zinspelen: zet minder op de kaart zodat de betaling niet automatisch verloopt); schrijf haar en zij zal de verzendkosten verlagen tot normaal. Succes.

Problemen

Nog niet alles werkt perfect.

Производительность

Ansible=Python-commando's worden langzaam uitgevoerd, zelfs inactieve, gedurende 20-30 seconden; een orde van grootte langer dan op een x86-laptop. Bovendien worden ze in het begin vrij snel uitgevoerd, ~ 3 seconden, daarna vertragen ze scherp. Misschien komt dit door het opwarmen van de CPU (throttling). De Go-code loopt ook al lang:

# запрос метрик для прометея из 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 werkt, maar stopt na ongeveer een dag op Armbian, schrijft:

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

Alleen opnieuw opstarten helpt. We moeten verder gaan regelen.

Ethernet

Ethernet werkt, maar na ~ een dag komen er geen pakketten (DHCP) meer van R64.
Het opnieuw opstarten van de interface helpt:

ifdown br0; sleep 30; ifup br0

De driver is nieuw, de kernel is nog niet geaccepteerd, ik hoop de Chinese Landen Chao finish.

Bron: www.habr.com

Voeg een reactie