Банан Pi R64 Роутер - Debian, Wireguard, RKN

Banana Pi 64 як компютери ягонаи тахтаи монанд ба Raspberry Pi мебошад, аммо дорои якчанд бандарҳои Ethernet мебошад, ки имкон медиҳад онро ба роутер дар асоси тақсимоти умумӣ дар Linux табдил диҳед.

Банан Pi R64 Роутер - Debian, Wireguard, RKN

Бале, аллакай Openwrt вуҷуд дорад, аммо он мушкилоти худро дорад, GUI ва CLI; Микротик вуҷуд дорад, аммо боз он GUI/CLI-и худро дорад ва Wireguard аз қуттӣ кор намекунад... Умуман, ман мехоҳам роутер бо танзимоти чандир ва дар доираи Linux-и стандартӣ, ки шумо кор мекунед, бимонам. бо хар руз.

Дар мақолаи зери номҳои 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

Пас аз ин, дар аксари ҳолатҳо консол як-тахта пайдо мешавад = муваффақият.
Шумо метавонед тафсилоти бештарро бубинед дар ин ҷо.

Банан 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 мегузорем, онро фаъол месозем ва мушоҳида мекунем, ки консоли пайвастшуда аввал боркунӣ ва сипас боркунии стандартии Linux аст.

Варианти алтернативии пурборкунӣ истифодаи корти 64 Гб мебошад, ки аллакай дар 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) ба шумо лозим меояд, ки чанд файли дигарро нависед (пешборкунак барои корти SD, ATF, u-boot) танҳо барои ворид шудан ба боркунии ядро. Ин мавзӯъ то ҳол аст рушд карда истодааст, аммо барои мо чизи асосй он аст, ки он кор мекунад ва хуб аст.

Ҳоло ман тавассути eMMC зеркашӣ мекунам, рости гап, ман онро истифода намебарам, корти SD кифоя аст, аммо ман вақти зиёдеро барои кор кардан сарф кардам, бинобар ин дар мақола бошад.

Интихоби системаи оператсионӣ. Армӣ

Вазифаи аввалини барнома оғоз кардани VPN, табиатан Wireguard аст. Дарҳол маълум шуд, ки дар тарафи ядро ​​​​монтаж карда нашудааст ва сарлавҳаҳо вуҷуд надоранд. Ман ядроро аз нав сохтам ва чун одати худ бо x86, бо истифода аз DKMS модули ядроро ҷамъ кардам. Бо вуҷуди ин, суръати сохтани ҳатто иншооти хурд дар arm64 маро ба ҳайрат овард. Ва он гоҳ як модули ядрои дигар талаб карда шуд ва ғайра. Умуман, маълум мешавад, ки ҳама чизҳои марбут ба ядро ​​​​бо ноутбуки гарми x86 беҳтарин ҷамъ карда мешаванд, пас бо нусхабардории оддӣ ба R64 интиқол дода мешаванд, аз нав оғоз карда мешаванд ва санҷида мешаванд.

Чизи дигар қисми фазои корбарон аст. Дар мавриди интихоби ман Debian, ҳама чиз барои меъмории arm64 аллакай дар packages.debian.org мавҷуд аст ва барои аз нав сохтани чизе лозим нест.

Барои он ки дигар велосипед истехсол накунад, И интиқол дода шуд Армян Дар BPI R64.
Дурусттараш, ин: қисми корбарон Armbian аст ва ядро ​​аз анбор гирифта шудааст ошкор— А. Тасвири охиринро зеркашӣ кардан мумкин аст дар ин ҷо.

Ҳамаи фаъолиятҳо оид ба таҳияи қисми нармафзори R64 амалӣ карда мешавад Форум. Умуман, худи истеҳсолкунанда мекӯшад, ки роутерро барои Openwrt маъмул созад, аммо ба шарофати фаъолияти таҳиякунанда Франк аз Олмон, ҳама хусусиятҳо зуд дар ядрои Debian ҷамъ мешаванд. Тааҷҷубовар аст, ки Франк дар ҳар як риштаи форум фаъол аст.

Ташкили майдони кор: симхо

Алоҳида, ман мехоҳам ба шумо бигӯям, ки чӣ гуна ҳангоми таҳия/озмоиш, SBC (на танҳо BPI)-ро дар миз ҷойгир кунед, то сими Ethernet ба он аз манбаи интернет дар тамоми ҳуҷра/офис нагузаронад. Гап дар сари он аст, ки аз як тараф, шумо бояд як таҷҳизоти сахтафзорро бо Интернет таъмин кунед, аммо аз тарафи дигар, ҳама чиз дар он таҷҳизоти сахтафзор метавонад вайрон шавад ва пеш аз ҳама Wifi.

Аввалан, ман қарор додам, ки як "ҳуштак"-и арзони USB-Wifi харам, онро ба ягона бандари BPI пайваст кунам ва симҳоро фаромӯш кунам. Барои ин ман як TP-LINK TL-WN725N USB 2.0-и арзон харидам, аммо ба зудӣ маълум шуд, ки он хомӯш намешавад: барои кор кардани ҳуштак ба шумо драйвери ядро ​​лозим аст, ки албатта дар он ҷо набуд. (баъдтар ман ронандаи зарурии RTL8XXXU-ро ҷамъ овардам, аммо ин ҳанӯз ғайриимкон аст). Ва сими Ethernet барои муддате намуди ҳуҷраро вайрон кард.

Дар натиҷа, ман тавонистам бо ёрии Tenda MW3 (системаи Wifi mesh) аз кабел халос шавам: ман танҳо як кубро дар зери миз гузоштам ва BPI-ро ба порти LAN-и охирин бо сими Ethernet-и метрӣ пайваст кардам. Муваффакият.

Wireguard, RKN, Bird

Яке аз чизҳое, ки ман мехоҳам 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 то ҳол ҳуҷҷате нест, аммо ман ин масъаларо баъдтар ҳал мекунам.

Ӯ чӣ фикр мекунад болооб ба ин муносибат.

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

Ҳамагӣ: телеграмма кор мекунад, linkedin ва pornhub низ, дар маҷмӯъ таҷрибаи корбар хуб аст. Аммо ҳама чиз метавонад шикаста, аз ҷумла сахтафзор Чин.

Навсозиҳои ядро ​​​​инчунин ҷолиб буда метавонанд: масалан, ман мехостам ядрои 5.4 => 5.6-ро навсозӣ кунам, хуб, Wireguard аз қуттӣ ҳаст, часпондан лозим нест... Ба зудӣ гуфтам: Ман часбҳоро аз 5.4 бо заҳмат интиқол додам. то 5.6, ядро ​​ба кор даромад, нақби VPS пинг кард, аммо парранда бо хатогии "BGP Error" пайваст шуда наметавонад ... "Ман даҳшатнок шудам" (в) то 5.4; Гузариш ба 5.6 дар TODO мавқуф гузошта шуд.

Аз ин рӯ, ба ғайр аз насб кардани роутер ва VPS, ман мониторинг илова кардам (дар x86 Ubuntu 18.04), ки дар ҳости алоҳида бо ҷузъҳои зерин насб шудааст:

  • prometheus, alertmanager, blackbox_exporter - ҳама дар докер
  • Огоҳӣ ба канали телеграмм тавассути боти metalmatze/alertmanager-бот фиристода мешавад - инчунин дар Docker
  • tor барои бот, то ин ки бот метавонад ҳолатҳоро ҳангоми мавҷудияти Интернет огоҳ кунад, аммо Telegram то ҳол кор намекунад ва худи бот пайваст шуда наметавонад.
  • татбиқ карда шуд огоҳиҳо: NodeVPNtroubles (бе пинг ба VPS), BirdVPNtroubles (иҷлосияи парранда нест), 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, интиқоли дилхоҳ

Илова бар ҳама, ман нақша доштам, ки ба ду провайдер пайваст шавам, то интернет корашро идома диҳад, ҳатто агар як провайдер бо шабака мушкилӣ дошта бошад ё пардохти интернет ва ғайраро фаромӯш карда бошад ва дигар омилҳои инсонӣ.

Таҷрибаи пешрафтаи корбар дар мавзӯи бисёрҷониба тавсиф шудааст дар ин ҷо барои системаи Mwan3 зери Openwrt. Ин ҳалли дорои функсияҳои ғанӣ мебошад, аммо насб ва истифода бурдани он дар маҷмӯъ барои бисёрҷониба хеле душвор аст. Танҳо як мисол: агар шумо якбора ба баъзе сайтҳо аз ду суроғаи IP ворид шавед, шояд ба онҳо маъқул нашаванд, онҳо корро қатъ мекунанд => "Интернет кор намекунад."

Бо дарназардошти ин таҷриба, ман қарор додам, ки multihoming ҳанӯз авлавият нест, танҳо хатогӣ. Гарчанде ки чунин ба назар мерасад, ки дар версияҳои охирини 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 омад; мағозаи дигари онлайн Лайта ваъда дод, ки дар як ҳафта интиқол медиҳад, аммо зиёда аз як моҳ гузашт; провайдери дуюм вақт надошт. ба дароз кардани кабел пеш аз карантин, танҳо муяссар шуд, ки сӯрохи пармакунӣ дар девор барои кабел).

Чӣ тавр фармоиш додан R64

Худи тахта дар мағозаи расмӣ ҷойгир аст SinoVoip.
Инчунин беҳтар аст, ки фавран фармоиш диҳед:

  • хӯрок + ба стандарти сими ИА ё ИМА хабар диҳед
  • гармкунак: радиаторҳо / мухлисон; зеро ҳам CPU ва ҳам чипи коммутатор гарм мешаванд
  • антеннаи WiFi, барои мисол

Як нозуки вуҷуд дорад - нархи интиқол дар мағозаи расмӣ чанд вақт ба қадри кофӣ баланд нест. Менеҷер Ҷуди Хуанг маро бовар кунонд, ки ҳеҷ хатое вуҷуд надорад ва шумо метавонед ePacket-ро барои $5 интихоб кунед, аммо ман дидам, ки барои Русия танҳо EMS барои > $33 мавҷуд аст. Нохушоянд, аммо танқидӣ нест. Ғайр аз он, агар шумо ягон кишвари дигарро барои интиқол интихоб кунед (ман аз тамоми қитъаҳо гузаштам), интиқол ~ $ 5 арзиш дорад. Руссофобҳо?.. Аммо баъд фаҳмидам, ки барои Фаронса нархи интиқол ҳам ~30 доллар аст ва ман ором шудам.

Дар натиҷа, Ҷуди пешниҳод кард, ки фармоиш диҳад, аммо пардохт накардааст (киноя: ба корт камтар гузоред, то пардохти автоматӣ нагузарад); ба вай нависед ва вай нархи интиқолро ба муқаррарӣ кам мекунад. Муваффакият.

Масъалаҳои

Хануз на хама чиз мукаммал кор мекунад.

Маҳсулнокӣ

Ansible=Фармонҳои Python оҳиста иҷро мешаванд, ҳатто фармонҳои бекор дар давоми 20-30 сония; тартиби бузургии дарозтар аз ноутбуки x86. Гузашта аз ин, дар аввал онҳо хеле зуд, ~ 3 сония иҷро мешаванд, баъд якбора суст мешаванд. Ин метавонад бо сабаби гарм шудани CPU (throttling) бошад. Рамзи 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 кор мекунад, аммо дар Armbian пас аз як рӯз қатъ мешавад, менависад:

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

Танҳо аз нав оғоз кардан кӯмак мекунад. Мо бояд пеш равем дарк.

Ethernet

Ethernet кор мекунад, аммо пас аз ~64 соат бастаҳои (DHCP) аз RXNUMX омаданро қатъ мекунанд.
Аз нав оғоз кардани интерфейс кӯмак мекунад:

ifdown br0; sleep 30; ifup br0

Ронанда нав аст, он ҳанӯз ба ядро ​​​​қабул нашудааст, ман умедворам, ки ин Ланден Чао Чин аст ба итмом мерасонад.

Манбаъ: will.com

Илова Эзоҳ