- 博客/
Docker 部署的 openWrt 软路由, 并解决无法与宿主机通信问题
作者
Johny
熟练的 云原生搬砖师
Table of Contents
环境说明#
- 宿主机 IP:192.168.8.102
- Docker 内 openWrt macvlan ip: 192.168.8.111
- 主路由网关:192.168.8.1
- 机器网段为: 192.168.8.0/24
- docker 使用容器:
raymondwong/openwrt_r9:21.2.1-arm64
- 操作系统:
ARMBIAN
docker 部署 openWrt 软路由#
安装 dokcer-compose#
apt install -y docker-compose # centos 操作系统更改为 yum
创建 docker-compose 部署文件#
使用 docker 进行对应 dockerhub
地址
mkdir -p /data/docker-compose/openwrt/
cd /data/docker-compose/openwrt/
ip a # 查询对应需要绑定的网卡
cat > docker-compose.yaml << EOF
version: '2'
services:
openwrt:
image: raymondwong/openwrt_r9:21.2.1-arm64 # 这里是使用的 arm 架构镜像,如是 x86架构这里需要做一下更改
container_name: openwrt_r9
privileged: true
restart: always
networks:
openwrt_macnet:
ipv4_address: 192.168.8.111
networks:
openwrt_macnet:
driver: macvlan
driver_opts:
parent: eth0 # 对应桥接的网卡
ipam:
config:
- subnet: 192.168.8.0/24
ip_range: 192.168.8.220/25
gateway: 192.168.8.1
EOF
docker 启动 openwrt 容器#
开启桥接网卡的 混淆模式
ip link set eth0 promisc on
docker-compose
启动容器docker-compose up -d
更改 openWrt 容器 ip#
容器启动后,默认的 ip 地址使用的是
192.168.1.254
,与我们局域网网段不在一个段,这里需要去更改一下 ip 地址 和 网关地址。
docker exec -it openwrt_r9 bash -c "sed -i 's#192.168.1.254#192.168.8.111#g;s#192.168.1.1#192.168.8.1#g' /etc/config/network" \
&& docker restart openwrt_r9
docker exec -it openwrt_r9 bash -c "ping -c 3 baidu.com" # 更改后测试网络是否通畅
默认 U/P:
root:password
容器与宿主机的通讯修复#
造成原因及解决方法说明#
原因是部署 openWRT 系统时使用到了
docker
的macvlan
模式,这个模式通俗一点讲就是在一张物理网卡上虚拟出两个虚拟网卡,具有不同的MAC地址,可以让宿主机和docker同时接入网络并且使用不同的ip,此时 docker 可以直接和同一网络下的其他设备直接通信,相当的方便,但是这种模式有一个问题,宿主机和容器是没办法直接进行网络通信的,如宿主机ping容器的ip,尽管他们属于同一网段,但是也是ping不通的,反过来也是。因为该模式在设计的时候,为了安全禁止了宿主机与容器的直接通信,不过解决的方法其实也很简单——宿主机虽然没办法直接和容器内的macvlan
接口通信,但是只要在宿主机上再建立一个macvlan
,然后修改路由,使数据经由该macvlan
传输到容器内的macvlan
即可,macvlan
之间是可以互相通信的。
具体步骤记录#
以下操作都在小钢炮宿主机上运行
新增一个mynet的
macvlan
接口 (注意不要和原容器的macvlan网卡重名)#
ip link add mynet link eth0 type macvlan mode bridge
为该接口分配ip,并启用#
ip addr add 192.168.8.10 dev mynet
ip link set mynet up
添加静态路由使宿主机与openWRT的通信报文使用mynet进行#
ip route add 192.168.8.111 dev mynet
测试效果#
docker exec -it openwrt ping 192.168.8.102 -c 3
PING 192.168.8.102 (192.168.8.102): 56 data bytes
64 bytes from 192.168.8.102: seq=0 ttl=64 time=0.508 ms
写入开机自启动脚本中#
cat >> /etc/rc.local << EOF
ip link add mynet link eth0 type macvlan mode bridge
ip addr add 192.168.8.10 dev mynet
ip link set mynet up
ip route add 192.168.8.111 dev mynet
EOF
确保开机自启脚本添加了 可执行
权限#
chmod a+x /etc/rc.local
参考文档#
https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/
相关文章
Kind 部署本地k8s集群的使用记录
·326 字·1 分钟·
k8s
docker
devops
centos7
kind