本项目介绍如何在 Docker 中运行 OpenWRT,并将其作为主路由使用。
- 将光猫设置为 桥接 模式,具体可咨询当地运营商,路由器设置为 PPPoE 模式(后面会改为 AP 模式)。
- 一台运行 Linux(推荐 Arch)操作系统的设备,ARM/x86 均可,已安装 Docker;最好能有两个千兆以上的物理网口(可以用 USB 网卡代替),假设名称分别为 openwrt-wan 和 openwrt-lan,在当前网络中的 IP 分别为
192.168.1.10
,192.168.1.20
。 - 在后续的步骤中,我们会将 openwrt-wan 连接光猫,作为 wan 口使用,提供 PPPoE 拨号等服务;openwrt-lan 连接路由器,作为 lan 口使用,提供 DHCP 等服务。
- 我们假设光猫的 IP 为
192.168.0.1
,CIDR 为192.168.0.0/24
,openwrt-lan 作为 lan 口的 IP 为192.168.1.1
,CIDR 为192.168.1.0/24
,只要两边的 IP 不在同一个网段即可。
以下配置根据实际情况修改:
- 如果要修改网口名称,需同步修改 openwrt-lan.sh,openwrt-lan.service,docker-compose.yml 中相应的配置项。
- 如果要修改 IP,需同步修改 openwrt-lan.sh,docker-compose.yml 中相应的配置项。
- 文档使用的是 x86 架构的设备,如果你使用的是 ARM 架构的设备,可能需要修改 docker-compose.yml 中的镜像。
注:需要使用 systemd-networkd 作为 Linux 的网络配置工具。
sudo ip link set openwrt-wan promisc on
sudo ip link set openwrt-lan promisc on
sudo docker-compose up -d
如果启动失败,请根据日志排查错误。
sudo docker exec -it openwrt bash # openwrt 为容器名称
vim /etc/config/network
找到下面的配置项:
config interface 'lan'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
option dns '114.114.114.114 223.5.5.5 119.29.29.29 8.8.8.8 1.1.1.1'
只需要修改 option ipaddr 字段,将其修改为 lan 口的 IP 即可,本教程中为 192.168.1.1
。
/etc/init.d/network restart
将路由器设置为 AP 模式
在浏览器中输入 lan 口的 IP 进入 Luci 控制面板,用户名:root
,密码:password
(密码可能会因为镜像的不同而不同)。
在 Web 控制面板,将 wan 口协议设置为 PPPoE,并使用自定义的 DNS,如下图所示:
将 lan 口协议设置为 静态地址,并使用自定义的 DNS,然后调整 DHCP 服务器配置项,如下图所示:
建议 wan、lan 口都使用自定义的 DNS。
OpenWrt 强大的插件功能让其可玩性到了新的高度,包括但不限于广告屏蔽、各种协议的网络代理等;介于某些原因,这一块请大家自己探索,并享受其中的乐趣!
OpenWrt 容器运行后,Linux 宿主机与 OpenWRT 之间无法直接通信,导致宿主机无法访问互联网,局域网内其他设备也无法直接访问宿主机。这和 Docker 的 macvlan 网络驱动模式有关,这个模式通俗一点讲就是在一张物理网卡上模拟出一张虚拟网卡,有独立的 MAC 地址,可以分配独立的 IP 地址,看起来就像是局域网内一台独立的设备;此时 Docker 容器可以和局域网下的设备直接通信,反之亦然,很方便。不过,这种模式有一个问题:宿主机和容器是没办法直接网络通信的,也即最开始提到的问题。
幸运的是,网上有大佬给出了一些解决方案,我整理成了一个简单的 脚本,并作为 systemd 服务运行。 在启动该守护进程前,请根据实际情况修改 openwrt-lan.sh 和 openwrt-lan.service。
如果这个项目对你有所帮助,请给我一颗 ⭐️ 吧!