روتر Banana Pi R64 – Debian، Wireguard، RKN

Banana Pi 64 یک کامپیوتر تک بردی مشابه Raspberry Pi است، اما دارای چندین پورت اترنت است که امکان تبدیل آن را به یک روتر بر اساس توزیع لینوکس همه منظوره فراهم می کند.

روتر Banana Pi R64 – Debian، Wireguard، RKN

بله، در حال حاضر Openwrt وجود دارد، اما مشکلات خاص خود را دارد، رابط کاربری گرافیکی و CLI آن. میکروتیک هست ولی بازم GUI/CLI خودش رو داره و وایرگارد هم کار نمیکنه... در کل من یه روتر با تنظیمات منعطف میخوام در حالیکه تو چارچوب لینوکس استاندارد باقی بمونه که شما کار میکنید. با هر روز

در مقاله با نام های BPI، R64، single-board، منظور من همان است - خود Banana Pi R64 single-board.

انتخاب یک تصویر دانلود از طریق eMMC

اولین مهارتی که باید هنگام کار با آن به دست آورید SBC به طور کلی، و در مورد R64 به طور خاص، این بدان معنی است که یاد بگیرید چگونه یک سیستم عامل را در آن بارگذاری کنید و بتوانید با آن تعامل داشته باشید، زیرا R64 یک پورت برای مانیتور ندارد (مثلاً HDMI). وقتی همه چیز خراب شد - Wifi، Ethernet، بلوتوث، USB و غیره از کار افتاد. یک UART وجود دارد که از طریق رابط آن همیشه می توانید ببینید چه اشتباهی رخ داده است و همچنین در صورت لزوم چند دستور را از کنسول اجرا کنید.

الگوریتم اتصال به R64 از طریق USB-UART:

  • برای یک کابل USB-UART (PL2303، سریال به 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 و سپس بارگذاری استاندارد لینوکس مشاهده می کنیم.

یک گزینه راه‌اندازی جایگزین، استفاده از یک کارت 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 منتقل می شود، راه اندازی مجدد و آزمایش می شود.

مورد دیگر قسمت Userspace است. در مورد من برای انتخاب دبیان، همه چیز برای معماری arm64 از قبل در packages.debian.org است و نیازی به بازسازی چیزی نیست.

برای اینکه دوچرخه دیگری تولید نکنم، من منتقل شده است بازوبند در BPI R64.
یا بهتر است بگوییم این: قسمت userspace آرمبین است و هسته از مخزن گرفته شده است. بی پرده-آ. آخرین تصویر قابل دانلود است اینجا.

تمام فعالیت های توسعه بخش نرم افزار R64 انجام می شود انجمن. به طور کلی، خود سازنده تلاش می کند تا روتر را برای Openwrt محبوب کند، اما به لطف فعالیت توسعه دهنده فرانک از آلمان، همه ویژگی ها به سرعت در هسته دبیان ختم می شوند. با کمال تعجب، فرانک در هر تاپیک فروم فعال است.

سازماندهی فضای کار: سیم

به طور جداگانه، می‌خواهم به شما بگویم که چگونه، در طول توسعه/آزمایش، یک SBC (نه فقط یک BPI) را روی یک میز قرار دهید تا کابل اترنت را از یک منبع اینترنتی در کل اتاق/دفتر اجرا نکنید. واقعیت این است که از یک طرف باید یک قطعه سخت افزاری را با اینترنت تهیه کنید، اما از طرف دیگر همه چیز در آن سخت افزار و اول از همه Wifi ممکن است خراب شود.

ابتدا تصمیم گرفتم یک "سوت" USB-Wifi ارزان بخرم، آن را به تنها درگاه BPI وصل کنم و سیم ها را فراموش کنم. برای انجام این کار، من یک TP-LINK TL-WN725N USB 2.0 ارزان قیمت خریدم، اما خیلی زود مشخص شد که خاموش نمی شود: برای اینکه سوت کار کند، به یک درایور هسته نیاز دارید، که البته در آنجا نبود. (بعداً درایور لازم RTL8XXXU را مونتاژ کردم، اما هنوز غیرعملی است). و کابل اترنت برای مدتی ظاهر اتاق را خراب کرد.

در نتیجه، با کمک Tenda MW3 (سیستم مش وای فای) توانستم از شر کابل خلاص شوم: به سادگی یک مکعب را زیر میز قرار دادم و BPI را با یک کابل اترنت به طول یک متر به پورت LAN دومی وصل کردم. موفقیت

Wireguard، RKN، Bird

یکی از مواردی که می‌خواهم از Banana PI استفاده کنم، دسترسی رایگان به سایت‌هایی است که توسط RKN مسدود شده‌اند، به‌طور خاص، تا تماس‌های تلگرام و Slack بتوانند کار کنند. مقالاتی در مورد Habré قبلاً در مورد این موضوع پیشنهاد شده است: زمان, два, سه.

من دقیقاً این راه حل را با استفاده از Ansible به کار بردم: پیوند.

فرض بر این است که VPS اوبونتو 18.04 را اجرا می کند. من عملکرد دو میزبان در اروپا را بررسی کردم: آمازون و اقیانوس دیجیتال.

بنابراین، آرمبیان فوق را روی 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 در پایتون

ممکن است متوجه شوید که به جای اینکه در فرمت YAML باشند، دستورات Ansible در اسکریپت های پایتون کدگذاری می شوند. برای مقایسه، نحوه فعال کردن دیمون پرنده به روش معمول:

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

و نحوه انجام همین کار از طریق پایتون:

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

نوشتن دستورات Ansible در پایتون به شما امکان استفاده مجدد از کد را می دهد و به طور کلی همه احتمالات زبان همه منظوره را باز می کند. به عنوان مثال، نصب bird در 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" متصل شود ... "I roll back in horror" (c) به 5.4; حرکت به 5.6 در TODO به تعویق افتاد.

بنابراین، علاوه بر نصب روتر و VPS، مانیتورینگ (در x86 اوبونتو 18.04) را اضافه کردم که روی یک هاست جداگانه با اجزای زیر نصب می شود:

  • prometheus، alertmanager، blackbox_exporter - همه در docker
  • هشدارها با استفاده از ربات metalmatze/alertmanager-bot به کانال تلگرام ارسال می شوند - همچنین در داکر
  • tor برای ربات، به طوری که ربات می تواند موقعیت هایی را که اینترنت وجود دارد هشدار دهد، اما تلگرام هنوز کار نمی کند و خود ربات نمی تواند متصل شود.
  • کاربردی هشدارها: NodeVPNTroubles (بدون پینگ به VPS)، BirdVPNTroubles (بدون جلسه پرنده)، AntifilterDownload Troubles (خطا در بارگیری آدرس های IP مسدود شده)، SiteTroubles (تلگرام بدبخت در دسترس نیست)
  • هشدارهای سیستم، به عنوان مثال، HostGrowingDiskReadLatency (کارت SD ارزان غیرقابل خواندن می شود)

نمونه نصب مانیتورینگ:

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

Auto Discovery برای 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، هرکست failover

علاوه بر همه چیز، من قصد داشتم به دو ارائه دهنده متصل شوم تا اینترنت به کار خود ادامه دهد، حتی اگر یکی از ارائه دهندگان با شبکه مشکل داشته باشد یا آنها فراموش کرده اند هزینه اینترنت و غیره را پرداخت کنند و عوامل انسانی دیگر.

پیشرفته ترین تجربه کاربری در موضوع Multi-wan توضیح داده شده است اینجا برای سیستم Mwan3 تحت Openwrt. این راه حل دارای عملکرد غنی است، اما راه اندازی و راه اندازی آن به طور کلی برای چند وان بسیار مشکل است. فقط یک مثال: اگر به طور همزمان از دو آدرس IP به برخی از سایت ها بیایید، ممکن است آن را دوست نداشته باشند، آنها کار نمی کنند => "اینترنت کار نمی کند."

با در نظر گرفتن این تجربه، به این نتیجه رسیدم که multihoming هنوز یک اولویت نیست، فقط failover است. اگرچه، به نظر می رسد که در آخرین نسخه های لینوکس همه چیز باید با یک دستور مانند:

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

بنابراین، برای جلوگیری از یک نقطه شکست، 2 BPI را می گیریم، هر کدام را به یک ارائه دهنده متصل می کنیم، آنها را به یکدیگر متصل می کنیم و از طریق bird/OSPF مسیریابی پویا با یکدیگر برقرار می کنیم.

در مرحله بعد، در صورت در دسترس بودن سرویس (اینترنت، DNS) آدرس IP یکسانی را در هر یک تبلیغ می کنیم. یعنی مسیر پیش فرض را خودمان تعیین نمی کنیم، بلکه از طریق پرنده. راه حل را جاسوسی کردم اینجا .

این قابلیت هنوز اجرا نشده است، ویروس کرونای موذی در اینجا حقه بازی را بازی کرد (همه چیز از Aliexpress وارد نشد؛ فروشگاه آنلاین دیگری، Layta، قول داده بود ظرف یک هفته تحویل دهد، اما بیش از یک ماه گذشته است؛ ارائه دهنده دوم وقت نداشت. برای تمدید کابل قبل از قرنطینه، فقط موفق شد یک سوراخ در دیواره کابل ایجاد کند).

نحوه سفارش R64

خود تابلو در فروشگاه رسمی موجود است SinoVoip.
همچنین بهتر است بلافاصله سفارش دهید:

  • غذا + استاندارد دوشاخه اتحادیه اروپا یا ایالات متحده را اطلاع دهید
  • هیت سینک: رادیاتور/فن؛ زیرا هم CPU و هم تراشه سوئیچ در حال گرم شدن هستند
  • آنتن وای فای، مثلا

یک تفاوت ظریف وجود دارد - مدتی است که قیمت تحویل در فروشگاه رسمی به اندازه کافی بالا نیست. مدیر جودی هوانگ من را متقاعد کرد که هیچ خطایی وجود ندارد، و شما می توانید ePacket را با قیمت 5 دلار انتخاب کنید، اما دیدم که برای روسیه فقط EMS برای > 33 دلار وجود دارد. ناخوشایند، اما نه انتقادی. علاوه بر این، اگر کشور دیگری را برای تحویل انتخاب کنید (من تمام قاره ها را رفتم)، هزینه ارسال ~ 5 دلار خواهد بود. Russophobes؟.. اما بعد متوجه شدم که برای فرانسه قیمت تحویل هم ~30 دلار است و آرام شدم.

در نتیجه، جودی پیشنهاد داد که سفارش بدهد، اما پرداخت نکند (تذکر: کمتر روی کارت قرار دهید تا پرداخت خودکار انجام نشود). به او بنویسید و او قیمت تحویل را به حالت عادی کاهش می دهد. موفقیت

مسائل مربوط به

هنوز همه چیز به طور کامل کار نمی کند.

کارایی

Ansible=فرمان‌های پایتون به آرامی اجرا می‌شوند، حتی دستورات غیرفعال، برای 20-30 ثانیه. یک مرتبه بزرگتر از لپ تاپ x86 است. علاوه بر این، در ابتدا آنها بسیار سریع اجرا می شوند، ~ 3 ثانیه، سپس آنها به شدت کاهش می یابد. این ممکن است به دلیل گرم شدن CPU (گسست شدن) باشد. کد 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

فای

وای فای کار می کند، اما در آرمبین بعد از حدود یک روز متوقف می شود، می نویسد:

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

اضافه کردن نظر