引言
之前一直是直接在宿主机上安装 OpenWrt 来实现透明路由, 当然现在也是如此!!
无意中发现, 其实也是可以通过 Docker 的方式来安装 OpenWrt, 如此, 就可以在宿主机上通过 Docker 上部署其他应用了!
本文则是记录了 Docker 部署 OpenWrt 的过程, 当然最终其实我没有使用该方案, 因为在使用一段时间后总感觉不是很稳定, 而且这种方案会让宿主机网络环境变得复杂。最后还是直接在宿主机上直接安装 OpenWrt
一、Docker 环境搭建
因为我是新环境(Ubuntu)所以需要先配下 Docker 环境, 如果你的设备已经配了 Docker 环境请忽略这一步, 这里的安装以 官网为准(下面也只是按照官网的步骤来的)
1.1 安装 Docker
- 设置
Docker的apt存储库: 把下面一大段直接复制到终端执行
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
- 安装完成状态如下(不要有警告、报错就行)
- 安装
Docker相关的工具包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成状态如下(不要有警告、报错就行)
- 验证是否安装成功: 通过运行
hello-world映像来验证Docker Engine安装是否成功
sudo docker run hello-world
此命令下载测试映像并在容器中运行。容器运行时, 它会打印一条确认消息并退出。如下所示, 则说明您已成功安装并启动了
Docker Engine
1.2 安装 Docker-compose
- 从 官方仓库 获取最新版本安装包
- 安装(下载)
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-armv7 -o ~/.docker/cli-plugins/docker-compose
- 设置插件权限
chmod +x ~/.docker/cli-plugins/docker-compose
- 验证是否安装完成
docker compose version
二、网络连接方式(切换至有线连接)
这里我在安装系统(Ubuntu)时网络设置的是 WIFI 连接, 所以这里需要修改为有线连接!! 所以如果你的网络连接方式是有线的那就可以跳过这一部分!!
而之所以要改为有线
- 为了网络更稳定
- 是因为如果是
WIFI连接情况下, 后面设置Docker容器桥接网络时会报错!
2.1 修改配置
SSH登录系统, 来到/etc/netplan目录
cd /etc/netplan
ls
-
找到配置文件: 如上我的配置文件为
50-cloud-init.yaml需要注意的是, 这里配置文件名不一定是相同的, 但肯定在该目录下, 所以需要以实际情况为准 -
修改配置文件
50-cloud-init.yaml
sudo vim 50-cloud-init.yaml
- 将旧配置注释(推荐)或删除
network:
version: 2
ethernets:
eth0:
dhcp4: true
optional: true
- 执行
netplan generate和netplan apply以激活配置
sudo netplan generate
sudo netplan apply
2.2 一次意外(确定 IP & 固定 IP)
- 这里出现一个意外: 激活完配置, 发现
SSH连接断开了, 再次连接也上不去了!!!
- 原因其实就是
IP地址改变了: 在路由管理器页面上, 进入对应设备信息管理页面, 发现IP居然变了
-
路由器管理页面, 进入「
IP与MAC绑定设置」 -
先删除旧的(我之前其实设置了一条, 删了删了)
- 重新添加一条配置
- 顺便把主机名和
IP给改了
- 重启树莓派, 等待片刻, 用新
IP来SSH登录
三、查看网络信息
使用 ip route 可查看系统的路由表, 包括默认网关、子网和接口信息; 如下所示:
$ ip route
default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.200 metric 100
192.168.0.1 dev eth0 proto dhcp scope link src 192.168.0.200 metric 100
192.168.1.1 via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 100
从 ip route 输出内容可以得到以下内容:
- 有线网卡:
eth0, 树莓派默认eth0其实就是有线的网卡 - 网关:
192.168.0.1, 其实就是路由器管理地址 - 子网:
192.168.0.0/24
四、设置网络: 混杂模式
混杂模式(
promiscuous mode)是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流, 而不论其目的地址是否是它。一般计算机网卡都工作在非混杂模式下, 此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时, 网卡将来自接口的所有数据都捕获并交给相应的驱动程序。
这里我们需要将宿主机的网络设置为 混杂模式 这对于 OpenWrt 容器访问互联网是必要的!!!
4.1 混杂模式开启 & 关闭
在确定当前使用的网卡后, 可通过 ip link 来设置网卡对应的混杂模式, 具体命令如下:
ip link set eth0 promisc on # 开启混杂模式, eth0 是你的网卡
ip link set eth0 promisc off # 取消混杂模式, eth0 是你的网卡
检测是否开启混杂模式: 如下图所示, 设置前后使用 ip link 检查网卡, 会发现开启混杂模式下, 相同命令会输出内容会多个 PROMISC
五、部署 Openwert
下面开始正式部署 Openwert...
5.1 下载 Docker 镜像
这里直接使用其他大佬构建好的镜像, 地址: openwrt.ai
- 检索, 找到目标设备
- 找到
Docker镜像, 右键, 复制下载链接
- 树莓派上, 使用
wget进行下载
wget https://dl.openwrt.ai/releases/targets/bcm27xx/bcm2711/openwrt-07.26.2024-bcm27xx-bcm2711-rpi-4-rootfs.tar.gz
5.2 导入镜像
将下载下来的镜像, 使用 docker import 进行导入
# supes_openwrt 则是为导入的镜像命名(随便取)
sudo docker import openwrt-07.26.2024-bcm27xx-bcm2711-rpi-4-rootfs.tar.gz supes_openwrt
执行 docker images 查看所有镜像, 确保导入成功
sudo docker images
5.3 部署容器
在很多文章中, 在部署 Docker 前还需要创建 Docker 网络! 这边我直接是通过 Docker compose 来部署的, 所在网络部分我也是直接在 Docker compose 中进行定义
- 创建项目目录
mkdir openWrt
- 创建
docker-compose.yml配置文件: 下面配置基本不用动, 只需要修改:image、ipv4_address、subnet、gateway
cd openWrt # 进入项目目录
cat >> docker-compose.yml << EOF
version: '3.8'
services:
openwrt: # 声明服务
image: supes_openwrt # 所使用的镜像
container_name: openwrt # 容器命名
command: /sbin/init # 运行容器时默认执行的命令
privileged: true # 授予容器特权模式, 容器将拥有类似于宿主机的所有权限
restart: always # 定义容器的重启策略(无论退出状态如何, 总是重启容器)
networks: # 设置链接的网络
openwrt-macvlan: # - 连接的网络名
ipv4_address: 192.168.0.222 # - 容器内部 IP 地址
networks: # 定义网络
openwrt-macvlan: # 网络名称
driver: macvlan # 指定驱动程序(macvlan: 容器直接连接宿主网络)
driver_opts:
parent: eth0 # parent 配置用于指定 macvlan 网络驱动程序的父接口
ipam: # 配置网络的 IP 地址分配策略
config:
- subnet: 192.168.0.0/24 # 子网段(ip route 查到的信息)
gateway: 192.168.0.1 # 网关(ip route 查到的信息, 其实就是主路由地址)
EOF
补充:
macvlan是Docker网络驱动程序之一, 它允许你将容器直接连接到宿主机的网络, 并为每个容器分配一个唯一的MAC地址。这样, 容器可以像物理设备一样直接与网络通信
5.4 启动 🛫🛫🛫
下面运行 docker-compose up 来启动容器, -d 则表示后台运行, 运行完成可通过 docker ps 验证容器是否启动
sudo docker compose up -d
以下是一些常用的
docker compose命令及其作用:
docker compose up: 构建、(重新)创建、启动并附加到容器docker compose down: 停止并删除容器、网络、卷和镜像docker compose build: 构建或重新构建服务docker compose start: 启动已存在的服务容器docker compose stop: 停止运行的服务容器docker compose restart: 重启服务容器docker compose logs: 查看服务的输出日志docker compose ps: 列出所有容器
5.5 修改 OpenWrt 登录 IP
默认情况下 Openwert 系统的 IP 为 10.0.0.1, 这里我希望调整为 192.168.0.222
- 进入容器内部(
OpenWrt内部)
sudo docker exec -it openwrt bash
- 修改
IP为, 容器的IP地址, 即:192.168.0.222
# 10.0.0.1 为默认地址, 192.168.0.222 是我们要设置的地址(也是我上面设置的容器地址)
sed -i 's/10.0.0.1/192.168.0.222/' /etc/config/network && /etc/init.d/network restart # 重启
六、Done
到处, OpenWrt 算是部署完成, 浏览器输入 OpwnWrt 容器 IP, 输入账号密码(默认账号密码都是 root), 即可进入系统
七、参考
- docker部署OpenWrt旁路由
- 让你的 Linux 云服务器也能科学上网!
- V2ray Linux客户端v2rayA使用教程和全局代理
- Ubuntu 24.04 (Server) on my Raspberry Pi 5 and eth0 will not work
大家好, 我是墨渊君, 如果您喜欢我的文章可以:
- 关注公众号: 「昆仑虚F2E」获取最新文章。
- GitHub: github.com/MoYuanJun
- 个人网站(昆仑虚, 虽然现在没啥东西): www.kunlunxu.cc