Рутер Banana Pi R64 – Debian, Wireguard, RKN

Banana Pi 64 е компјутер со една плоча сличен на Raspberry Pi, но со неколку Ethernet порти, што овозможува да се претвори во рутер базиран на дистрибуција на Linux за општа намена.

Рутер Banana Pi R64 – Debian, Wireguard, RKN

Да, веќе постои Openwrt, но тој има свои проблеми, неговиот GUI и CLI; Има Микротик, но пак има свој GUI/CLI, а Wireguard не работи надвор од кутијата. со секој ден.

Во написот под имињата BPI, R64, единечна табла, ќе мислам на истото - самата Banana Pi R64 единечна плоча.

Избор на слика. Преземете преку eMMC

Првата вештина што треба да ја стекнете кога работите SBC генерално, а особено со R64, тоа значи да научите како да вчитате оперативен систем во него и да можете да комуницирате со него, бидејќи R64 нема приклучок за монитор (HDMI, на пример). Кога сè падна - Wifi, Ethernet, Bluetooth, USB, итн. престанаа да работат. Постои UART, преку чиј интерфејс секогаш можете да видите што тргнало наопаку, а исто така да извршите неколку команди од конзолата, доколку е потребно.

Алгоритам за поврзување со R64 преку USB-UART:

  • трчаме до продавницата за радио делови за USB-UART кабел (PL2303, Serial-to-USB)
  • поврзете еден USB крај со компјутерот, а другиот, UART, со R64, со три жици од четири, како на сликата подолу
  • работи во компјутерската конзола sudo minicom

После ова, во повеќето случаи ќе се појави конзолата со една плоча = успех.
Можете да видите повеќе детали тука.

Рутер Banana Pi R64 – Debian, Wireguard, RKN

Следно, најлесниот начин е да го вчитате оперативниот систем од SD-картичка: преземете до линк слика и пополнете ја:

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

Ја вметнуваме картичката во отворот за R64 SD, ја вклучуваме и го набљудуваме вчитувањето на поврзаната конзола прво uboot, а потоа стандардното вчитување на Linux.

Алтернативна опција за подигање е користење на картичка од 64Gb веќе вградена во R8, наречена eMMC. Според упатствата во викито, ја копираме сликата на уредот
/dev/mmcblk0 до BPI, рестартирајте, отстранете ја SD-картичката, повторно вклучете BPI... и не работи. Како да се оди напред и назад Boot select не се замарај.

Факт е дека барем за BPI треба да поставите посебно знаменце за да можете да се подигнете од внатрешен флеш-уред:

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]

Следно, треба да напишете preloader во посебна партиција за подигање

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

Производителот R64 (Кина) го објави овој бинар тука. Она што го прави е непознато (нема изворни кодови), но нема да работи ниту без него.

Во принцип, после ова, сликите почнуваат да се вчитуваат од eMMC. Ако сакате да го сфатите и да креирате слики од нула, тогаш и за двата случаи (SD/eMMC) треба да напишете уште неколку датотеки (preloader за SD-картичка, ATF, u-boot) само за да стигнете до вчитување на кернелот. Темава е сеуште се развива, но кај нас главно е тоа што функционира и во ред.

Сега преземам преку eMMC, да бидам искрен, не го користам, доволна е SD-картичка, но потрошив доста време за да функционира, па нека биде во статијата.

Избор на оперативен систем. Армбијан

Првата задача на апликацијата е да стартувате VPN, природно Wireguard. Веднаш беше откриено дека од страната на кернелот не е склопен и нема заглавија. Го реконструирав кернелот и, како што ми е навика со x86, го составив модулот на кернелот користејќи DKMS. Меѓутоа, брзината на градење дури и мали комунални услуги на arm64 непријатно ме изненади. И тогаш беше потребен друг модул на кернелот, итн. Во принцип, излегува дека сè што е поврзано со кернелот најдобро се собира на топол лаптоп x86, а потоа се пренесува на R64 со едноставно копирање, рестартирање и тестирање.

Друга работа е делот за кориснички простор. Во мојот случај да изберам Debian, сè за архитектурата на arm64 е веќе на packages.debian.org и нема потреба да се обнови ништо.

За да не произведам уште еден велосипед, И пренесен Армбијан на BPI R64.
Или подобро кажано, ова: делот userspace е Armbian, а кернелот е земен од складиштето Френк-А. Најновата слика може да се преземе тука.

Сите активности за развој на софтверскиот дел на R64 се спроведуваат на на форумот. Општо земено, самиот производител се стреми да го популаризира рутерот за Openwrt, но благодарение на активноста на развивачот Френк од Германија, сите функции брзо завршуваат во кернелот за Debian. Изненадувачки, Френк е активен во секоја тема на форумот.

Организација на работниот простор: жици

Посебно, би сакал да ви кажам како, за време на развојот/тестирањето, да поставите SBC (не само BPI) на маса за да не се вклучи кабел за етернет до него од извор на Интернет низ целата соба/канцеларија. Факт е дека, од една страна, треба да обезбедите парче хардвер со Интернет, но од друга страна, сè во тој хардвер може да се расипе, а пред се Wifi.

Прво, решив да купам евтин USB-Wifi „свирче“, да го приклучам во единствената порта на BPI и да заборавам на жиците. За да го направам ова, купив ефтин TP-LINK TL-WN725N USB 2.0, но многу брзо стана јасно дека нема да полета: за да функционира свирежот, потребен ви е двигател на јадрото, кој, се разбира, го немаше (подоцна го составив потребниот драјвер за RTL8XXXU, но сè уште е непрактичен). И етернет кабелот го расипа изгледот на собата за некое време.

Како резултат на тоа, успеав да се ослободам од кабелот со помош на Tenda MW3 (Wifi mesh system): едноставно ставив една коцка под масата и го поврзав BPI со LAN-портата на вториот со етернет-кабел долг метар. Успех.

Wireguard, RKN, птица

Една од работите за кои сакам да користам Banana PI е да имам бесплатен пристап до страниците блокирани од RKN, особено, за да можат да функционираат повиците на Telegram и Slack. Веќе се предложени написи на Хабре на оваа тема: време, два, три.

Јас го распоредив токму ова решение користејќи Ansible: линк.

Се претпоставува дека VPS работи со Ubuntu 18.04. Ја проверив функционалноста на два хостери во Европа: Amazon и Digital Ocean.

Значи, го инсталиравме горенаведениот Armbian на R64, до него е достапен преку ssh под името hm-bananapi-1 и има пристап до интернет. Ние постојано распоредуваме Ansible, скрипти за автоматизација и ја стартуваме самата инсталација на 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

Следно, треба да го распоредите нашиот VPN на VPS на ист начин:

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

Овде аргументот е секогаш актуелен-vpn, а вистинското име на VPS е конфигурирано во променлива (во овој случај тоа е 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

О, да, пред сите овие операции треба да генерирате тајни (особено Wireguard клучеви) во папката ./secrets, директориумот треба да изгледа вака така.

Ansible автоматизација во Python

Може да забележите дека наместо да бидат во формат YAML, командите Ansible се кодирани во скрипти на Python. За споредба, како да го овозможите птичјиот демон на вообичаен начин:

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

и како да го направите истото преку Python:

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

Пишувањето на команди Ansible во Python ви овозможува повторно да го користите кодот и генерално ги отворате сите можности на јазикот за општа намена. На пример, инсталирање птица на R64 и VPS:

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

видете го кодот на функцијата install_bird().

Оваа функција наречена pybook имплементирани тука. Сè уште нема документација за pybook, но ќе го поправам овој проблем подоцна.

Што мисли тој возводно во оваа прилика.

Мониторинг. Прометеј

Вкупно: телеграмата работи, линкедин и порнхаб исто така, генерално корисничкото искуство е во ред. Но, сè може да се скрши, вклучително и кинескиот хардвер.

Ажурирањето на кернелот исто така може да биде интересно: на пример, сакав да го ажурирам кернелот 5.4 => 5.6, добро, Wireguard е таму надвор од кутијата, нема потреба да се закрпи... Не порано од направеното: макотрпно ги префрлив лепенките од 5.4 до 5.6, кернелот се вклучи, тунелот до VPS се закачи, но птицата не може да се поврзе со грешката „BGP Error“ ... „Се вратив од ужас“ (в) на 5.4; Поместувањето на 5.6 беше одложено во ТОДО.

Затоа, покрај инсталирањето на рутерот и VPS, додадов мониторинг (на x86 Ubuntu 18.04), кој е инсталиран на посебен хост со следните компоненти:

  • prometheus, alertmanager, blackbox_exporter - сите во докер
  • Известувањата се испраќаат до телеграмскиот канал со помош на ботот metalmatze/alertmanager-bot - исто така во Docker
  • tor за ботот, така што ботот може да алармира ситуации кога има интернет, но Telegram сè уште не работи, а самиот бот не може да се поврзе
  • Применето предупредувања: NodeVPNTroubles (без пинг до VPS), BirdVPNTproubles (без сесија на птица), AntifilterDownloadTroubles (грешка при вчитување блокирани IP адреси), SiteTroubles (недостапна несреќна телеграма)
  • системски предупредувања, на пример, HostGrowingDiskReadLatency (евтината SD-картичка станува нечитлива)

Пример за поставување на мониторинг:

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

Автоматското откривање за Prometheus е конфигурирано во папката /etc/prometheus/auto_http, пример за додавање домаќин на мониторинг (домаќините не се следат стандардно):

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 провајдери, 2 BPI, anycast failover

Покрај се, планирав да се поврзам со два провајдери за да продолжи да работи Интернетот, дури и ако еден провајдер има проблеми со мрежата или заборавил да плати за Интернет итн., и други човечки фактори.

Опишано е најнапредното корисничко искуство на тема мулти-ван тука за системот Mwan3 под Openwrt. Ова решение има богата функционалност, но поставувањето и општо управувањето со него за мулти-ван е доста проблематично. Само еден пример: ако дојдете на некои сајтови од две IP адреси одеднаш, можеби нема да им се допадне, тие ќе престанат да работат => „Интернетот не работи“.

Земајќи го предвид ова искуство, решив дека мултидомувањето сè уште не е приоритет, туку само неуспешно. Иако, се чини дека во најновите верзии на Linux сè треба да работи со една команда како:

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

Значи, за да избегнеме една точка на неуспех, земаме 2 BPI, ги поврзуваме секој со еден провајдер, ги поврзуваме едни со други и ја правиме врската меѓу себе динамично рутирање преку птица/OSPF.

Следно, ја рекламираме истата IP адреса на секоја од нив доколку услугата е достапна (интернет, DNS). Односно, стандардната рута нема да ја поставиме самите, туку преку птица. Го шпионирав решението тука .

Оваа функционалност сè уште не е имплементирана, подмолниот коронавирус играше трик овде (не пристигна сè од Aliexpress; друга онлајн продавница, Layta, вети дека ќе испорача за една недела, но помина повеќе од еден месец; вториот провајдер немаше време за да го продолжи кабелот пред карантин, успеа само да добие дупка во дупчалката во ѕидот за кабелот).

Како да нарачате R64

Самата табла е во официјалната продавница SinoVoip.
Исто така, подобро е да нарачате веднаш:

  • храна + информирајте го стандардот за приклучок на ЕУ или САД
  • ладилник: радијатори/вентилатори; бидејќи и процесорот и чипот на прекинувачот се загреваат
  • wifi антена, на пример

Постои една нијанса - цената за испорака веќе некое време стана несоодветно висока во официјалната продавница. Менаџерот Џуди Хуанг ме убеди дека нема грешка и можеш да избереш ePacket за 5 долари, но видов дека за Русија има само EMS за >33 долари. Непријатно, но не и критично. Покрај тоа, ако изберете која било друга земја за испорака (поминав низ сите континенти), испораката ќе чини ~ 5 долари. Русофоби?.. Ама после открив дека и за Франција цената за достава е ~30$ и се смирив.

Како резултат на тоа, Џуди понуди да нарача, но не и да плати (асоцираш: ставете помалку на картичката за да не помине автоматското плаќање); пишете ѝ и таа ќе ја намали цената за испорака на нормала. Успех.

Прашања

Сè уште не функционира сè совршено.

Перформанси

Ansible=Наредбите на Python се извршуваат бавно, дури и оние во мирување, за 20-30 секунди; ред на големина подолг отколку на лаптоп x86. Покрај тоа, на почетокот тие се извршуваат доста брзо, ~ 3 секунди, а потоа нагло се забавуваат. Ова може да се должи на загревањето на процесорот (задушување). На Go кодот исто така му треба долго време за да работи:

# запрос метрик для прометея из 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 работи, но на Армбиан престанува по околу еден ден, пишува:

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

Само рестартирањето помага. Треба да продолжиме понатаму средување.

Етернет

Етернет работи, но по ~64 часа пакетите (DHCP) од RXNUMX престануваат да пристигнуваат.
Рестартирањето на интерфејсот помага:

ifdown br0; sleep 30; ifup br0

Возачот е нов, сеуште не е прифатен во кернелот, се надевам дека е кинескиот Landen Chao го завршува.

Извор: www.habr.com

Додадете коментар