最近我对IPv6进行了研究,目前已经实现了两个前置条件。第一个是个人宽带用户可以拥有IPv6公网IP,第二个是移动4/5G网络可以拥有IPv6公网IP。由于这些条件的实现,现在搭建一个随时可访问、管理的个人云已经成为了可能。因此,我开始使用Orange Pi来搭建我的个人云。

1. 设置宽带获取 IPV6 地址#

  1. 设置光猫为桥接
  2. 设置入口路由器开启 IPV6 功能,我的路由器是 ASUS AC68U,参考 华硕ac68u 畅游 IPV6 设置成功

2. Orange Pi#

  1. 为什么不是 Raspberry Pi (树莓派)
    • Raspberry Pi 4B 现在的价格近千元人民币,而 OrangePi 3 LTS 不到 300 元人民币
    • OrangePi 3 LTS 对于个人云性能已经足够了
  2. 由于 Orange Pi 默认的操作系统为 Android,这里需要,安装 Debain 操作系统,具体需要参考 Orange Pi 的官方文档。值得注意的是 OrangePi 3 LTS 自带 8GB eMMC 存储,建议将操作系统安装的此位置。官网文档并没有说明具体的步骤,其实际命令为 sudo nand-sata-install
  3. 推荐在路由器中设置绑定固定的 IPV4 地址到 Orange Pi 的 MAC 地址,方便在内网连接管理
  4. 置入口路由器开启开启 IPV6 防火墙功能(SSH 等服务在公网裸奔的安全风险不小),开放 8022 (远程 SSH)端口访问
  5. 修改 orangepi、root 用户密码、SSH 默认端口(假设我本文中设定为 8022)、关闭 SSH 密码访问,仅通过密钥访问

3. 域名与 DDNS#

由于运营商分配的 IPV6 地址会变化,建议申请一个域名,并实时解析 AAAA 记录至域名,这样不在家访问个人云时,无需获悉 IPV6 地址是多少,仅需知道域名就可以了。

  1. 腾讯云 DNSPod申请一个域名,当然可以选择其他商家。我选择了 xyz 域名,一次续费了 8 年好像是 300 人民币。此文中,假设我申请的域名为 example.xyz,解析至 Orange Pi 的
  2. 账号账号中心 -> API 密钥 -> DNSPod Token 中创建并保存密钥
  3. 借助开源脚本 rehiy/dnspod-shell 设置 DDNS,下面为我个人的安装方法,仅供参考:
    1
    2
    3
    4
    wget -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 应该可以得到如下输出:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    orangepi@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:7334
    说明已经解析成功,接下来,添加一条 crontab 记录用于每 15 分钟执行该脚本:
    1
    */15 * * * * /home/orangepi/ddns/ardnspod
  4. 可以用 dig +short AAAA orangepi.example.xyz 命令来验证解析是否生效,此命令会查询远程 DNS Server

4. 挂载移动硬盘#

Orange Pi 仅支持使用 USB 接口连接硬盘,但是也够了

  1. 将移动硬盘插入 Orange Pi USB 3.0 接口,使用 lsblk 来查看,假设我们的磁盘为:/dev/sda
  2. 格式化移动盘为 ext4 格式:sudo mkfs.ext4 /dev/sda
  3. 创建一个目录来挂载移动硬盘: mkdir ~/usb
  4. 使用以下命令来找到移动硬盘的 UUID: sudo blkid
  5. 打开 /etc/fstab 文件并添加以下行:UUID=<移动硬盘 UUID> /mnt/external ext4 defaults 0 2,其中,<移动硬盘 UUID> 为第 5 步中找到的 UUID。
  6. 重启系统,移动硬盘应该会自动挂载到 /home/orangepi/usb 目录下。可以使用 df -h 下`命令来确认挂载是否成功:

5. 申请 SSL 证书#

5.1. 为什么需要 SSL 证书#

  1. 加密通信:SSL证书可以加密数据传输,确保敏感数据不会被窃取或篡改,保证数据的机密性和完整性
  2. 自签名证书不被主流网络请求工具(如浏览器)信任,会有各种各样的麻烦。而 Let’s Encrypt 的证书是免费提供的,在我们有域名的情况下,申请免费证书是最好的选择。

5.2. 申请 Let’s Encrypt 证书#

Let’s Encrypt 提供三种认证方式,HTTP、DNS、TLS-ALPN。其中第 1、3 种需要我们对外开放 80/443 端口,在中国大陆这个条件不具备,故采用方法 2。因为我的域名是在腾讯云 DNSPod 申请的,其他服务商的方法应该是大同小异。另外 Let’s Encrypt 已经支持申请通配符证书了。

  1. 安装 certbot(申请工具):sudo apt install certbot
  2. 安装 certbot-dns-dnspod:sudo pip3 install git+https://github.com/euclidr/certbot-dns-dnspod.git
  3. 编写配置文件 ~/certbot-dns-dnspod/dnspod_credentials.ini
    1
    2
    3
    certbot_dns_dnspod:dns_dnspod_api_token = "[腾讯云 DNSPod Token]"
    certbot_dns_dnspod:dns_dnspod_dns_ttl = 600
    certbot_dns_dnspod:dns_dnspod_contact_email = '[email]'
  4. 执行
    1
    2
    sudo 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 目录
  5. 因为证书的有效期是 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 端口

  1. 安装 Aria2: sudo apt install aria2
  2. 创建下载文件保存目录: mkdir /home/orangepi/usb/Downloads
  3. 编辑配置文件:~/.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
  4. 启动 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
  5. 打开 http://ariang.mayswind.net/latest/,点击 AriaNg 设置,修改如下配置,如果没问题可以连接成功
    • Aria2 RPC 地址: orangepi.example.xyz
    • Aria2 RPC 协议: Https
    • Aria2 RPC 密钥: 123456
  6. 停止 Aria2,设置 Aria2 开机启动
    1. 创建文件 /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
    2. 启动服务: sudo systemctl start aria2
    3. 设置开机启动: sudo systemctl enable aria2

8. 为 Aria2 更新 BTTracker 列表#

BTTracker 列表是一种用于 BitTorrent 下载的服务器列表,它可以帮助 BT 下载更快。更新 BTTracker 列表的原因是因为 Tracker 服务器经常失效,需要经常维护这份列表。有人会维护全网热门 BitTorrent Tracker 列表项目,每天自动获取热门 Tracker 列表项目,去重复后制作成一个 Tracker 列表合集,这样就不需要去一个个添加 Tracker 到你的BT软件里了。这里使用 harvey520 提供的列表。

动态为 Aria2 设置 BTTracker 列表需要通过 HTTP API

  1. 编写脚本 ~/update_bt_tracker.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ARIA2_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"
  2. 执行脚本,顺利的话可以看到类似 {"id":"18f1ca31-90cc-b55b-cdd6-2f44a9274364","jsonrpc":"2.0","result":"OK"}的输出。在 AriaNG -> Aria2 设置 -> BitTorrent 设置里,可以看到 BT 服务器地址不为空。
  3. 设置 crontab 每天自动更新
    1
    0 9 * * *	/home/orangepi/update_bt_tracker.sh

8. 安装配置 Samba#

Smba 提供 SMB 协议文件传输,它有一个更大众的名字叫 Windows 文件共享。强烈建议不要开放 SMB 的 445 端口,近几年流行的勒索病毒都是拿 SMB 协议做突破口的。

  1. 安装:sudo apt install samba
  2. 编辑配置文件,在尾部添加如下内容
    1
    2
    3
    4
    5
    6
    7
    [Volumes]
    comment = Volumes
    path = /home/orangepi/usb
    browseable = yes
    writable = yes
    available = yes
    valid users = orangepi
  3. 启动和设置开机启动
    1
    2
    sudo systemctl start smbd
    sudo systemctl enalbe smbd
  4. 验证
  5. 在 Android TV 上观看内容
    • 当贝播放器
    • Kodi

9. 参考文档#