今日天气
  1. 博客/

Docker 部署的 openWrt 软路由, 并解决无法与宿主机通信问题

·923 字·2 分钟· ·
fix openwrt n1 docker-compose docker openwrt
Johny
作者
Johny
熟练的 云原生搬砖师

环境说明
#

  • 宿主机 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"  # 更改后测试网络是否通畅

image-20210527102828331

默认 U/P: root:password

image-20210527103005072

容器与宿主机的通讯修复
#

造成原因及解决方法说明
#

    原因是部署 openWRT 系统时使用到了 dockermacvlan 模式,这个模式通俗一点讲就是在一张物理网卡上虚拟出两个虚拟网卡,具有不同的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

image-20210527103450010

确保开机自启脚本添加了 可执行 权限
#

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