配置Docker OpenWrt与宿主机网络互通且作为宿主机网关

目录


背景

最近需要用Docker版的Openwrt作为旁路由(网关),在配置过程中遇到一些问题,通过查阅资料,最终完美解决。现在将整体方案和具体操作步骤贴到这里分享给大家

环境

这里我使用的环境如下:

  • 宿主机操作系统:Armbian
  • 宿主机ip:192.168.5.2
  • 宿主机新macvlan接口ip:192.168.5.3
  • Docker镜像:unifreq/openwrt-aarch64
  • Docker ip(macvlan):192.168.5.10
  • 网段:192.168.5.0/24
  • 主路由ip:192.168.5.1

操作步骤

Docker安装OpenWrt

这里我使用docker macvlanbridge网络模式提升性能

确认宿主机网络接口名

bash 复制代码
ifconfig

以我的返回为例,这里是eth0

复制代码
eth0: flags=4419<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.2  netmask 255.255.255.0  broadcast 192.168.5.255
        inet6 xxxxxxxxxxx  prefixlen 64  scopeid 0x20<link>
        ether d2:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 10762458  bytes 10675054731 (10.6 GB)
        RX errors 0  dropped 164956  overruns 0  frame 0
        TX packets 6366329  bytes 10052966588 (10.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 65  

创建macvlan网络

开启桥接网卡的混淆模式

在宿主机输入下面命令

bash 复制代码
ip link set eth0 promisc on

再一次ifconfig接口名查看是否成功开启。如果对应接口有PROMISC证明已成功开启

复制代码
eth0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 192.168.5.2  netmask 255.255.255.0  broadcast 192.168.5.255
        inet6 xxxxxxxxxxx  prefixlen 64  scopeid 0x20<link>
        ether d2:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 10762458  bytes 10675054731 (10.6 GB)
        RX errors 0  dropped 164956  overruns 0  frame 0
        TX packets 6366329  bytes 10052966588 (10.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 65  
为docker创建macvlan网络
bash 复制代码
docker network create -d macvlan --subnet=192.168.5.0/24 --gateway=192.168.5.1 -o parent=eth0 macnet

创建OpenWrt容器

在宿主机执行

bash 复制代码
docker run --restart always --name openwrt -d --network macnet --privileged unifreq/openwrt-aarch64:latest /sbin/init
登录容器更改ip网段

宿主机执行下面命令进入容器终端

bash 复制代码
docker exec -it openwrt bash

在容器终端下,修改/etc/config/network文件,修改ipaddr为宿主机网段,并增加gatewaydns配置,指向主路由地址,配置如下:

bash 复制代码
config interface 'lan'
		option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '192.168.5.10'
        option dns '192.168.5.1'
        option gateway '192.168.5.1'
        option netmask '255.255.255.0'
重启network生效配置

容器下执行,

bash 复制代码
/etc/init.d/network restart

然后ifconfig相应的接口名,看配置是否生效,并测试是否可以访问互联网

bash 复制代码
ping -c 3 baidu.com

与宿主机网络互通

在用上述配置创建完OpenWrt docker后,虽然宿主机和容器在同一网段,但是因为macvlan模式的限制,宿主机与容器是无法互相通信的(但与同网段下的其他机器是可以相互通信的),所以需要在宿主机创建一个新的macvlan接口,然后增加一条宿主机macvlan访问容器macvlan的静态路由。

在宿主机终端执行下面代码,

注:macvlan-proxy这个接口名称可以随便起,只需要每条命令的名字保持一致即可

宿主机创建新的macvlan接口

bash 复制代码
ip link add macvlan-proxy link eth0 type macvlan mode bridge

为新接口分配ip并启用

bash 复制代码
ip addr add 192.168.5.3 dev macvlan-proxy
ip link set macvlan-proxy up

添加静态路由使宿主机与容器使用新接口通信

bash 复制代码
ip route add 192.168.5.10 dev macvlan-proxy

配置新接口的默认网关为容器地址

bash 复制代码
route add default gw 192.168.5.10 macvlan-proxy

测试是否能ping通

在宿主机执行,

bash 复制代码
# 宿主机-->OpenWrt容器
ping 192.168.5.10 -c 3
# OpenWrt容器-->宿主机
docker exec -it openwrt bash -c "ping 192.168.5.3 -c 3"

如果可以相互ping通,则证明设置没问题。

加入启动项自启动

上述命令会在宿主机重启后失效,为了每次重启宿主机均可自动运行上述命令,需要编辑/etc/rc.local文件,将上面的命令粘贴到exit 0之前

bash 复制代码
ip link set eth0 promisc on > /dev/null 2>&1
ip link add macvlan-proxy link eth0 type macvlan mode bridge
ip addr add 192.168.5.3 dev macvlan-proxy
ip link set macvlan-proxy up
ip route add 192.168.5.10 dev macvlan-proxy
route add default gw 192.168.5.10 macvlan-proxy

最后,确保为/etc/rc.local文件增加了可执行权限且rc-local.service是自启动的状态

bash 复制代码
chmod a+x /etc/rc.local
systemctl enable rc-local

至此,Docker OpenWrt与宿主机网络互通配置已完成,可重启后验证是否生效。

备注

本文只介绍了如何配置Docker OpenWrt与宿主机网络互通,以及如何作为宿主机网关,至于OpenWrt如何配置作为旁路由(网关),还需要其他的设置,详见此文章


参考资料1
参考资料2
参考资料3

相关推荐
chicheese21 分钟前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
Linux-lucky1 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
vortex52 小时前
常用终端模拟器全面对比:Kitty、WezTerm、Ghostty 与 Konsole
linux
迪康Defender2 小时前
终端安全实战:如何高效解决企业U盘泄密与管控难题
运维·网络·安全·web安全·终端安全管理
网安小学生(兼顾数据库版)2 小时前
固件+软件供应链:ONEKEY+Mend如何实现全链路安全覆盖
网络·安全·web安全
INGNIGHT3 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
zly35003 小时前
VMware Converter Standalone 物理机转化为虚拟机后源1硬盘变成了2个硬盘(2个硬盘文件)虚拟机无法启动。
linux·运维·服务器
学习中的码虫3 小时前
网络编程5
服务器·网络
GPU实战笔记4 小时前
本地跑不动 llama.cpp,临时租云 GPU 怎么搭?从启动服务到环境复用
java·服务器·网络·人工智能·深度学习·llama
发量惊人的中年网工4 小时前
2026年DDoS防护方案怎么选?从攻击响应、清洗位置到成本账单,解析全球高防方案
大数据·网络·安全·ddos