IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    blog@zair.top (Tim)发表于 2025-01-21 23:03:22
    love 0

    通过 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 上,首先用 ifconfig 或 ip 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_64、arm、arm64 等。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 路由器类似。可以使用 vim 或 vi 打开它:

    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 已足够轻巧易用。

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



沪ICP备19023445号-2号
友情链接