家庭网络配置:利用 Docker 在闲置笔记本上运行 OpenWRT 作为旁路由

通过 Docker 在闲置笔记本上运行 OpenWRT 作为旁路由,充分利用旧设备,提升家庭网络的可定制性和功能性。本文详细介绍了从零开始配置 Docker 环境、创建 macvlan 网络、运行 OpenWRT 容器,并进行网络配置的全过程。无论是去广告、科学上网,还是流量监控和 VPN 服务,都可以通过旁路由轻松实现。适合有一定 Linux 基础的用户,帮助你将闲置设备变身为强大的网络工具。

过年回家总想着折腾点什么,于是就瞄上了早已退休的19年拯救者。相信很多家庭都有闲置的笔记本电脑,性能尚可却一直闲置。如果希望充分利用这些设备,可以考虑将其改造成“旁路由”(又称“透明网关”或“旁挂路由”),将某些网络功能(如去广告、流量监控、VPN 等)卸载到这台机器上进行处理。但是,这么强大的一个X86平台,重新刷一个Openwrt系统太大材小用了,已经装了Ubuntu的它还可以有更多用处(All in BOOM)。如果不想大动硬件也不想重装系统,Docker 技术可以派上用场。通过在闲置笔记本上运行一个 OpenWRT 容器,就可以以旁路由的方式接管或旁路处理局域网的流量。

本文将介绍从零开始完成一套基本环境配置,包括:

  • 检查和配置网络接口
  • 创建 Docker macvlan 网络
  • 拉取并运行 OpenWRT 镜像
  • 进入容器进行简单网络配置

1 环境与思路

1.1 闲置笔记本电脑

  • 需要一台可以正常联网的笔记本(最好有以太网口)。如果只有无线网卡,需要额外注意无线网卡桥接或 macvlan 可能受限。
  • 笔记本的操作系统可以是任意 Linux 发行版(Ubuntu、Debian、CentOS、Arch Linux 等),只要能安装 Docker 即可。

1.2 Docker 环境

确保 Docker 可以正常启动和拉取镜像,如果不熟悉 Docker 的安装,可以参照 Docker 官方文档 或对应发行版社区的文档。如在大陆地区,可参照此处配置镜像。

1.3 旁路由思路

  • 在传统路由器(或主路由)仍然负责 DHCP、主要 NAT 功能的前提下,让 OpenWRT 容器在笔记本上“旁路”处理网络中的其他功能,比如去广告、科学上网、流量分析等。
  • 所有设备可以灵活选择是否需要使用旁路由,避免爆炸的时候网络异常或是增加家中长辈的用网成本。
  • 为了让笔记本上运行的 OpenWRT 容器拥有和内网同网段的 IP,需要使用 macvlan 网络模式。

2 检查并配置网络接口

2.1 查看网卡信息

在 Linux 上,首先用 ifconfigip addr 命令查看网卡信息。以下示例输出里,重点关注无线网卡 wlp0s20f3、有线网卡 enp7s0 以及它们的 IP 地址:

1
ifconfig
1
2
3
4
5
6
wlp0s20f3: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 192.168.1.23  netmask 255.255.255.0  broadcast 192.168.1.255
        ...

enp7s0: ...
        ...

当然这只是我的设备情况,每个设备的网卡名称几乎都是不同的,需要自主根据IP地址、流量信息去确定,但大多数情况下,以太网卡的名称会以“e”开头,比如“eth0”或是我的“enp***“,后文中所有的代码中,记得把enp7s0替换成你的设备名称,你可以在此博客页面代码框的右上角点击编辑按钮后直接修改。

如果希望在有线网卡上使用 macvlan,一般会选择 enp7s0 作为 macvlan 的父接口(-o parent=enp7s0),因为无线网卡与 macvlan 配合往往有兼容性问题。
在少数情况下,如果只有无线网卡,可能需要通过其他方案来旁路,比如 TAP/TUN 方式或者路由策略转发等,macvlan 对 Wi-Fi 不够友好。

2.2 开启混杂模式

为了确保网卡可以截获所有流量进行分析或桥接,需要设置网卡的混杂模式。可通过以下命令启用:

1
sudo ip link set enp7s0 promisc on

或者对于无线网卡,如果想在 wlp0s20f3 上开启混杂模式,也可执行:

1
sudo ip link set wlp0s20f3 promisc on

注意:混杂模式一般只在需要检测或中转特定流量时才必需,不然可以不设。

3 创建 Docker macvlan 网络

macvlan 可以让容器拥有与物理机不同的 MAC 地址以及内网 IP,从而像独立设备一样接入到局域网中。

  1. 假设希望容器所在网段是 192.168.10.0/24,网关是 192.168.10.1(主路由器或管理网关,可以在当前联网的设备上查看详细信息)。
  2. 使用 macvlan 驱动创建一个名为 macnet 的网络,父接口是 enp7s0(以太网卡),具体命令如下:
1
2
3
4
5
docker network create -d macvlan \
  --subnet=192.168.10.0/24 \  # 与网关在同一网段
  --gateway=192.168.10.1 \ # 修改为路由器或者网关ip
  -o parent=enp7s0 \ # 修改为以太网卡名称
  macnet

上述命令解析:

  • -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,则可以将旁路由容器放到同一个网段,或者通过适当的路由配置让这两个网段互通。具体做法可以根据实际网络需求进行调整。

4 拉取并运行 OpenWRT 镜像

4.1 确认系统架构

先用一些命令查看当前系统是 x86_64armarm64 等。OpenWRT 镜像一般会按架构分得比较细,确保选对镜像才能在容器内正常运行。以 Arch Linux 下查看命令为例:

1
arch

1
uname -m

假设输出为 x86_64,表示需要拉取 x86_64 架构的 OpenWRT Docker 镜像。

4.2 拉取 OpenWRT 镜像

在 Docker 仓库或阿里云镜像仓库可以查到一些第三方的 OpenWRT 镜像,例如 sulinggg/openwrt 或者其它定制镜像。这里以 registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 为例:

1
docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

拉取成功后,可以用 docker images 命令查看是否已经下载成功。

5 启动容器

以下命令将基于之前创建的 macnet 网络,并使容器拥有特权权限(--privileged)来访问更多系统特性:

1
2
3
4
5
6
7
sudo docker run --restart always \
  --name openwrt \
  -d \
  --network macnet \
  --privileged \
  registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 \
  /sbin/init

命令解析:

  • --restart always:Docker 容器异常退出或系统重启后,自动重启容器。
  • --name openwrt:容器名称设置为 openwrt
  • -d:后台运行容器。
  • --network macnet:使用先前创建的 macvlan 网络。
  • --privileged:给容器特权,可以支持更多底层操作,比如网络管理、挂载等。
  • registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64:要运行的镜像名称。
  • /sbin/init:指定容器启动时运行的初始进程。

6 容器内网络配置

容器启动后,可以进入容器内部进行网络和服务配置。

6.1 进入容器

1
docker exec -it openwrt bash

这会在容器内部开启一个交互式 Shell,之后可以像在普通 Linux 主机上一样进行一些 OpenWRT 的配置。

6.2 编辑 OpenWRT 网络配置

OpenWRT 容器的网络配置文件在 /etc/config/network,和常见的 OpenWRT 路由器类似。可以使用 vimvi 打开它:

1
vim /etc/config/network

可根据需求(WAN/LAN 设置、静态 IP、DHCP 等)进行修改。以一个简单的例子为参考(仅示意,需要具体修改):

1
2
3
4
5
6
7
config interface 'lan'
    option ifname 'eth0'
    option proto 'static'
    option ipaddr '192.168.10.2' 
    option netmask '255.255.255.0'
    option gateway '192.168.10.1'
    option dns '192.168.10.1'

这里 lan 接口与 eth0 绑定,假设要给容器 IP 设为 192.168.10.2;网关就是 192.168.10.1。 这里配置的容器 IP 地址就是旁路由的 IP,所有步骤成功后,将上网设备的网关地址设为这个就能使用旁路由了 。

修改完成后,重启 OpenWRT 网络服务:

1
/etc/init.d/network restart

6.3 验证容器网络生效

重启网络后,可以在容器内再次查看 IP 信息:

1
ifconfig

1
ip addr

如果配置正确,应该能看到 eth0 或对应的网卡上有设定的 192.168.10.2 这样的 IP,并可以使用 ping 命令检测与网关或外网的连通性。

7 混杂模式服务(可选)

在机器重启后,之前设置的混杂模式会失效。如果要启动时自动启用混杂模式,可以通过以下步骤将其添加到启动参数中。

7.1 创建并配置 /etc/rc.local

首先,创建 /etc/rc.local 文件并赋予可执行权限:

1
2
sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local

然后,编辑 /etc/rc.local 文件,添加以下内容:

1
2
ip link set eth0 promisc on
exit 0

7.2 创建并配置 rc-local.service

接下来,创建一个 systemd 服务文件 /etc/systemd/system/rc-local.service

1
sudo vim /etc/systemd/system/rc-local.service

内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local
 After=network.target

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 RemainAfterExit=yes

[Install]
 WantedBy=multi-user.target

7.3 启用并启动服务

最后启用并启动 rc-local 服务:

1
2
3
sudo systemctl enable rc-local
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

8 将容器用作旁路由

  1. 旁路由原理:在家里现有的主路由器配置中,可以将特定设备或者某个 VLAN 的网关地址指向这个 OpenWRT 容器的 IP(如 192.168.10.2),或者在主路由上配置静态路由,将某些流量转给 OpenWRT 做高级处理。
  2. 常见用途:去广告(Adblock)、VPN 客户端、代理服务器、科学上网、流量监控等等都可以在这个 OpenWRT 容器上配置。
  3. 确保网络互通:如果笔记本通过 Wi-Fi 上网,就要留意物理网卡与 macvlan 之间的兼容问题;也要确保主路由、笔记本与旁路由容器处于同一个网段或路由可达。
  4. 功耗:启动Openwrt后,没流量时整机功耗13w,有下载流量时整机功耗约20w,功耗还是比较高,看来不宜在x86设备上长期使用。

9 故障排查

  1. 容器无网络:检查是否将 macvlan 父接口指定为正确的有线网卡;检查容器内 IP 与主路由网段是否冲突;检查物理网卡 IP 分配是否正确。
  2. 冲突:如果笔记本本身也在 192.168.10.x 网段分配了 IP,而给容器也设置了同网段的 IP,可能出现地址冲突。可以通过在物理机上把网卡 IP 与容器 IP 分离到不同网段,或通过给 Docker macvlan 指定一个子接口(ip link add 创建子接口)来避免冲突。
  3. 无法访问容器管理界面(LUCI):OpenWRT 默认可能没有开放或安装 Luci,如需 Web 管理界面,需要进入容器安装 luci,并检查防火墙设置。
  4. 无线网卡问题:如果只有 Wi-Fi 网卡想要使用 macvlan,通常会碰到兼容性障碍,可以尝试其他方式,如 TUN/TAP,或者额外配置一块 USB 网卡用作桥接。

10 总结

通过 Docker 在闲置笔记本上运行 OpenWRT 用作旁路由,可以在保留原路由器主要功能的同时,为家庭网络增添更多可定制化的高级网络服务。从此,可以随时在容器中添加功能模块(Adblock、代理、QoS、VPN、流量统计等),灵活扩展家庭网络能力。并且 Docker 容器使用和维护都相对简单,后续升级、迁移也更方便。

如果对网络的管理和性能优化有更高的要求,可以考虑直接在笔记本上安装类似 PVE(Proxmox VE)、ESXi 或者开源虚拟化平台,然后让 OpenWRT 以虚拟机方式运行。但对于大多数轻量应用场景,Docker + macvlan 已足够轻巧易用。

如果在实际操作中遇到更多问题,欢迎在评论区留下疑问或经验。

Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%