我有一块闲置了好几年的Orange Pi Zero开发板。
一直打算拿它做点什么,让它发光发热。但是我本身主要方向是软件相关,硬件相关只是纯业余爱好,因此一直闲置。直到前几天需要频繁通过wireguard访问家里的机器,突发奇想:首先我的Orange Pi Zero开发板是支持otg功能的,如果把它模拟成类似USB网卡的东西,给开发板接上网络,让开发板中转wireguard流量,这样可以方便PC主机接入wg虚拟网络,同时由于不用在主机上安装客户端,也避免了私钥泄露的风险。
graph TD
PC --> Pi
Pi -->|wireguard| wglan[wireguard vLAN]
Pi --> Internet
启用g_ether
为了使用g_ether来模拟USB网卡,需要在启动时给内核传递参数。由于我的开发板刷了armbian,它支持在/boot/armbianEnv.txt配置extraargs来给内核传递参数
1 | |
重启,使用lsmod | grep g_ether看是否开启了对应的内核模块。
1 | |
- 执行
ip -br a查看网络接口,此时应该有一个名为usb0的接口DOWN了。 - 使用
ip addr add 10.42.10.1/24 dev usb0给它分配地址。 - 执行
ip link set usb0 up启用它。 - 执行
ip -br a | grep usb0确保usb0接口UP。
和ChatGPT交流说使用g_ether是个老方法,等以后有时间试试它说的更现代的USB gadget configured through configfs的方式。
配置流量转发
这里我使用nftable管理规则。此外和普通的配置流量转发的配置方式别无二致。
1 | |
其中end0为以太网网络接口,usb0为使用g_ether产生的USB网络接口。
配置usb0接口自启动
由于系统使用systemd,所以为了修改网络接口的启动配置就去检查目录/etc/systemd/network/,结果发现了一个00-armbian.network.readme文件:
1 | |
它提示我去/etc/netplan/编辑网络配置。所以我创建了一个/etc/netplan/10-usb0.yaml文件:
1 | |
重启后检查ip a,应该发现usb0接口已经UP且分配了IP地址。
可以将这个开发板和Linux设备通过支持otg的那个USB接口(我这里是平常供电用的接口)相连,并手动分配接口的IP地址,此时已经可以连通外部网络了。
但是目前连接Windows设备会被识别为COM接口,后文会提到如何解决。
但是手动分配太麻烦了,我们需要实现DHCP服务来让主机连接开发板时可以被自动分配IP地址等信息。
因此先安装dnsmasq:apt install dnsmasq。然后在/etc/dnsmasq.d/usb0.conf写下配置文件:
1 | |
接下来配置自启动并启动服务systemctl enable --now dnsmasq。此时应该可以正常使用了。
在开发板中配置wireguard
此处配置wireguard的方式并不特殊,此处仅做简要描述:
apt install wireguard wireguard-tools- 填写配置
wg-quick up wg0测试wg-quick down wg0关闭并systemctl enable --now wg-quick@wg0.service配置自启动并启动服务- ping位于wg虚拟网络中的地址进行测试
现在wg网络已在开发板上可用,在ip a中也可以看到一个名为wg0的网络接口,访问wg虚拟网络的流量都会经由它出去。
因此接下来我们需要配置将来自主机的流量转发到wg虚拟网络中。
我们需要在原来的nftable规则上继续编写规则:
1 | |
现在将开发板OTG USB接口连接到一个Linux设备上,同时为开发板连接网线,就可以直接访问wg虚拟网络了。
在Windows上使用
经过测试发现这个模拟出来的USB网卡似乎无法被Windows设备正常识别为网络接口,在设备管理器中仍然显示为COM口。
经过翻找发现来自sipeed的文档安装 RNDIS 驱动有解释:
在 Windows7 及其以上的操作系统中,均已经内置了 RNDIS,但是如果不进行一些特殊操作的话,电脑一般是识别不到相关符合 RNDIS 设备的。
跟着它的教程进行后即可在Windows设备上正常使用。
拓展:为开发板打印外壳
我买了3D打印机,花了大概一周时间去学习autodesk fusion和参数化模型设计,然后给它打了一个壳子。
