这是本文档旧的修订版!


peyoot/pvpn是一个自建网络的工具,它可以把您在全球的嵌入式板子和服务器,个人开发电脑连成一个局域网,pvpn网关服务器作为网络的出口,能避开国家防火墙,从而无缝地操作全球计算资源和资产。为了正确编译pvpn支持的镜像,请使用dey-aio项目的方法来编译,参考:请按DEY-AIO中文说明搭建好系统开发环境。

下面介绍如何编译pvpn支持的DEY系统固件:

1. 开启内核配置选项TUN/TAP设备驱动的支持

默认地,该内核选项是关闭状态,我们需要编译一个基本的linux镜像固件(core-image-base或dey-image-qt等),此时该默认的Linux固件并不带TUN/TAP设备驱动支持。我们需要编译内核选项:

bitbake -c menuconfig virtual/kernel

在选项卡中,启用下面的选项,找到这个项Enable Device Drivers → Network device support → Universal TUN/TAP device driver support,用空格来选择,M表示编译成可加载的内核模块,*表示直接编译进内核。这里以编译成内核模块为例,保存并退出。然后执行:

bitbake virtual/kernel

编译结束后,可以检查~/dey-aio/dey4.0/workspace/<项目名>/tmp/work/<平台名>-dey-linux-gnueabi/linux-dey/<内核版本号>/build/drivers/net目录,tun.ko已经生成则表时该选项已经编译成功。 我们需要接着编译出镜像

bitbake core-image-base 或是其它SOM所支持的镜像

这样,就把支持TUN/TAP设备驱动的系统固件编译好了。

2. 编译pvpn所需的软件包 虽然我们已经编译出修改过内核配置的固件,但该固件并没有带有pvpn所需的相关软件包,我们还需要在conf/local.conf中修入项目配置,将相关的软件包加入:

默认地,peyoot/pvpn只在ubuntu系统上充分验证过,但您可以通过手工配置,或是使用指定的版本,来实现和pvpn网关服务器连接,从而接入原有的pvpn网络。

默认地,DEY系统并没有安装好pvpn所需的相关依赖包,您可以在conf/local.conf中添加所需的包

IMAGE_INSTALL:append = “ gawk unzip pvpn openvpn openvpndns stunnel”

这样,就生成了带有pvpn支持的DEY系统镜像。DEY-AIO项目整合了一个发布脚本,可以帮您迅速创建卡刷包,请到dey4.0目录下执行publish.sh脚本,根据提示选项项目,然后一路回车,卡刷包会在release目录内生成。

3. 用卡刷的方式来刷入固件 在uboot开始上电时,按任意键停在uboot界面,然后执行

run install_linux_fw_sd

点击以显示 ⇲

点击以隐藏 ⇱

如果碰到image-name不对,可以打开参考这里设置image-name

如果image-name没有设置,或是默认镜像和你编译的镜像名不一致,则可以设置image-name再进行卡刷:

setenv image-name core-image-base 或 setenv image-name dey-image-qt
saveenv

刷好固件后,进入板子的linux,在/lib/modules/<内核版本号>/kernel/drivers/net下可以看到tun.ko文件。此时lsmod命令并没有该模块,是因为模块还没有触发加载它,可以用mobprobe来测试模块的加载。

4. 配置系统时间

仅管tun/tap驱动和pvpn相关软件包已经集成在固件中,但此时开启pvpn仍有可能失败,因为TLS的握手对时间同步有较严格的要求,我们需要设置好嵌入式板子的系统时间。事实上,如果连接上互联网,DEY本身有NTP同步的功能,默认地,systemd-timesyncd服务是开启的,只是默认的NTP服务器未设置,所以板子使用默认google的NTP服务器,由于众所周知的原因,这在国内无法成功同步时间。

nano /etc/systemd/timesyncd.conf
去掉NTP注释,改为:
NTP=time.windows.com

大约一两分钟后,再检查timedatectl status,就会发现时间同步好了。

5. 开启pvpn服务

6. 禁用某个接口的DNS