部署网心云——利用闲置宽带赚钱

我大约是从2020年开始接触PCDN,当时在我的小出租屋里面,通过Windows Hyper V部署了一个网心云,本就抱着试试看的态度,没想到收益竟意外的不错,从此就踏上了PCDN赚钱之路。在此也总结一下以往的经验。

大前提

PCDN的本质就是利用闲置的带宽以及硬盘资源,帮大公司缓存内容,从而加速其用户加载资源的速度。比如哔哩哔哩,当用户播放视频的时候,有可能并不从哔哩哔哩的服务器加载,而是从我们的PCDN设备直接加载,一方面节省了公司的带宽,另一方面,由于我们的设备可能距离用户更近,从而也提高了加载速度。

若要玩转PCDN业务,我们需要有3个大前提:

闲置的计算机

可以是笔记本,台式机,甚至是树莓派,电视盒子。

闲置的硬盘

由于需要缓存内容,因此需要较大容量的硬盘。

合适的宽带

PCDN对于宽带的要求较高,一方面,上传速度要尽可能快,另一方面,要尽可能提供从外网访问内网的途径。

对于第一点,由于国内的民用宽带大多为非对等宽带,上传速度非常受限,一般从10Mbps到100Mbps左右,可以使用speedtest进行测速,如果速度低于10Mbps,部署PCDN的意义就不大了。

对于第二点,如果要做到外网设备访问内网设备,一般有3种途径来实现:

  1. 公网IP:PCDN设备拨号后直接获取公网IP。
  2. 映射公网IP:光猫、路由器等拨号,且PCDN设备接在开启了获取了公网IP且开启了UPnP的设备下。
  3. 全锥型NAT:需要PCDN设备主动访问公网设备,由公网服务器记录我们的真实IP及端口,并将此信息同步给客户端,实现外网IP+端口到内网设备的访问,也就是我们常说的UDP打洞。

如果我们的网络无法满足以上条件,也没有必要部署PCDN设备。

部署模式

网心云主要提供了3种模式:嵌入式设备、X86、docker。

官网下载地址

嵌入式设备

网心云称为三方盒子,主要包括以下几种:

  1. 斐讯N1盒子
  2. WJY盒子
  3. 树莓派3B
  4. 树莓派4B

其安装方式根据设备不同而不同,但基本上都是直接将带分区的系统镜像写入Flash当中。

X86

基于X86平台的系统包括以下几种:

  1. 基于Hyper-V的虚拟化镜像
  2. 基于KVM的虚拟化镜像
  3. 基于VMWare的虚拟化镜像
  4. 基于群晖系统的虚拟化镜像(KVM)
  5. ISO安装包(基于CentOS7)

X86平台与我们平时接触的Windows和Linux系统相似,安装过程也极为类似。相对于嵌入式设备,X86平台的上限更高,适合大带宽的玩家,当然,其占用的系统资源也是最大的。普通的家用带宽很可能是回不了本的。

Docker

这是我目前最喜欢的一种部署模式,因为PCDN本质上就是一套用户态的应用程序,为了几个应用程序而安装整个系统,会造成大量资源浪费。而使用Docker就可以兼具功能和资源消耗。

虽然这种模式非常适合小带宽玩家,但是官方似乎并没有特别宣传此种方式,甚至在官网都找不到特别详尽完整的教程,因此本文着重对此种方式进行描述。

安装Docker

我们可以直接按照Docker官方文档来安装:

下载网心云docker镜像

网心云Docker Hub地址

1
docker pull onething1/wxedge

启动镜像

这里分为两种情况:

  1. 使用host网络。配置简单,但是只能部署一个container,且会影响host网络,延迟较大。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker run -d \
    --name=wxedge \
    --restart=always \
    --privileged \
    --net=host \
    --tmpfs /run \
    --tmpfs /tmp \
    -v 磁盘路径:/storage:rw \
    onething1/wxedge
  2. 使用macvlan网络,配置复杂,但不会影响host网络,隔离性更好,延迟也低一些。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 创建macvlan,假设网关是10.0.0.1
    docker network create -d macvlan \
    --subnet=10.0.0.0/24 \
    --gateway=10.0.0.1 \
    -o parent=enp3s0 \
    macvlan0

    # 创建resolv.conf文件,否则会使用docker默认的DNS服务器,造成网络识别错误
    sudo bash -c "echo nameserver 10.0.0.1 > 磁盘路径/resolv.conf"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker run -d \
    --name=wxedge \
    --restart=always \
    --privileged \
    --net=macvlan0 \
    --ip=10.0.0.100 \
    --tmpfs /run \
    --tmpfs /tmp \
    -v 磁盘路径:/storage:rw \
    -v 磁盘路径/resolv.conf:/etc/resolv.conf \
    onething1/wxedge

部署完成后,就可以通过http://10.0.0.100:18888访问了。

使用此种方式还有一个隐形大坑,container会向overlayfs写入大量数据,造成根目录所在的分区快速减少,如果你的系统分区不大,建议将docker目录迁移到其他分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 停止服务
sudo systemctl stop docker.service
sudo systemctl stop docker.socket

# 修改systemd服务
sudo vim /lib/systemd/system/docker.service
<<<
ExecStart=/usr/bin/dockerd -g /new/path/docker -H fd://
>>>

# 迁移docker目录
sudo mkdir -p /new/path/docker
sudo rsync -aqxP /var/lib/docker/ /new/path/docker

# 重启docker
sudo systemctl daemon-reload
sudo systemctl start docker

参考

Change Docker root directory /var/lib/docker to another location

网络类型、UPnP、DMZ的粗浅解释