目录
背景
最近需要用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 macvlan
的bridge
网络模式提升性能
确认宿主机网络接口名
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
为宿主机网段,并增加gateway
和dns
配置,指向主路由地址,配置如下:
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如何配置作为旁路由(网关),还需要其他的设置,详见此文章。