玩转树莓派[13在Docker 中运行 OpenWrt 旁路网关]

今天树莓派直刷的Open Wrt又崩了,这不得不让我又燃起了搞这个Docker版Open Wrt的热情,再加上一次次的失败,于是乎我好像懂了~然后就水出了这篇咕咕文🕊~

一、写在前面

image-20210723222246005

众所周知,直接为树莓派刷Open WRT镜像简直就是浪费资源。所以,今天为大家带来的是(咕很久的)在 Docker 中运行 OpenWrt 做旁路网关的教程~

场景1

众所周知,Open Wrt 是面向嵌入型设备的 Linux 发行版,所以 Open Wrt 系统运行时的资源占用率会很低。而树莓派的硬件性能要比普通路由器要高很多。虽然树莓派在硬件配置上的绝对优势能让 Open Wrt 有更大的施展空间,但相应的,硬件上的优势也带来了资源的浪费(Open Wrt 在树莓派上正常运行时,资源占用率只有不到 1/10)。再加上 Open Wrt 的可扩展性不是很强,所以很多能在 Raspbian/Debian 上能做的事情在 Open Wrt 上往往无法实现。

所以,可不可以让 Open Wrt 与我们常用的系统共存呢?这样,我们可以享受到 Open Wrt 的功能,又可以让在我们常用的系统中完成一般性的 Linux 工作。

通过 Docker,完全可以。

场景2

Open Wrt 的功能固然强大,但是树莓派的板载网卡无线吞吐能力实在是无力吐槽,能否将现有路由器与树莓派结合使用,同时发挥现有路由器的信号优势与 Open Wrt 的软件优势呢?

通过旁路网关,完全可以。

那么,什么是旁路网关呢?

普通的路由器往往集无线信号转发、网关、DNS 服务器等角色为一身,其中的“网关”角色负责路由器内部数据的处理。但因为一般家用的路由器硬件性能很有限,在运行一些比较吃资源的应用(如酸酸乳、去广告等)时,几乎会占满所有硬件资源,导致路由器网络/系统不稳定等诸多问题。既然路由器的硬件性能有限,那可不可以把网关的重任交给硬件性能更好的设备去做,让路由器安安心心地做好它的老本行 – 无线转发呢?

完全可以。

所谓的旁路网关,就是在路由器之外的其他硬件设备上搭建一个网关环境,把路由器肩负的网关重任交给其他更适合的设备来做,同时,旁路网关处理完的结果会返回给路由器,由路由器继续进行无线转发。

这样,每个角色各司其职,路由器肩上的任务轻了,即使是油管 4K 也能轻松跑满网速了,而旁路由(树莓派)也结束了它吃灰的命运。由此资源的充分利用,一举两得。

在接下来的文章中,我们将在 Docker 容器中运行 Open Wrt,并通过设置,让 Docker 容器中的 Open Wrt 网关接管路由器自身的网关,减轻路由器的负担,同时,由于网关被 Open Wrt 接管,所以 Open Wrt 中的大部分应用都是可用的,比如酸酸乳,V2ray,去广告等。做个不恰当的比喻, Open Wrt 网关接管路由器自身的网关后,你可以理解为路由器是 Open Wrt 的一块外置网卡。

二、前期准备

既然需要在 Docker 中运行 Open Wrt ,那么首先需要在树莓派的现有系统上安装 Docker,在不同发行版上安装 Docker 的教程有很多,大家可以自行在搜索引擎中搜索相关内容以完成 Docker 的安装。

如果你的设备是 3B/3B+/4B,强烈安利使用“树莓派爱好者基地”编译的 64 位 Debian,此版本 Debian 可以充分发挥 64 位 CPU 的性能,同时默认开启 Docker,KVM 等功能,其中,Docker 功能开箱即用,非常方便。

如果你的设备是树莓派2B,那么你可能需要在其他发行版上手动安装 Docker 了,但是小苏提供的 Docker 镜像是支持 2B~4B 设备的,换句话说,只要在其他发行版上成功安装了 Docker,也是可以用我提供的 Open Wrt 镜像的。

为了方便叙述以及为大家提供一个参考的宿主机环境,下文内容基于“树莓派爱好者基地”编译的 64 位 Debian。当然,如果你在你使用的发行版上安装了 Docker,步骤是一样的。

“树莓派爱好者基地”专版64位 Debian 功能介绍(内含下载链接):

https://github.com/openfans-community-offical/Debian-Pi-Aarch64/blob/master/README_zh.md

如果你习惯使用图形化界面操作,建议下载桌面全功能版使用,但是需要你自己安装后启动Docker。

image-20210723222859982

★ : 表示支持,并以默认启用,可直接使用。

☆ : 表示支持,但默认未启用该服务,需要用户手动启动。(关于如果启用相关服务,在本文档中有说明。)

X : 表示不支持。

下载镜像烧写到树莓派的 SD 卡并上电开机后,系统会自动完成扩展 SD 卡空间的操作,这个过程大约需要3~5分钟(期间会重启几次)。估摸着时间差不多以后,用网线将树莓派的板载网口与路由器的 Lan 口连接,之后连接树莓派的 SSH(可以自备软件,也可通过内置Web界面9090端口食用):

用户名:pi

密码:raspberry

准备工作到此结束。

三、步骤开始

成功登陆到树莓派的 SSH 后,在拉取镜像之前,我们还需要进行一些额外的工作:

1.打开网卡混杂模式

1
sudo ip link set eth0 promisc on 

2.创建网络

(须结合实际网络情况,不能照抄命令)

1
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 macnet

这一条命令需要根据树莓派所处的网络环境来做修改,可以使用 sudo ifconfig命令来查看树莓派 eth0 网卡获得的 IP 地址,如果树莓派获得的 IP 地址为 192.168.5.103,那么说明树莓派处在 192.168.5.x网段,相应的,命令中的192.168.1.0192.168.1.1需要被替换成 192.168.5.0192.168.5.1

1
docker network create -d macvlan --subnet=192.168.5.0/24 --gateway=192.168.5.1 -o parent=eth0 macnet

此时,我们使用 docker network ls命令可以看到网络macnet已建立成功:

1
2
3
4
5
6
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
10e676133746 bridge bridge local
f5308b94e8fa host host local
16745ea66852 macnet macvlan local
5e72e41ea02a none null local

3.拉取镜像

若身处国内,为提高拉取速度,请拉取阿里云仓库中的镜像:

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

同时小苏geigei也提供存放在 Docker 官方仓库 中的镜像:

1
docker pull sulinggg/openwrt:latest

镜像拉取完成后,我们可以执行docker images命令查看现存镜像:

1
2
3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-shanghai.aliyuncs.com/suling/openwrt latest 4f4bc5dca2d9 3 hours ago 200MB

可见,镜像已成功拉取到本地。

4.创建并启动容器

1
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命令查看当前运行的容器:

1
2
3
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a26cee7cade6 openwrt:latest "/sbin/init" 3 hours ago Up 3 hours openwrt

若容器运行信息STATUS列为 UP状态,则说明容器运行正常。

5.进入容器并修改相关参数

(须结合实际网络情况,不能照抄配置)

1
docker exec -it openwrt bash

其中:

openwrt为容器名称;

bash为进入容器后执行的命令。

执行此命令后我们便进入 Open Wrt 的命令行界面,首先,我们需要编辑 Open Wrt 的网络配置文件:

1
vim /etc/config/network

我们需要更改 Lan 口设置:

1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.1.100'
option netmask '255.255.255.0'
option ip6assign '60'
option gateway '192.168.1.1'
option broadcast '192.168.1.255'
option dns '192.168.1.1'

其中:

所有的 192.168.1.x 需要根据树莓派所处网段修改,option gatewayoption dns填写路由器的 IP,若树莓派获得的 IP 为 192.168.5.103,路由器 IP 为192.168.5.1,则需要这样修改:

1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.5.100'
option netmask '255.255.255.0'
option ip6assign '60'
option gateway '192.168.5.1'
option broadcast '192.168.5.255'
option dns '192.168.5.1'

option ipaddr项目定义了 Open Wrt 的 IP 地址,在完成网段设置后,IP最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP 冲突)。

6.重启网络

1
/etc/init.d/network restart

7.进入控制面板

在浏览器中输入第 5 步option ipaddr项目中的 IP 进入 Luci 控制面板,若option ipaddr的参数为 192.168.5.100,则可以在浏览器输入 http://192.168.5.100进入控制面板。

用户名:root

密码:password

8.关闭 DHCP 服务

在 “网络 - 接口 - Lan - 修改” 界面中,勾选下方的 “忽略此接口(不在此接口提供 DHCP 服务)”,并“保存&应用”。(默认已打开,检查一下即可)

关闭 “DHCP 服务”

四、食用方式

推荐使用以下几种科学上网工具(待补充)。

  • ShadowSocksR Plus+

    image-20210724001544855

    • 可以添加SS/SSR/V2Ray/Trojan节点
    • 支持通过机场订阅链接添加并设置自动更新
    • 支持通过节点链接添加
    • 支持手动填写
    • 支持自动切换节点
    • 支持设置Socks5代理模式
  • PassWall

    image-20210724002040532

    • 界面简单,好上手,功能强大

    • 支持 V2ray VLESS、V2ray VMESS、TROJAN、SS、SSR 等协议

    • 支持通过机场订阅链接添加并设置自动更新
    • 支持通过节点链接添加
    • 支持手动填写
    • 支持自动切换节点
    • 支持设置Socks5代理模式
  • OpenClash

    image-20210724002304174

    • 操作简单,一键配置添加订阅地址即可
    • 也有一些复杂的配置项(不过可以不用管)
    • 提供Web管理界面

image-20210724002405837

以下为ShadowSocksR Plus+条件下设置的。

1.Google插件代理

推荐安装 Proxy SwitchyOmega 插件。

image-20210723224525926

image-20210723231014825

2.Windows

Windows

手动指定网关,在无线热点的“属性”界面下,点击 “IP 设置 - 编辑”按钮,在弹出框中更改 IP 分配模式为“手动”,打开 IPV4 的开关,根据所处网段及上文安卓的相关设置填写相关参数即可。

3.Phone

FotoJet

原理同上,但建议使用以下方式配置(小火箭🚀)。

小🚀

参考