最近我对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. 参考文档