通过 Docker 在闲置笔记本上运行 OpenWRT 作为旁路由,充分利用旧设备,提升家庭网络的可定制性和功能性。本文详细介绍了从零开始配置 Docker 环境、创建 macvlan 网络、运行 OpenWRT 容器,并进行网络配置的全过程。无论是去广告、科学上网,还是流量监控和 VPN 服务,都可以通过旁路由轻松实现。适合有一定 Linux 基础的用户,帮助你将闲置设备变身为强大的网络工具。
过年回家总想着折腾点什么,于是就瞄上了早已退休的19年拯救者。相信很多家庭都有闲置的笔记本电脑,性能尚可却一直闲置。如果希望充分利用这些设备,可以考虑将其改造成“旁路由”(又称“透明网关”或“旁挂路由”),将某些网络功能(如去广告、流量监控、VPN 等)卸载到这台机器上进行处理。但是,这么强大的一个X86平台,重新刷一个Openwrt系统太大材小用了,已经装了Ubuntu的它还可以有更多用处(All in BOOM)。如果不想大动硬件也不想重装系统,Docker 技术可以派上用场。通过在闲置笔记本上运行一个 OpenWRT 容器,就可以以旁路由的方式接管或旁路处理局域网的流量。
本文将介绍从零开始完成一套基本环境配置,包括:
确保 Docker 可以正常启动和拉取镜像,如果不熟悉 Docker 的安装,可以参照 Docker 官方文档 或对应发行版社区的文档。如在大陆地区,可参照此处配置镜像。
macvlan
网络模式。在 Linux 上,首先用 ifconfig
或 ip addr
命令查看网卡信息。以下示例输出里,重点关注无线网卡 wlp0s20f3
、有线网卡 enp7s0
以及它们的 IP 地址:
|
|
|
|
当然这只是我的设备情况,每个设备的网卡名称几乎都是不同的,需要自主根据IP地址、流量信息去确定,但大多数情况下,以太网卡的名称会以“e”开头,比如“eth0”或是我的“enp***“,后文中所有的代码中,记得把enp7s0
替换成你的设备名称,你可以在此博客页面代码框的右上角点击编辑按钮后直接修改。
如果希望在有线网卡上使用 macvlan,一般会选择 enp7s0
作为 macvlan
的父接口(-o parent=enp7s0
),因为无线网卡与 macvlan 配合往往有兼容性问题。
在少数情况下,如果只有无线网卡,可能需要通过其他方案来旁路,比如 TAP/TUN 方式或者路由策略转发等,macvlan 对 Wi-Fi 不够友好。
为了确保网卡可以截获所有流量进行分析或桥接,需要设置网卡的混杂模式。可通过以下命令启用:
|
|
或者对于无线网卡,如果想在 wlp0s20f3
上开启混杂模式,也可执行:
|
|
注意:混杂模式一般只在需要检测或中转特定流量时才必需,不然可以不设。
macvlan
可以让容器拥有与物理机不同的 MAC 地址以及内网 IP,从而像独立设备一样接入到局域网中。
192.168.10.0/24
,网关是 192.168.10.1
(主路由器或管理网关,可以在当前联网的设备上查看详细信息)。macvlan
驱动创建一个名为 macnet
的网络,父接口是 enp7s0
(以太网卡),具体命令如下:
|
|
上述命令解析:
-d macvlan
指定驱动类型为 macvlan。--subnet=192.168.10.0/24
指定容器网络的子网。--gateway=192.168.10.1
指定子网的网关地址,一般是主路由 IP。-o parent=enp7s0
指明物理机将要桥接到的网卡接口,即上一步确定的以太网接口。macnet
是给此网络取的名称。务必确认主路由器所管理的网段是否与这里的 192.168.10.0/24
相兼容。如果家里的主路由器网段是 192.168.1.x
,则可以将旁路由容器放到同一个网段,或者通过适当的路由配置让这两个网段互通。具体做法可以根据实际网络需求进行调整。
先用一些命令查看当前系统是 x86_64
、arm
、arm64
等。OpenWRT 镜像一般会按架构分得比较细,确保选对镜像才能在容器内正常运行。以 Arch Linux 下查看命令为例:
|
|
或
|
|
假设输出为 x86_64
,表示需要拉取 x86_64
架构的 OpenWRT Docker 镜像。
在 Docker 仓库或阿里云镜像仓库可以查到一些第三方的 OpenWRT 镜像,例如 sulinggg/openwrt 或者其它定制镜像。这里以 registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64
为例:
|
|
拉取成功后,可以用 docker images
命令查看是否已经下载成功。
以下命令将基于之前创建的 macnet
网络,并使容器拥有特权权限(--privileged
)来访问更多系统特性:
|
|
命令解析:
--restart always
:Docker 容器异常退出或系统重启后,自动重启容器。--name openwrt
:容器名称设置为 openwrt
。-d
:后台运行容器。--network macnet
:使用先前创建的 macvlan
网络。--privileged
:给容器特权,可以支持更多底层操作,比如网络管理、挂载等。registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64
:要运行的镜像名称。/sbin/init
:指定容器启动时运行的初始进程。容器启动后,可以进入容器内部进行网络和服务配置。
|
|
这会在容器内部开启一个交互式 Shell,之后可以像在普通 Linux 主机上一样进行一些 OpenWRT 的配置。
OpenWRT 容器的网络配置文件在 /etc/config/network
,和常见的 OpenWRT 路由器类似。可以使用 vim
或 vi
打开它:
|
|
可根据需求(WAN/LAN 设置、静态 IP、DHCP 等)进行修改。以一个简单的例子为参考(仅示意,需要具体修改):
|
|
这里 lan
接口与 eth0
绑定,假设要给容器 IP 设为 192.168.10.2
;网关就是 192.168.10.1
。 这里配置的容器 IP 地址就是旁路由的 IP,所有步骤成功后,将上网设备的网关地址设为这个就能使用旁路由了 。
修改完成后,重启 OpenWRT 网络服务:
|
|
重启网络后,可以在容器内再次查看 IP 信息:
|
|
或
|
|
如果配置正确,应该能看到 eth0
或对应的网卡上有设定的 192.168.10.2
这样的 IP,并可以使用 ping
命令检测与网关或外网的连通性。
在机器重启后,之前设置的混杂模式会失效。如果要启动时自动启用混杂模式,可以通过以下步骤将其添加到启动参数中。
/etc/rc.local
首先,创建 /etc/rc.local
文件并赋予可执行权限:
|
|
然后,编辑 /etc/rc.local
文件,添加以下内容:
|
|
rc-local.service
接下来,创建一个 systemd 服务文件 /etc/systemd/system/rc-local.service
:
|
|
内容如下:
|
|
最后启用并启动 rc-local
服务:
|
|
192.168.10.2
),或者在主路由上配置静态路由,将某些流量转给 OpenWRT 做高级处理。192.168.10.x
网段分配了 IP,而给容器也设置了同网段的 IP,可能出现地址冲突。可以通过在物理机上把网卡 IP 与容器 IP 分离到不同网段,或通过给 Docker macvlan
指定一个子接口(ip link add
创建子接口)来避免冲突。luci
,并检查防火墙设置。通过 Docker 在闲置笔记本上运行 OpenWRT 用作旁路由,可以在保留原路由器主要功能的同时,为家庭网络增添更多可定制化的高级网络服务。从此,可以随时在容器中添加功能模块(Adblock、代理、QoS、VPN、流量统计等),灵活扩展家庭网络能力。并且 Docker 容器使用和维护都相对简单,后续升级、迁移也更方便。
如果对网络的管理和性能优化有更高的要求,可以考虑直接在笔记本上安装类似 PVE(Proxmox VE)、ESXi 或者开源虚拟化平台,然后让 OpenWRT 以虚拟机方式运行。但对于大多数轻量应用场景,Docker + macvlan 已足够轻巧易用。
如果在实际操作中遇到更多问题,欢迎在评论区留下疑问或经验。