# 旁路网关
普通的路由器往往集无线信号转发、网关、DNS 服务器等角色为一身,其中的 “网关” 角色负责路由器内部数据的处理。但因为一般家用的路由器硬件性能很有限,在运行一些比较吃资源的应用(如酸酸乳、去广告等)时,几乎会占满所有硬件资源,导致路由器网络 / 系统不稳定等诸多问题。既然路由器的硬件性能有限,那可不可以把网关的重任交给硬件性能更好的设备去做,让路由器安安心心地做好它的老本行 – 无线转发呢?
完全可以。
所谓的旁路网关,就是在路由器之外的其他硬件设备上搭建一个网关环境,把路由器肩负的网关重任交给其他更适合的设备来做,同时,旁路网关处理完的结果会返回给路由器,由路由器继续进行无线转发。
这样,每个角色各司其职,路由器肩上的任务轻了,即使是油管 4K 也能轻松跑满网速了,而旁路由(树莓派)也结束了它吃灰的命运。由此资源的充分利用,一举两得。
# 重要说明
- 此文章中提到的 Docker 镜像只适用于树莓派 2B/3B/3B+/4B,在其他设备上理论上不能正常使用。但文中所述内容对其他设备应该有参考意义。
- 在 Docker 中运行 OpenWrt ,树莓派将工作在旁路网关模式下,在这种工作模式下,树莓派的板载无线网卡不会工作(同时在 OpenWrt 的控制面板中也找不到有关 WIFI 的设置)。所以,需要将树莓派与路由器通过网线连接来使用。
# 前期准备
既然需要在 Docker 中运行 OpenWrt ,那么首先需要在树莓派的现有系统上安装 Docker,在不同发行版上安装 Docker 的教程有很多,大家可以自行在搜索引擎中搜索相关内容以完成 Docker 的安装。
如果你的设备是 3B/3B+/4B,推荐使用 “树莓派爱好者基地” 编译的 64 位 Debian,此版本 Debian 可以充分发挥 64 位 CPU 的性能,同时默认开启 Docker,KVM 等功能,其中,Docker 功能开箱即用,非常方便。
# 步骤开始
# 1. 打开网卡混杂模式
sudo ip link set eth0 promisc on |
# 2. 创建网络
(须结合实际网络情况,不能照抄命令)
docker network create -d macvlan --subnet=192.168.123.0/24 --gateway=192.168.123.1 -o parent=eth0 macnet |
这一条命令需要根据树莓派所处的网络环境来做修改,可以使用 sudo ifconfig
命令来查看树莓派 eth0
网卡获得的 IP
地址,如果树莓派获得的 IP
地址为 192.168.2.154
,那么说明树莓派处在 192.168.2.x
网段,相应的,命令中的 192.168.123.0
和 192.168.123.1
需要被替换成 192.168.2.0
和 192.168.2.1
:
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=eth0 macnet
此时,我们使用 docker network ls
命令可以看到网络 macnet
已建立成功
# 3. 拉取镜像
若身处国内,为提高拉取速度,请拉取阿里云仓库中的镜像:
docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:latest |
同时也提供存放在 Docker 官方仓库 中的镜像:
docker pull sulinggg/openwrt:latest |
镜像拉取完成后,我们可以执行 docker images
命令查看现存镜像
# 4. 创建并启动容器
docker run --restart always --name openwrt -d --network macnet --privileged registry.cn-shanghai.aliyuncs.com/suling/openwrt:latest /sbin/init |
其中:
--restart always
参数表示容器退出时始终重启,使服务尽量保持始终可用;
--name openwrt
参数定义了容器的名称;
-d
参数定义使容器运行在 Daemon
模式;
--network macnet
参数定义将容器加入 maxnet
网络;
--privileged
参数定义容器运行在特权模式下;
registry.cn-shanghai.aliyuncs.com/suling/openwrt:latest
为 Docker
镜像名,因容器托管在阿里云 Docker
镜像仓库内,所以在镜像名中含有阿里云仓库信息;
/sbin/init
定义容器启动后执行的命令。
启动容器后,我们可以使用 docker ps -a
命令查看当前运行的容器:
若容器运行信息 STATUS
列为 UP
状态,则说明容器运行正常。
# 5. 进入容器并修改相关参数
(须结合实际网络情况,不能照抄配置)
docker exec -it openwrt bash |
其中:
openwrt
为容器名称;
bash
为进入容器后执行的命令。
执行此命令后我们便进入 OpenWrt
的命令行界面,首先,我们需要编辑 OpenWrt
的网络配置文件:
vim /etc/config/network |
我们需要更改 Lan
口设置:
config interface 'lan' | |
option type 'bridge' | |
option ifname 'eth0' | |
option proto 'static' | |
option ipaddr '192.168.123.100' | |
option netmask '255.255.255.0' | |
option ip6assign '60' | |
option gateway '192.168.123.1' | |
option broadcast '192.168.123.255' | |
option dns '192.168.123.1' |
其中:
所有的 192.168.123.x
需要根据树莓派所处网段修改, option gateway
和 option dns
填写路由器的 IP
,若树莓派获得的 IP
为 192.168.2.154
,路由器 IP
为 192.168.2.1
,则需要这样修改:
config interface 'lan' | |
option type 'bridge' | |
option ifname 'eth0' | |
option proto 'static' | |
option ipaddr '192.168.2.100' | |
option netmask '255.255.255.0' | |
option ip6assign '60' | |
option gateway '192.168.2.1' | |
option broadcast '192.168.2.255' | |
option dns '192.168.2.1' |
option ipaddr
项目定义了 OpenWrt
的 IP
地址,在完成网段设置后, IP
最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP
冲突)。
# 6. 重启网络
/etc/init.d/network restart |
# 7. 进入控制面板
在浏览器中输入第 5 步 option ipaddr
项目中的 IP
进入 Luci
控制面板,若 option ipaddr
的参数为 192.168.123.100
,则可以在浏览器输入 http://192.168.123.100
进入控制面板。
用户名: root
密码: password
# 8. 关闭 DHCP 服务
在 “ 网络 - 接口 - Lan - 修改
” 界面中,勾选下方的 “ 忽略此接口(不在此接口提供 DHCP 服务)
”,并 “ 保存&应用
”。
# 9. 主路由 DHCP 设置
进入路由器后台中,将主路由的 DHCP
的默认网关和 DNS
服务器设置为第 5 步中 option ipaddr
项目中的 IP
。
# 10. 重新连接路由器
完成以上操作后,断开设备(如手机,电脑)与路由器的连接,重新连接路由器,连接路由器的设备将获取到我们设置到的 IP
。
# 其他修复
# 1. 关闭 WLAN 硬件加速
设置旁路路由后,若出现访问国内网站网速慢,不稳定的情况(多见于 Pandavan
及其改版固件,如华硕老毛子固件),请在路由器的控制面板中关闭有关 WLAN
的硬件加速,比如选择 “ Offload TCP/UDP for LAN
”(若未出现此现象请忽略)
# 2. 宿主机网络修复
OpenWrt
容器运行后,宿主机内可能无法正常连接外部网络,需要修改宿主机的 /etc/network/interfaces
文件以修复:
(须结合实际网络情况,不能照抄配置)
cp /etc/network/interfaces /etc/network/interfaces.bak # 备份文件 | |
vim /etc/network/interfaces # 使用 vim 编辑文件 |
向文件末尾添加:
auto eth0 | |
iface eth0 inet manual | |
auto macvlan | |
iface macvlan inet static | |
address 192.168.123.200 | |
netmask 255.255.255.0 | |
gateway 192.168.123.1 | |
dns-nameservers 192.168.123.1 | |
pre-up ip link add macvlan link eth0 type macvlan mode bridge | |
post-down ip link del macvlan link eth0 type macvlan mode bridge |
修改后重启树莓派,之后树莓派的局域网 IP
地址将会固定为 /etc/network/interfaces
文件中 address
参数中的地址。
# 3. 手动指定网关
如果路由器固件不支持自定义 DHCP
服务的网关及 DNS
地址(常见于路由器官方固件),或者只希望局域网下的个别设备接入旁路网关时,须在接入设备上做以下配置
# 注意事项
- 文章所述方案适用于光猫或路由器已完成宽带拨号的网络环境,未测试也不推荐使用
Docker
内的OpenWrt
进行宽带拨号; OpenWrt
容器跟随树莓派系统启动,无需手动干预;- 由于容器内系统内核共享宿主机内核,所以在
Luci
面板的 “内核版本” 项与宿主机内核版本一致; - 在对容器进行停止或删除操作时,树莓派可能会发生卡顿现象,
SSH
可能会断开,1~2 分钟后会恢复正常,目前原因不明;