Docker 部署的 openWrt 软路由并解决与宿主机通信问题
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 | #进入容器 |
②修改电脑网段,在浏览器通过默认IP访问后修改
2.容器与宿主机的通讯修复
造成原因及解决方法说明
原因是部署 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 | ip addr add 192.168.1.100 dev mynet |
添加静态路由使宿主机与openWRT的通信报文使用mynet进行
1 | ip route add 192.168.1.66 dev myne |
写入开机自启动脚本中
1 | cat >> /etc/rc.local << EOF |
确保开机自启脚本添加了 可执行
权限
复制
1 | chmod a+x /etc/rc.local |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 子墨の小屋!