环境说明
- 宿主机 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
1
|
apt install -y docker-compose # centos 操作系统更改为 yum
|
创建 docker-compose 部署文件
使用 docker 进行对应 dockerhub 地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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 容器
-
开启桥接网卡的 混淆模式
1
|
ip link set eth0 promisc on
|
-
docker-compose
启动容器
更改 openWrt 容器 ip
容器启动后,默认的 ip 地址使用的是 192.168.1.254
,与我们局域网网段不在一个段,这里需要去更改一下 ip 地址 和 网关地址。
1
2
3
4
|
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网卡重名)
1
|
ip link add mynet link eth0 type macvlan mode bridge
|
为该接口分配ip,并启用
1
2
|
ip addr add 192.168.8.10 dev mynet
ip link set mynet up
|
添加静态路由使宿主机与openWRT的通信报文使用mynet进行
1
|
ip route add 192.168.8.111 dev mynet
|
测试效果
1
2
3
|
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
|
写入开机自启动脚本中
1
2
3
4
5
6
|
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
|
确保开机自启脚本添加了 可执行
权限
1
|
chmod a+x /etc/rc.local
|
参考文档
https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/