1.OpenWrt

1)打开网卡混杂模式

1
ip link set eth0 promisc on

2)创建OpenWrt网络(自行替换网段,网关)

1
docker network create -d macvlan --subnet=192.168.10.0/24 --gateway=192.168.10.1 -o parent=eth0 openwrt

3)下载镜像包至root

1
wget https://dl.openwrt.ai/releases/targets/meson/meson8b/openwrt-02.01.2024-meson-meson8b-thunder-onecloud-rootfs.tar.gz

(这是使用openwrt.ai的固件,如果想用最新版,可以自行替换链接)

4)生成镜像

1
docker import openwrt-02.01.2024-meson-meson8b-thunder-onecloud-rootfs.tar.gz onecloud/openwrt

5)安装并启动容器

1
docker run --restart always --name openwrt -d --network openwrt --privileged onecloud/openwrt /sbin/init

[此固件默认IP为10.0.0.1 密码root]

6)修改默认IP
①直接通过终端修改

1
2
3
4
5
6
#进入容器
docker exec -it openwrt bash
#打开网络配置文件
nano /etc/config/network
#重启网络
/etc/init.d/network restart

②修改电脑网段,在浏览器通过默认IP访问后修改

2.容器与宿主机的通讯修复

造成原因及解决方法说明

#

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

添加静态路由使宿主机与openWRT的通信报文使用mynet进行

#

1
ip route add 192.168.1.66 dev myne

写入开机自启动脚本中

#

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.1.100 dev mynet
ip link set mynet up
ip route add 192.168.1.66 dev mynet
EOF

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

#

复制

1
chmod a+x /etc/rc.local