Banana Pi R64 路由器 - Debian、Wireguard、RKN

Banana Pi 64 是一款类似于 Raspberry Pi 的单板计算机,但具有多个以太网端口,使其成为通用 Linux 分发路由器。

Banana Pi R64 路由器 - Debian、Wireguard、RKN

是的,Openwrt已经存在,但它有自己的GUI和CLI; 有 Mikrotik,但它有自己的 GUI / CLI,而 Wireguard 不能开箱即用...一般来说,我想要一个具有灵活设置的路由器,同时保留在您使用的标准 Linux 框架内每天。

在名称为 BPI、R64、单板的文章中,我指的是同一件事 - Banana Pi R64 单板本身。

图像选择。 通过eMMC下载

与他人合作时首先要掌握的技能 SBC 一般来说,特别是对于 R64,这意味着学习如何将操作系统加载到其中并能够与其交互,因为 R64 没有显示器端口(例如 HDMI)。 当一切都崩溃时 - Wifi 停止工作、以太网、蓝牙、USB 等。有一个 UART,通过它的接口,您始终可以看到出了什么问题,如果需要,还可以从控制台运行一些命令。

通过 USB-UART 到 R64 的连接算法:

  • 前往无线电零件商店获取 USB-UART 电缆(PL2303,串行至 USB)
  • 我们将一个USB端连接到电脑,另一个UART连接到R64,四分之三,如下图
  • 在计算机控制台中运行 sudo minicom

之后,大多数情况下,会出现单板控制台=成功。
你可以看到更多 这里.

Banana Pi R64 路由器 - Debian、Wireguard、RKN

接下来,最简单的方法是从SD卡加载操作系统:download by 链接 图片并上传:

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 启动。

另一种启动选项是使用 R64 中已嵌入的 8Gb 卡(称为 eMMC)。 根据wiki上的说明,我们将镜像重写到设备中
/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]

接下来,您需要将预加载器写入特殊的引导分区

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,核心是从存储库中获取的 坦率-A。 可以下载最新的图片 这里.

R64 软件部分的所有开发活动均在 论坛。 一般来说,制造商本身是为了普及Openwrt路由器,但由于来自德国的开发者Frank的活动,所有功能很快就出现在Debian内核中。 令人惊讶的是,弗兰克在每个论坛帖子中都很活跃。

工作空间组织:电线

另外,我想告诉您如何在开发/测试期间将 SBC(不仅仅是 BPI)放在桌子上,以免将以太网电缆从互联网源穿过整个房间/办公室连接到它。 事实是,一方面,你需要给这块铁提供互联网,另一方面,这块铁里的一切都可能坏掉,尤其是Wifi。

首先,我决定购买一个便宜的 USB-Wifi“哨子”,将其插入 BPI 上唯一的端口,然后忘记电线。 为了做到这一点,我购买了一个便宜的 TP-LINK TL-WN725N USB 2.0,但很快就发现它不会起飞:为了让哨子工作,需要一个内核驱动程序,当然,这个驱动程序不存在(后来我编译了必要的RTL8XXXU驱动,但还是不切实际)。 而且网线一度破坏了房间的视野。

结果,我在 Tenda MW3(Wifi 网状系统)的帮助下设法摆脱了电缆:我只需将一个立方体放在桌子下面,然后用一米以太网电缆将 BPI 连接到后者的 LAN 端口。 成功。

Wireguard、RKN、Bird

我使用 Banana PI 的目的之一是可以免费访问被 RKN 屏蔽的网站,特别是这样 Telegram 和 Slack 的呼叫都可以正常工作。 关于该主题的文章已在 Habré 上提出: 时间, , .

我使用 Ansible 实现了这样一个解决方案的部署: 链接.

VPS 应该运行 Ubuntu 18.04。 我检查了欧洲两家托管商的性能:亚马逊和 Digital Ocean。

因此,我们在 R64 上安装了上述 Armbian,可以通过 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

此处,参数始终为 current-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,目录应该是这样的 所以.

Python 中的 Ansible 自动化

您可能会注意到,Ansible 命令不是使用 YAML 格式,而是使用 Python 脚本进行编码。 作为比较,如何以通常的方式启用bird守护进程:

- 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")

使用 Python 代码编写 Ansible 命令可以让您重用代码,并且一般来说,通用语言的所有可能性都是开放的。 例如,在R64和VPS上安装bird:

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

见函数代码 安装鸟().

这个功能被称为 pybook 实施的 这里。 pybook还没有文档,那么我会纠正这个缺陷。

他怎么想 上游 这个。

监控。 普罗米修斯

Total:telegram 可以用,linkedin 和pornhub 也可以,总体来说,用户体验还可以。 但任何东西都会破碎,中国的铁块也不例外。

内核更新也可能很有趣:例如,我想更新内核 5.4 => 5.6,嗯,有开箱即用的 Wireguard,无需打补丁...说来就做:煞费苦心地将补丁从 5.4 转移到5.6,内核启动,到 VPS 的隧道已 ping 通,但 Bird 无法连接,错误“BGP 错误”…“惊恐地回滚”(c) 至 5.4; TODO 中推迟到 5.6。

因此,除了安装路由器和VPS之外,我还添加了监控(在x86 Ubuntu 18.04上),它安装在具有以下组件的单独主机上:

  • prometheus、alertmanager、blackbox_exporter - 全部在 docker 中
  • 使用 Metalmatze/alertmanager-bot 机器人将警报发送到电报频道 - 也在 docker 中
  • 为机器人提供tor,以便机器人可以在互联网可用时发出警报,但电报仍然不起作用,并且机器人本身无法连接
  • 已应用 警报:NodeVPNTroubles(无法 ping 到 VPS)、BirdVPNTroubles(无 Bird 会话)、AntifilterDownloadTroubles(无法加载被阻止的 IP 地址)、SiteTroubles(不幸的是电报不可用)
  • HostGrowingDiskReadLatency 等系统警报(廉价 SD 卡停止读取)

监控设置示例:

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

Prometheus 的 Auto Discovery 设置为 /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、任播故障转移

除了一切之外,我还计划连接到两个提供商,以便互联网能​​够继续工作,即使其中一个提供商出现网络问题,或者他们忘记支付互联网费用等等,以及其他人为因素。

描述了关于多WAN主题的最先进的用户体验 这里 适用于Openwrt下的Mwan3系统。 该方案功能丰富,但一般多WAN的设置和操作比较麻烦。 仅举一个例子:如果您同时从两个 IP 地址访问某些网站,那么他们可能不喜欢它,他们将停止工作=>“互联网无法正常工作”。

鉴于这次经验,我认为多宿主还不是优先考虑的事情,只是故障转移。 尽管看起来在最新版本的 Linux 中,一切都应该使用一个命令,例如:

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

因此,为了避免单点故障,我们采用 2 个 BPI,每个 BPI 连接到一个提供商,将它们连接在一起,并通过 Bird/OSPF 动态路由彼此之间的通信。

此外,如果服务可用(互联网、DNS),我们会在每个设备上公布相同的 IP 地址。 就是我们不会自己放下默认路由,而是通过bird。 解决方案窥探 这里 .

这个功能还没有实现,阴险的冠状病毒搞砸了(不是所有东西都来自速卖通;另一家网上商店 Layta 承诺一周内发货,一个多月过去了;第二家提供商没能延长交货期)隔离前的电缆,只能在墙上打一个洞来钻电缆)。

如何订购 R64

主板本身在官方商店 中话语音.
最好立即订购:

  • 营养 + 告知欧盟或美国插头标准
  • 散热器:散热器/风扇; 因为CPU和开关芯片都会发热
  • 无线网络天线, 例如

有一个细微差别 - 从一段时间以来,官方商店的送货价格变得不够高。 经理Judy Huang向我保证没有错误,你可以选择ePacket 5美元,但我看到俄罗斯只有EMS >33美元。 不愉快,但并不重要。 此外,如果您选择任何其他国家送货(我走遍了所有大洲),送货费用约为 5 美元。 俄罗斯恐惧症?...但后来我发现法国的运费也~30美元,就平静下来了。

结果Judy主动提出下单,但不付款(暗示:卡上少放一些钱,这样付款就不会自动完成); 写信给她,她会将运费降低到正常水平。 成功。

问题

还不是一切都完美。

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

Ansible=Python 命令执行缓慢,即使是空闲的命令,也会持续 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

免费无线网络

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)

以太网可以工作,但大约一天后,来自 R64 的数据包 (DHCP) 停止发送。
重新启动界面有助于:

ifdown br0; sleep 30; ifup br0

驱动是新的,内核还没有被接受,希望中文兰登潮 结束.

来源: habr.com

添加评论