<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="根据esir固件制作openwrt docker镜像">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2023-07-15 20:52<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
根据esir固件制作openwrt docker镜像


很多人喜欢用docker来运行openwrt，但市面上的openwrt docker镜像很少，有些人都把精力放在自己编译openwrt固件上去了，这样就造成需要使用docker openwrt镜像的人被逼得只能去搭建个虚拟机来进行安装openwrt。今天我就来教大家怎么把别人制作好的openwrt固件来做成docker openwrt镜像。


例如：系统:Centos Debian Ubuntu （命令都一样）


需要用的固件:esir精品小包 秋季K54版[2022] 固件包名字是openwrt-spp-k54-autumn[2022]-x86-64-generic-squashfs-legacy.img.gz


1、去esir google网盘下载固件包，在这个地址里选esir SPP精品小包,选最新的,目前最新的是04 Autumn[2022]。然后把下好的openwrt固件包丢到linux虚拟机里。


2、制作docker openwrt镜像包




XML/HTML代码


    [root@myvps ~]# mkdir openwrt

    [root@myvps ~]# cd openwrt

    [root@myvps openwrt]# cp ~/openwrt-spp-k54-autumn[2022]-x86-64-generic-squashfs-legacy.img.gz .

    [root@myvps openwrt]# gunzip openwrt-spp-k54-autumn[2022]-x86-64-generic-squashfs-legacy.img.gz

    [root@myvps openwrt]# fdisk openwrt-spp-k54-autumn[2022]-x86-64-generic-squashfs-legacy.img -l




以上其实就是给openwrt固件包解压然后查看img信息，是不是建立一个openwrt目录，其实无所额。看到如下提示：




XML/HTML代码


    Disk openwrt.img: 516.5 MiB, 541589504 bytes, 1057792 sectors

    Units: sectors of 1 * 512512 = 512 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disklabel type: dos

    Disk identifier: 0x908adea6

     

    Device       Boot Start     End Sectors  Size Id Type

    openwrt.img1 *      512   33279   32768   16M 83 Linux

    openwrt.img2      33792 1057791 1024000  500M 83 Linux




为了显示清晰，我将固件名称修改为openwrt.img，然后查看信息。其实可以本地解压后改名openwrt.img上传到root目录。




XML/HTML代码


    fdisk openwrt.img -l




记下Boot  Start下面的两个数据，然后计算 512 * 33792 ，把得到数值记录下来就好。




XML/HTML代码


    [root@myvps]# echo $((33792*512))

    17301504

    [root@myvps]# mkdir op

    [root@myvps]# mount -o loop,offset=17301504 openwrt.img ./op

    [root@myvps]# tar czf openwrt.tar.gz -C ./op .

    [root@myvps]# docker import openwrt.tar.gz  rocdk890/openwrt-x86-64




最后把打包好的docker 镜像上传到docker hub 。




XML/HTML代码


    [root@myvps]# docker push rocdk890/openwrt-x86-64




接下来你就可以把docker openwrt镜像运行起来了。


3、打开网卡混杂模式




XML/HTML代码


    ip link set eth0 promisc on




4、创建网络




XML/HTML代码


    docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet




请根据你自己的网卡名字和网段进行修改subnet gateway paarent这3个参数。


5、启动docker openwrt




XML/HTML代码


    docker run --restart always --name openwrt -d --network macnet --privileged rocdk890/openwrt-x86-64 /sbin/init





也可以直接制定openwrt的IP




XML/HTML代码


    docker run --restart always --name openwrt -d --network macnet --ip 192.168.0.111 --privileged rocdk890/openwrt-x86-64 /sbin/init






6、进入容器并修改相关参数


如果未指定openwrt的ip需要进入容器命令设置ip




XML/HTML代码


    docker exec -it openwrt sh





XML/HTML代码


    vi /etc/config/network

    config interface 'lan'

        option ifname 'br-lan'

        option proto 'static'

        option ipaddr '192.168.0.111'

        option netmask '255.255.255.0'

        option delegate '0'

        option gateway '192.168.0.1'

        option broadcast '192.168.0.0'

        option dns '192.168.0.1'

    保存后,重启网络 /etc/init.d/network restart




其实任何openwrt可以直接使用ifconfig命令设置一个临时ip（重启失效），就可以直接web登录修改，省去命令的烦恼。




XML/HTML代码


    ifconfig br-lan 192.168.0.111  





最后使用浏览器访问：http://192.168.0.111


默认账号：root


默认密码：password




7、登录 web 界面后，请进入 &ldquo;网络&rdquo; -&gt; &ldquo;接口&rdquo; -&gt; &ldquo;LAN&rdquo; -&gt; &ldquo;修改&rdquo;，检查最下方 &ldquo;基本设置&rdquo; 中的 &ldquo;忽略此接口&rdquo; 要是勾选状态，如果不是，请修改保存。


8、如何使用 openwrt 作为旁路由？


到这一步应该就知道该怎么做了，这里也简单记录一下几种方案，根据所需情况进行选择：


方法①：可以修改主路由的 dhcp 配置，将其下发的网关与DNS改为 openwrt 的 ip 地址


方法②：关闭主路由的 dhcp，打开 openwrt 的 dhcp，由 openwrt 来分配网络中的 ip 地址和下发相关信息


方法③：直接修改设备上的网络信息，不从 dhcp 获取，直接手动填写 


9、使用 openwrt 做旁路由后，在 openwrt 中检测网络通畅，但设备不能正常上网？


应该是 openwrt 防火墙的配置问题，因为 docker 的网络环境可能跟正常的硬件网络环境还有些许区别，目前在网上找到以下几个解决方案：


首先进入&ldquo;网络&rdquo;-&gt;&ldquo;防火墙&rdquo;


方法①：在&ldquo;基本设置&rdquo;中，&ldquo;转发&rdquo; 的选项从 &ldquo;拒绝&rdquo; 改为 &ldquo;接受&rdquo; 试试


来自：https://github.com/SuLingGG/blog-comments/issues/2#issuecomment-903896998


方法②：&ldquo;自定义规则&rdquo;中，注释规则 &ldquo;iptables -t nat -I POSTROUTING -j MASQUERADE&rdquo; 试试


来自：https://github.com/SuLingGG/OpenWrt-Docker/issues/13


方法③：&ldquo;自定义规则&rdquo;中，添加规则 &ldquo;iptables -I FORWARD -j ACCEPT&rdquo;、&ldquo;iptables -I INPUT -j ACCEPT&rdquo; 试试


来自：https://www.bilibili.com/video/BV1d3411J7bp


到这里就可以正常使用了。 




参考1   参考2


 




PVE使用LXC搭建openwrt


1、制作LXC容器模板


其实方式跟制作docker openwrt镜像差不多的。同样上传openwrt.img到root目录下，运行以下命令。






XML/HTML代码


    Total_size=$((`fdisk -l openwrt.img|grep .img2|awk '{print $2}'` * 512))

    mkdir op

    mount -o loop,offset=$Total_size openwrt.img ./op

    tar czf openwrt-rootfs.tar.gz -C ./op .





然后把制作好的模板上传或复制到PVE的CT模板目录/var/lib/vz/template/cache






XML/HTML代码


    scp ./openwrt-rootfs.tar.gz root@192.168.1.254:/var/lib/vz/template/cache/





2、新建LXC容器


通过SSH或者是网页端打开PVE终端，执行以下命令创建新容器






XML/HTML代码


    pct create 102 local:vztmpl/openwrt-rootfs.tar.gz --rootfs local-lvm:5 --ostype unmanaged --hostname CTOpenWrt --arch amd64 --cores 2 --memory 2048 --swap 0 -net0 bridge=vmbr0,name=eth0





pct create：容器创建命令


102：容器ID，可根据自己情况设定


local:vztmpl/openwrt-rootfs.tar.gz： 为第三步骤所得到的固件包名称


--rootfs：模版为rootfs文件


local-lvm:5 ：后面的数字代表分配的磁盘大小，比如我这里设置的为5，即为即将创建的容器分配2G的大小


--ostype unmanaged：操作系统类型，这里没有填写指定的操作系统（不会影响）


--hostname CTOpenWrt：主机名，也就是虚拟机名称


--arch amd64：设置为64位


--cores 2：分配给容器的核心数（我不知道这里是不是和docker一样，为最大限制）


--memory 2048：分配给容器最大的内存数量


--swap 0：交换分区设置为0


-net0 bridge=vmbr0,name=eth0：网卡，这里一定要设置，不然你的op没有办法连接到pve的虚拟交换机。






因为我是用来做旁路由的,所以就不需要再设置个网口来拨号。


3、最后启动LXC容器


进入web控制台启动CT OpenWrt。




</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
