基于 OrangePi 3 LTS (香橙派 开源单板计算机)搭建个人云
最近我对IPv6进行了研究,目前已经实现了两个前置条件。第一个是个人宽带用户可以拥有IPv6公网IP,第二个是移动4/5G网络可以拥有IPv6公网IP。由于这些条件的实现,现在搭建一个随时可访问、管理的个人云已经成为了可能。因此,我开始使用Orange Pi来搭建我的个人云。
1. 设置宽带获取 IPV6 地址#
- 设置光猫为桥接
- 设置入口路由器开启 IPV6 功能,我的路由器是 ASUS AC68U,参考 华硕ac68u 畅游 IPV6 设置成功
2. Orange Pi#
- 为什么不是 Raspberry Pi (树莓派)
- Raspberry Pi 4B 现在的价格近千元人民币,而 OrangePi 3 LTS 不到 300 元人民币
- OrangePi 3 LTS 对于个人云性能已经足够了
- 由于 Orange Pi 默认的操作系统为 Android,这里需要,安装 Debain 操作系统,具体需要参考 Orange Pi 的官方文档。值得注意的是 OrangePi 3 LTS 自带 8GB eMMC 存储,建议将操作系统安装的此位置。官网文档并没有说明具体的步骤,其实际命令为
sudo nand-sata-install
- 推荐在路由器中设置绑定固定的 IPV4 地址到 Orange Pi 的 MAC 地址,方便在内网连接管理
- 置入口路由器开启开启 IPV6 防火墙功能(SSH 等服务在公网裸奔的安全风险不小),开放 8022 (远程 SSH)端口访问
- 修改 orangepi、root 用户密码、SSH 默认端口(假设我本文中设定为 8022)、关闭 SSH 密码访问,仅通过密钥访问
3. 域名与 DDNS#
由于运营商分配的 IPV6 地址会变化,建议申请一个域名,并实时解析 AAAA 记录至域名,这样不在家访问个人云时,无需获悉 IPV6 地址是多少,仅需知道域名就可以了。
- 在腾讯云 DNSPod申请一个域名,当然可以选择其他商家。我选择了 xyz 域名,一次续费了 8 年好像是 300 人民币。此文中,假设我申请的域名为
example.xyz
,解析至 Orange Pi 的 - 在
账号账号中心 -> API 密钥 -> DNSPod Token
中创建并保存密钥 - 借助开源脚本 rehiy/dnspod-shell 设置 DDNS,下面为我个人的安装方法,仅供参考: 执行
1
2
3
4wget -O https://raw.githubusercontent.com/rehiy/dnspod-shell/f6a7b7df7eb1db859515398695c8000970221f10/ardnspod
echo 'arToken="[腾讯云 DNSPod Token]"' >> ardnspod
echo 'arDdnsCheck "example.xyz" "orangepi" 6' >> ardnspod
chmod +x ./ardnspod./ardnspod
应该可以得到如下输出:说明已经解析成功,接下来,添加一条 crontab 记录用于每 15 分钟执行该脚本:1
2
3
4
5
6
7
8
9
10orangepi@orangepi3-lts:~/ddns$ ./ardnspod
=== Check orangepi.example.xyz ===
Fetching Host Ip
> Host Ip: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
> Record Type: AAAA
Fetching RecordId
> Record Id: 1111111111
Updating Record value
> arDdnsUpdate - success: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
2001:0db8:85a3:0000:0000:8a2e:0370:73341
*/15 * * * * /home/orangepi/ddns/ardnspod
- 可以用
dig +short AAAA orangepi.example.xyz
命令来验证解析是否生效,此命令会查询远程 DNS Server
4. 挂载移动硬盘#
Orange Pi 仅支持使用 USB 接口连接硬盘,但是也够了
- 将移动硬盘插入 Orange Pi USB 3.0 接口,使用
lsblk
来查看,假设我们的磁盘为:/dev/sda
- 格式化移动盘为 ext4 格式:
sudo mkfs.ext4 /dev/sda
- 创建一个目录来挂载移动硬盘:
mkdir ~/usb
- 使用以下命令来找到移动硬盘的 UUID:
sudo blkid
- 打开 /etc/fstab 文件并添加以下行:
UUID=<移动硬盘 UUID> /mnt/external ext4 defaults 0 2
,其中,<移动硬盘 UUID> 为第 5 步中找到的 UUID。 - 重启系统,移动硬盘应该会自动挂载到
/home/orangepi/usb
目录下。可以使用df -h
下`命令来确认挂载是否成功:
5. 申请 SSL 证书#
5.1. 为什么需要 SSL 证书#
- 加密通信:SSL证书可以加密数据传输,确保敏感数据不会被窃取或篡改,保证数据的机密性和完整性
- 自签名证书不被主流网络请求工具(如浏览器)信任,会有各种各样的麻烦。而 Let’s Encrypt 的证书是免费提供的,在我们有域名的情况下,申请免费证书是最好的选择。
5.2. 申请 Let’s Encrypt 证书#
Let’s Encrypt 提供三种认证方式,HTTP、DNS、TLS-ALPN。其中第 1、3 种需要我们对外开放 80/443 端口,在中国大陆这个条件不具备,故采用方法 2。因为我的域名是在腾讯云 DNSPod 申请的,其他服务商的方法应该是大同小异。另外 Let’s Encrypt 已经支持申请通配符证书了。
- 安装 certbot(申请工具):
sudo apt install certbot
- 安装 certbot-dns-dnspod:
sudo pip3 install git+https://github.com/euclidr/certbot-dns-dnspod.git
- 编写配置文件
~/certbot-dns-dnspod/dnspod_credentials.ini
1
2
3certbot_dns_dnspod:dns_dnspod_api_token = "[腾讯云 DNSPod Token]"
certbot_dns_dnspod:dns_dnspod_dns_ttl = 600
certbot_dns_dnspod:dns_dnspod_contact_email = '[email]' - 执行 证书被存放在
1
2sudo chown -R orangepi:orangepi /var/log/letsencrypt/ /etc/letsencrypt /var/lib/letsencrypt
certbot certonly -a certbot-dns-dnspod:dns-dnspod --certbot-dns-dnspod:dns-dnspod-credentials ./dnspod_credentials.ini -d *.example.xyz`,/etc/letsencrypt/live/example.xyz
目录 - 因为证书的有效期是 90 天,这里我们设置 root 的 crontab 来每个月 15 日更新证书
1
37 4 15 */1 * certbot renew --cert-name example.xyz
6. 安装配置 Aria2#
Aria2 是一个开源下载器,支持HTTP、HTTPS、FTP、SFTP、BitTorrent、MetalinkA 协议下载。AriaNg 是一个让 Aria2 更容易使用的现代 Web 前端,这里用 AriaNg 作为 UI。
需要防火墙开启 6800 51413 端口
- 安装 Aria2:
sudo apt install aria2
- 创建下载文件保存目录:
mkdir /home/orangepi/usb/Downloads
- 编辑配置文件:
~/.aria2/aria2.conf
,注意修改 RPC 密码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ##
## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释 ##
## 文件保存相关 ##
# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
dir=/home/orangepi/usb/Downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
#disk-cache=32M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=trunc
# 断点续传
continue=true
## 下载连接相关 ##
# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=10
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=5
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
#split=5
# 整体下载速度限制, 运行时可修改, 默认:0
max-overall-download-limit=10M
# 单个任务下载速度限制, 默认:0
max-download-limit=5M
# 整体上传速度限制, 运行时可修改, 默认:0
max-overall-upload-limit=1M
# 单个任务上传速度限制, 默认:0
max-upload-limit=512k
# 禁用IPv6, 默认:false
#disable-ipv6=true
# 连接超时时间, 默认:60
#timeout=60
# 最大重试次数, 设置为0表示不限制重试次数, 默认:5
max-tries=0
# 设置重试等待的秒数, 默认:0
retry-wait=10
## 进度保存相关 ##
# 从会话文件中读取下载任务
input-file=/home/orangepi/.aria2/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/home/orangepi/.aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60
## RPC相关设置 ##
# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
#event-poll=select
# RPC监听端口, 端口被占用时可以修改, 默认:6800
#rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
rpc-secret=123456
#rpc-user=<USER>
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>
# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
rpc-secure=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件,
# 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥
#rpc-certificate=/path/pk.crt
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件
#rpc-private-key=/path/pk.key
## BT/PT下载相关 ##
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
#follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413
# 单个种子最大连接数, 默认:55
#bt-max-peers=55
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用
enable-dht6=true
# DHT网络监听端口, 默认:6881-6999
dht-listen-port=51413
# 本地节点查找, PT需要禁用, 默认:false
bt-enable-lpd=true
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=false
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
peer-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=0
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# BT校验相关, 默认:true
#bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true - 启动 Aria2:
aria2c --conf-path=/home/orangepi/.aria2/aria2.conf --rpc-private-key=/etc/letsencrypt/live/example.xyz/privkey.pem --rpc-certificate=/etc/letsencrypt/live/example.xyz/cert.pem
- 打开 http://ariang.mayswind.net/latest/,点击 AriaNg 设置,修改如下配置,如果没问题可以连接成功
- Aria2 RPC 地址:
orangepi.example.xyz
- Aria2 RPC 协议:
Https
- Aria2 RPC 密钥: 123456
- Aria2 RPC 地址:
- 停止 Aria2,设置 Aria2 开机启动
- 创建文件
/etc/systemd/system/aria2.service
1
2
3
4
5
6
7
8
9
10
11
12
13[Unit]
Description=Aria2 Download Manager
After=network.target
[Service]
Type=simple
User=orangepi
Group=orangepi
ExecStart=aria2c --conf-path=/home/orangepi/.aria2/aria2.conf --rpc-private-key=/etc/letsencrypt/live/example.xyz/privkey.pem --rpc-certificate=/etc/letsencrypt/live/example.xyz/cert.pem
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target - 启动服务:
sudo systemctl start aria2
- 设置开机启动:
sudo systemctl enable aria2
- 创建文件
8. 为 Aria2 更新 BTTracker 列表#
BTTracker 列表是一种用于 BitTorrent 下载的服务器列表,它可以帮助 BT 下载更快。更新 BTTracker 列表的原因是因为 Tracker 服务器经常失效,需要经常维护这份列表。有人会维护全网热门 BitTorrent Tracker 列表项目,每天自动获取热门 Tracker 列表项目,去重复后制作成一个 Tracker 列表合集,这样就不需要去一个个添加 Tracker 到你的BT软件里了。这里使用 harvey520 提供的列表。
动态为 Aria2 设置 BTTracker 列表需要通过 HTTP API
- 编写脚本
~/update_bt_tracker.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20ARIA2_DOMAIN='orangepi.example.xyz'
ARIA2_URL="https://${ARIA2_DOMAIN}:6800/jsonrpc"
TRACKER_URL='https://gitee.com/harvey520/www.yaozuopan.top/raw/master/blacklist.txt'
token='123456'
list=$(curl -s $TRACKER_URL)
url_list=$(echo $list | sed 's/[ ][ ]*/,/g')
uuid=$(od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}')
json='{
"jsonrpc": "2.0",
"method": "aria2.changeGlobalOption",
"id": "'$uuid'",
"params": [
"token:'$token'",
{
"bt-tracker": "'$url_list'"
}
]
}'
curl "$ARIA2_URL" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "$json" --resolve "${ARIA2_DOMAIN}:6800:127.0.0.1" - 执行脚本,顺利的话可以看到类似
{"id":"18f1ca31-90cc-b55b-cdd6-2f44a9274364","jsonrpc":"2.0","result":"OK"}
的输出。在 AriaNG -> Aria2 设置 -> BitTorrent 设置里,可以看到 BT 服务器地址不为空。 - 设置 crontab 每天自动更新
1
0 9 * * * /home/orangepi/update_bt_tracker.sh
8. 安装配置 Samba#
Smba 提供 SMB 协议文件传输,它有一个更大众的名字叫 Windows 文件共享。强烈建议不要开放 SMB 的 445 端口,近几年流行的勒索病毒都是拿 SMB 协议做突破口的。
- 安装:
sudo apt install samba
- 编辑配置文件,在尾部添加如下内容
1
2
3
4
5
6
7[Volumes]
comment = Volumes
path = /home/orangepi/usb
browseable = yes
writable = yes
available = yes
valid users = orangepi - 启动和设置开机启动
1
2sudo systemctl start smbd
sudo systemctl enalbe smbd - 验证
- 在 Android TV 上观看内容
- 当贝播放器
- Kodi
9. 参考文档#
- 华硕ac68u 畅游 IPV6: https://www.jianshu.com/p/38a6212c7e7f
- How to install Linux on the eMMC of an Orange Pi 3 LTS:https://jumptuck.com/blog/2023-02-13-install-linux-orange-pi-3-lts-emmc/
- rehiy/dnspod-shell: https://github.com/rehiy/dnspod-shell
- Dynamic DNS: https://en.wikipedia.org/wiki/Dynamic_DNS
- Let’s Encrypt: https://letsencrypt.org/
- Catboot: https://certbot.eff.org/
- euclidr/certbot-dns-dnspod: https://github.com/euclidr/certbot-dns-dnspod
- lets encrypt - How to renew only one domain with certbot? - Stack Overflow: https://stackoverflow.com/questions/42591165/how-to-renew-only-one-domain-with-certbot
- How I run Certbot (as non-root and automated) – Xyrillian Thoughts: https://xyrillian.de/thoughts/posts/how-i-run-certbot.html
- AriaNg: http://ariang.mayswind.net/
- 中国可用的 BT Tracker 服务器列表,每24小时自动更新 - 小小编程: https://www.yaozuopan.top/index.php/archives/1014/
- 【Answers 分享】如何创建一个新的网络位置 - Microsoft Community: https://answers.microsoft.com/zh-hans/windows/forum/all/answers/bf237a67-6a1e-4773-93c4-4e4a67044fea
- Connecting to SMB shares with Mac OS X - College of Agriculture IT | Montana State University: https://ag.montana.edu/it/support/smb-macs.html