Bộ định tuyến Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 là một máy tính bảng đơn tương tự như Raspberry Pi, nhưng có nhiều cổng Ethernet, khiến nó trở thành một bộ định tuyến phân phối Linux đa năng.

Bộ định tuyến Banana Pi R64 - Debian, Wireguard, RKN

Có, Openwrt đã tồn tại, nhưng nó có GUI và CLI riêng; có Mikrotik, nhưng một lần nữa, nó có GUI / CLI riêng và Wireguard không hoạt động tốt ... Nói chung, tôi muốn một bộ định tuyến có cài đặt linh hoạt, trong khi vẫn nằm trong khuôn khổ của Linux tiêu chuẩn mà bạn làm việc với Hằng ngày.

Trong bài viết dưới tên BPI, R64, bảng đơn, tôi sẽ muốn nói điều tương tự - chính bảng đơn Banana Pi R64.

Lựa chọn hình ảnh. Tải xuống qua eMMC

Kỹ năng đầu tiên cần có khi làm việc với SBC nói chung và với R64 nói riêng, nghĩa là học cách nạp HĐH vào và có thể tương tác với nó, vì R64 không có cổng màn hình (HDMI chẳng hạn). Khi mọi thứ không hoạt động - Wifi ngừng hoạt động, mạng Ethernet, Bluetooth, USB, v.v. có một UART, thông qua giao diện mà bạn luôn có thể thấy điều gì đã xảy ra và cũng có thể chạy một vài lệnh từ bảng điều khiển, nếu cần.

Thuật toán kết nối với R64 qua USB-UART:

  • chạy đến cửa hàng linh kiện radio để mua cáp USB-UART (PL2303, Serial-to-USB)
  • chúng tôi kết nối một đầu USB với máy tính và đầu kia, UART, với R64, bằng ba trong số bốn dây, như trong hình bên dưới
  • trong bảng điều khiển máy tính chạy sudo minicom

Sau đó, trong hầu hết các trường hợp, bảng điều khiển một bảng sẽ xuất hiện = thành công.
bạn có thể xem thêm đây.

Bộ định tuyến Banana Pi R64 - Debian, Wireguard, RKN

Tiếp theo, cách đơn giản nhất là tải hệ điều hành từ thẻ SD: tải xuống bằng liên kết hình ảnh và tải nó lên:

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

chúng tôi lắp thẻ vào khe cắm R64 SD, bật nó lên, quan sát quá trình tải uboot trước trên bảng điều khiển được kết nối, sau đó là khởi động Linux tiêu chuẩn.

Một tùy chọn khởi động thay thế đang sử dụng thẻ 64Gb đã được nhúng trong R8, được gọi là eMMC. Theo hướng dẫn trên wiki, chúng tôi viết lại hình ảnh vào thiết bị
/dev/mmcblk0 thành BPI, khởi động lại, tháo thẻ SD, bật lại BPI... và nó không hoạt động. Làm sao để tới đó Boot select đừng níu kéo.

Thực tế là ít nhất đối với BPI, bạn cần đặt một cờ đặc biệt để có thể khởi động từ ổ đĩa flash bên trong:

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]

Tiếp theo, bạn cần ghi preloader vào một phân vùng khởi động đặc biệt

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

Nhà sản xuất R64 (Trung Quốc) đã đăng nhị phân này đây. Không biết anh ta làm gì (không có mã nguồn), nhưng không có anh ta thì nó cũng không hoạt động.

Nói chung, sau đó, hình ảnh bắt đầu tải từ eMMC. Nếu bạn muốn tìm hiểu và tạo hình ảnh từ đầu, thì đối với cả hai trường hợp (SD / eMMC), bạn cần ghi thêm một số tệp (trình tải trước cho thẻ SD, ATF, u-boot), chỉ để truy cập kernel khởi động. Chủ đề này vẫn còn đang phát triển, nhưng đối với chúng tôi, điều chính là nó hoạt động và ổn.

Bây giờ, thành thật mà nói, tôi không sử dụng tải xuống eMMC, thẻ SD là đủ, nhưng tôi đã dành khá nhiều thời gian để làm cho nó hoạt động, vì vậy hãy để nó trong bài viết.

Lựa chọn hệ điều hành. người Armbia

Nhiệm vụ ứng dụng đầu tiên là khởi chạy VPN, tất nhiên là Wireguard. Nó ngay lập tức chỉ ra rằng nó không được lắp ráp từ phía hạt nhân và không có tiêu đề. Tôi đã xây dựng lại kernel và theo thói quen với x86, tôi đã xây dựng mô-đun kernel bằng DKMS. Tuy nhiên, tốc độ lắp ráp trên arm64 của ngay cả những tiện ích nhỏ cũng làm tôi ngạc nhiên một cách khó chịu. Và sau đó, một mô-đun hạt nhân khác được yêu cầu, v.v. Nói chung, hóa ra mọi thứ liên quan đến kernel sẽ tốt hơn nếu được lắp ráp trên máy tính xách tay x86 ống ấm, sau đó chuyển sang R64 bằng cách sao chép đơn giản, khởi động lại và thử nghiệm.

Một điều nữa là phần không gian người dùng. Trong trường hợp chọn Debian của tôi, mọi thứ cho kiến ​​trúc arm64 đã có sẵn trên packages.debian.org và không cần phải xây dựng lại bất cứ thứ gì.

Để không sản xuất một chiếc xe đạp khác, tôi chuyển Áo giáp trên BPI R64.
Hay đúng hơn: phần không gian người dùng là Armbian và lõi được lấy từ kho lưu trữ Frank-MỘT. Hình ảnh mới nhất có thể được tải xuống đây.

Tất cả các hoạt động phát triển phần mềm của R64 được thực hiện trên diễn đàn. Nói chung, bản thân nhà sản xuất tìm cách phổ biến bộ định tuyến Openwrt, nhưng nhờ hoạt động của nhà phát triển Frank đến từ Đức, tất cả các tính năng nhanh chóng kết thúc trong nhân Debian. Ngạc nhiên thay, Frank tích cực trong mọi chủ đề của diễn đàn.

Tổ chức không gian làm việc: dây

Riêng biệt, tôi muốn cho bạn biết cách đặt SBC (không chỉ BPI) trên bàn trong quá trình phát triển / thử nghiệm để không dẫn cáp Ethernet đến nó từ nguồn Internet qua toàn bộ phòng / văn phòng. Thực tế là, một mặt, bạn cần cung cấp Internet cho miếng sắt, mặt khác, mọi thứ đều có thể bị hỏng trong miếng sắt này, và đặc biệt là Wifi.

Đầu tiên, tôi quyết định mua một chiếc "còi" USB-Wifi giá rẻ, cắm nó vào cổng duy nhất trên BPI và quên dây đi. Để làm điều này, tôi đã mua một USB 725 TP-LINK TL-WN2.0N rẻ tiền, nhưng rất nhanh sau đó, rõ ràng là nó sẽ không cất cánh: để còi hoạt động, cần có trình điều khiển hạt nhân, tất nhiên là không có. (sau này tôi đã biên dịch trình điều khiển RTL8XXXU cần thiết, nhưng nó vẫn không thực tế). Và cáp ethernet đã phá hỏng tầm nhìn của căn phòng trong một thời gian.

Do đó, tôi đã loại bỏ được dây cáp với sự trợ giúp của Tenda MW3 (hệ thống lưới Wi-Fi): Tôi chỉ cần đặt một khối lập phương dưới bàn và kết nối BPI với cổng LAN của cái sau bằng cáp Ethernet mét. Thành công.

Wireguard, RKN, Chim

Một trong những điều tôi sử dụng Banana PI là để có quyền truy cập miễn phí vào các trang web bị RKN chặn, đặc biệt, để Telegram và các cuộc gọi đến Slack hoạt động. Các bài viết về chủ đề này đã được đề xuất trên Habré: thời gian, два, ba.

Tôi đã triển khai triển khai một giải pháp như vậy bằng Ansible: liên kết.

VPS được cho là đang chạy Ubuntu 18.04. Tôi đã kiểm tra hiệu suất trên hai máy chủ lưu trữ ở Châu Âu: Amazon và Digital Ocean.

Vì vậy, chúng tôi đã cài đặt Armbian ở trên trên R64, nó có sẵn thông qua ssh dưới tên hm-bananapi-1 và có quyền truy cập internet. Chúng tôi triển khai tuần tự các tập lệnh tự động hóa, ansible và tự chạy cài đặt trên 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

Tiếp theo, bạn cần triển khai VPN của chúng tôi tới VPS theo cách tương tự:

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

Ở đây, đối số luôn là current-vpn và bản thân tên VPS được định cấu hình trong một biến (trong trường hợp này là 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

Ồ vâng, trước tất cả các thao tác này, bạn cần tạo các bí mật (cụ thể là các khóa Wireguard) trong một thư mục ./secrets, thư mục sẽ giống như để.

Tự động hóa Ansible trong Python

Bạn có thể nhận thấy rằng thay vì định dạng YAML, các lệnh Ansible được mã hóa trong các tập lệnh Python. Để so sánh, cách kích hoạt daemon chim theo cách thông thường:

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

và làm thế nào tương tự thông qua Python:

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

Viết các lệnh Ansible bằng mã Python cho phép bạn sử dụng lại mã và nói chung, tất cả các khả năng của ngôn ngữ có mục đích chung đều mở. Ví dụ cài bird trên R64 và VPS:

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

xem mã chức năng cài đặt_bird().

Tính năng này được gọi là pybook thực hiện đây. Chưa có tài liệu về pybook, sau đó tôi sẽ sửa lỗi này.

Anh ấy nghĩ gì Thượng nguồn vào dịp này.

Giám sát. Prometheus

Tổng cộng: telegram hoạt động, Linkedin và Pornhub cũng vậy, nói chung, trải nghiệm người dùng ổn. Nhưng mọi thứ đều có thể gãy, và những miếng sắt của Trung Quốc cũng vậy.

Các bản cập nhật kernel cũng có thể rất thú vị: ví dụ: tôi muốn cập nhật kernel 5.4 => 5.6, có Wireguard sẵn sàng, không cần vá ... Nói sớm hơn làm: cẩn thận chuyển các bản vá từ 5.4 sang 5.6, hạt nhân bắt đầu, đường hầm đến VPS được ping, nhưng chim không thể kết nối với lỗi "Lỗi BGP"… "Trở lại kinh hoàng" (c) thành 5.4; chuyển sang 5.6 đã bị hoãn lại trong TODO.

Do đó, ngoài việc cài đặt bộ định tuyến và VPS, tôi đã thêm tính năng giám sát (trên x86 Ubuntu 18.04), được cài đặt trên một máy chủ riêng với các thành phần sau:

  • prometheus, alertmanager, blackbox_exporter - tất cả trong docker
  • cảnh báo được gửi đến kênh telegram bằng bot metalmatze/alertmanager-bot - cũng trong docker
  • tor cho bot, để bot có thể cảnh báo các tình huống khi có Internet nhưng điện báo vẫn không hoạt động, và bản thân bot cũng không kết nối được
  • đã áp dụng cảnh báo: NodeVPNTroubles (không ping đến VPS), BirdVPNTroubles (không có phiên Bird), AntifilterDownloadTroubles (không thể tải các địa chỉ IP bị chặn), SiteTroubles (không may là không có điện tín)
  • cảnh báo hệ thống như HostGrrowingDiskReadLatency (thẻ SD giá rẻ ngừng đọc)

Ví dụ thiết lập giám sát:

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

Auto Discovery cho prometheus được đặt thành thư mục /etc/prometheus/auto_http, một ví dụ về việc thêm máy chủ để giám sát (máy chủ không được giám sát theo mặc định):

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

CẦN LÀM: 2 nhà cung cấp, 2 BPI, chuyển đổi dự phòng anycast

Ngoài mọi thứ, tôi đã lên kế hoạch kết nối với hai nhà cung cấp để Internet tiếp tục hoạt động, ngay cả khi một nhà cung cấp gặp sự cố với mạng hoặc họ quên thanh toán Internet, v.v., và các yếu tố con người khác.

Trải nghiệm người dùng tiên tiến nhất về chủ đề multi-wan được mô tả đây cho hệ thống Mwan3 dưới Openwrt. Giải pháp này có chức năng phong phú, nhưng việc thiết lập và vận hành nói chung cho multi-wan khá rắc rối. Chỉ một ví dụ: nếu bạn truy cập một số trang web từ hai địa chỉ IP cùng một lúc, thì họ có thể không thích nó, họ sẽ ngừng hoạt động => "Internet không hoạt động."

Với kinh nghiệm này, tôi quyết định rằng ưu tiên đa mạng chưa phải là ưu tiên, mà chỉ là chuyển đổi dự phòng. Mặc dù có vẻ như trong các phiên bản linux mới nhất, mọi thứ sẽ hoạt động với một lệnh như:

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

Vì vậy, để không có điểm lỗi duy nhất, chúng tôi sử dụng 2 BPI, mỗi BPI kết nối với một nhà cung cấp, kết nối chúng lại với nhau và liên lạc với nhau bằng định tuyến động thông qua bird / OSPF.

Hơn nữa, trên mỗi địa chỉ chúng tôi công bố cùng một địa chỉ IP nếu dịch vụ khả dụng (Internet, DNS). Đó là, chúng tôi sẽ không tự đặt tuyến đường mặc định mà thông qua con chim. Giải pháp do thám đây .

Chức năng này vẫn chưa được triển khai, coronavirus ngấm ngầm đã gây rối (không phải mọi thứ đều đến từ AliExpress; một cửa hàng trực tuyến khác, Layta, hứa sẽ giao hàng sau một tuần và hơn một tháng đã trôi qua; nhà cung cấp thứ hai đã không quản lý để kéo dài cáp trước khi cách ly, chỉ đục lỗ trên tường để khoan cáp).

Làm thế nào để đặt hàng R64

Bản thân bảng trong cửa hàng chính thức TrungVoip.
Nó cũng tốt hơn để đặt hàng ngay lập tức:

  • thực phẩm + thông báo tiêu chuẩn phích cắm EU hoặc US
  • tản nhiệt: bộ tản nhiệt/quạt; bởi vì cả CPU được làm nóng và chip chuyển đổi
  • anten wifi, ví dụ

Có một sắc thái - giá giao hàng trong một thời gian đã trở nên quá cao trong cửa hàng chính thức. Người quản lý Judy Huang đảm bảo với tôi rằng không có nhầm lẫn nào và bạn có thể chọn ePacket với giá 5 đô la, nhưng tôi thấy rằng đối với Nga chỉ có EMS với giá >33 đô la. Khó chịu, nhưng không quan trọng. Hơn nữa, nếu bạn chọn bất kỳ quốc gia nào khác để giao hàng (tôi đã đi qua tất cả các châu lục), phí giao hàng sẽ là ~5$. Russophobes?.. Nhưng sau đó tôi thấy rằng đối với Pháp, giá giao hàng cũng là ~ $30, và bình tĩnh lại.

Do đó, Judy đề nghị đặt hàng nhưng không trả tiền (dấu: đặt ít hơn vào thẻ để thanh toán không tự động được thực hiện); viết thư cho cô ấy và cô ấy sẽ giảm giá vận chuyển xuống mức bình thường. Thành công.

Các vấn đề

Không phải tất cả mọi thứ hoạt động hoàn hảo chưa.

Năng suất

Ansible=Các lệnh Python được thực thi chậm, ngay cả khi không hoạt động, trong 20-30 giây; dài hơn một bậc so với trên máy tính xách tay x86. Hơn nữa, lúc đầu chúng được thực hiện khá nhanh, ~ 3 giây, sau đó chúng chậm lại rõ rệt. Có lẽ điều này là do sự nóng lên của CPU (điều tiết). Mã Go cũng đã chạy từ lâu:

# запрос метрик для прометея из 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 hoạt động, nhưng dừng trên Armbian sau khoảng một ngày, viết:

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

Chỉ khởi động lại giúp. Chúng ta cần tiến xa hơn chọn ra.

Ethernet

Ethernet hoạt động, nhưng sau ~ một ngày, các gói (DHCP) từ R64 sẽ ngừng đến.
Khởi động lại giao diện giúp:

ifdown br0; sleep 30; ifup br0

Trình điều khiển mới, kernel chưa được chấp nhận, tôi hy vọng Landen Chao của Trung Quốc hoàn thành.

Nguồn: www.habr.com

Thêm một lời nhận xét