前段时间搞了个很迷你的开发板树莓派Zero2W(下面简称“Pi”),还搭配了个USB Key转接板,这几天折腾了一下,用于实现一个随身的旁路由。本文记录一下关键技术点,供有同样需求的读者参考。

树莓派Zero2W

树莓派Zero2W

背景描述 #

折腾过代理的同学,对“旁路由”这个概念应该不陌生,这里主要将旁路由用作透明代理。现在相关技术已经很成熟,所以有一台小主机的情况下,搭建一个透明代理并不算困难。而本文的主要关注点在于“随身”,这就要求小主机满足以下几个特性:

1、小巧(不然不适合随身带);

2、有连接Wi-Fi功能;

3、随时可以切换网络。

这里比较麻烦的是第3点。假设我带着笔记本和小主机来到了一个新环境,知道了当地的Wi-Fi账号密码,那我怎么才能让小主机连上新Wi-Fi呢?这里的关键是小主机还没连网时,笔记本怎么连上小主机,如果有网口的情况下,通过网线连接自然可以,但带网口的主机通常不小,而且随身带网线也累赘(Macbook还需要配转接头)。

树莓派Zero2W + USB Key正好可以完美实现这个需求!它能够在作为主机运行的同时还模拟一张网卡,通过USB口连接到电脑时,既可以给Zero2W供电,又可以构建一条Zero2W到电脑的直连通道,使得我们可以不经过Wi-Fi就连接到Zero2W上去。

烧录镜像 #

事实上,这种USB直连Pi Zero的方案由来已久,比如教程《树莓派 Zero USB/以太网方式连接配置教程(macOS平台)》已经是2018年的了,但里边的配置方式已经过时,这里主要更新一下在K2的帮助下能跑通的最新方案。

首先,准备SD卡,烧录最新的Raspberry Pi OS镜像到SD卡上。现在官方出了Raspberry Pi Imager,烧录镜像变得更简单了,这里烧录镜像的时候要注意几个细节,首先是必须把Wi-Fi账号密码配置好(后面可以改,第一次配置需要用Wi-Fi),然后必须开启SSH,其余的按需调整:

填好Wi-Fi信息

填好Wi-Fi信息

开启SSH

开启SSH

建议把主机名也设置好并记住,这样后面在内网中我们就可以直接通过它来访问Pi,而不需要记IP地址。设置完成后就可以烧录镜像了,烧录结束后,把SD卡继续用读卡器插到电脑上(我的电脑是Macbook Pro,系统是macOS 15.3.1,下面都简称“Mac”),在SD卡的根目录找到config.txt文件,在末尾加一句(当前末尾是[all]):

dtoverlay=dwc2

至此,烧录镜像步骤完成。

网卡配置 #

现在我们可以将SD卡插入到Pi上,然后通过USB口将Pi插入到Mac,那么Pi就会通电启动,等到启动完成后,由于刚才已经配置了Wi-Fi,所以Pi应该已经顺利连上了网络,这时候把Mac也连接到同一个网络,我们就可以通过ssh me@pi.local来SSH上去Pi,当然,也可以在路由器处查找它的IP,通过IP来SSH。

接着我们在Pi端执行

sudo modprobe g_ether
sudo ip link set usb0 up
sudo ip addr add 169.254.7.11/16 dev usb0

执行完后通过ifconfig观察,可以发现多出了个名为usb0的网卡,并且ip设置为了169.254.7.11,这属于内网保留 IP,可以自行设置,没有什么特殊考虑也可以直接复制。

稍等一会后,我们转到Mac端“设置”-“网络”,正常情况下会多出一个RNDIS/Ethernet Gadget服务,并已经自动连接上,点击“详细信息”可以看到通过DHCP方式分配了IP,我们将它改为手动模式,IP为169.254.7.1,路由留空。这个IP原则上也可以自定义,但没什么特殊考虑也是直接复制就好。

再次转到Pi端,执行ping 169.254.7.1,能ping通,说明Pi和Mac已经通过USB口组了一个小型局域网,Mac的IP是169.254.7.1,Pi的IP是169.254.7.11,在Mac端通过ssh me@169.254.7.11也可以连接到Pi。

启动服务 #

不过现在的网卡配置都是一次性的,重启就没了,我们需要将它配置成开机自动启动的服务,这样以后才能在没有网络的情况下,还能通过USB口以及ssh me@169.254.7.11连接到Pi,这就是我们的最终目的。

在Pi端,新建/usr/local/bin/usb0.sh

#!/bin/bash
sudo modprobe g_ether
sudo ip link set usb0 up
sudo ip addr add 169.254.7.11/16 dev usb0
nohup ping -c 100 169.254.7.1 > /var/log/usb0_ping.log 2>&1 &
exit 0

然后sudo chmod +x /usr/local/bin/usb0.sh,再新建/etc/systemd/system/usb0.service,写入

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usb0.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

最后执行

sudo systemctl daemon-reload
sudo systemctl enable usb0.service

就可以了。以后将Pi插入Mac,等开机完成后,就可以通过`ssh me@169.254.7.11`连接上去,如果有需要通过sudo raspi-config可以连接/切换Wi-Fi。

文章小结 #

至于剩下的搭建旁路由/透明代理的步骤,就请大家自行折腾了。本文主要是帮助大家把“随身”这一步跑起来,剩下的看自己发挥了。

转载到请包括本文地址:https://spaces.ac.cn/archives/11206

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (Aug. 02, 2025). 《基于树莓派Zero2W搭建一个随身旁路由 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/11206

@online{kexuefm-11206,
        title={基于树莓派Zero2W搭建一个随身旁路由},
        author={苏剑林},
        year={2025},
        month={Aug},
        url={\url{https://spaces.ac.cn/archives/11206}},
}