1、镜像资料

资料地址:https://github.com/SuLingGG/OpenWrt-Docker

Github: https://github.com/SuLingGG/OpenWrt-Docker

DockerHub: https://hub.docker.com/r/sulinggg/openwrt

OpenWrt-Docker 项目基于 immortalwrt: openwrt-18.06-k5.4

官方仓库地址:https://github.com/immortalwrt/immortalwrt

镜像说明:

OpenWrt 标准镜像

OpenWrt 标准镜像为集成常用软件包的 Docker 镜像,镜像自带软件包可满足大多数情景下的使用需求。

支持设备/平台 DockerHub 阿里云镜像仓库 (上海)
树莓派 1B sulinggg/openwrt:rpi1 registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi1
树莓派 2B sulinggg/openwrt:rpi2 registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi2
树莓派 3B / 3B+ sulinggg/openwrt:rpi3 registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi3
树莓派 4B sulinggg/openwrt:rpi4 registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi4
armv7 sulinggg/openwrt:armv7 registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv7
arm8/aarch64 sulinggg/openwrt:armv8 registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8
x86_64/amd64 sulinggg/openwrt:x86_64 registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

OpenWrt-Mini 镜像

OpenWrt-Mni 镜像为几乎未添加额外软件包的 Docker 镜像,你可以自行通过 opkg 安装你需要的软件包。

支持设备/平台 DockerHub 阿里云镜像仓库 (上海)
树莓派 1B sulinggg/openwrt-mini:rpi1 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:rpi1
树莓派 2B sulinggg/openwrt-mini:rpi2 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:rpi2
树莓派 3B / 3B+ sulinggg/openwrt-mini:rpi3 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:rpi3
树莓派 4B sulinggg/openwrt-mini:rpi4 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:rpi4
armv7 sulinggg/openwrt-mini:armv7 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:armv7
arm8/aarch64 sulinggg/openwrt-mini:armv8 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:armv8
x86_64/amd64 sulinggg/openwrt-mini:x86_64 registry.cn-shanghai.aliyuncs.com/suling/openwrt-mini:x86_64

2、安装教程

2.1 镜像下载

根据自己的硬件平台进行下载

docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

2.2 网络准备

方式一:独立mac地址,独立ip

# 查看自己的网卡
ifconfig

eth0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1492
        inet 172.29.250.28  netmask 255.255.240.0  broadcast 172.29.255.255
        inet6 fe80::215:5dff:fead:7b24  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:ad:7b:24  txqueuelen 1000  (Ethernet)
        RX packets 15950  bytes 17196963 (17.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7604  bytes 538857 (538.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

或者使用 ip addr

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1492 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:ad:7b:24 brd ff:ff:ff:ff:ff:ff
    inet 172.29.250.28/20 brd 172.29.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fead:7b24/64 scope link
       valid_lft forever preferred_lft forever

根据自己的网卡名称(一般是eth0ens33之类的),使用docker创建虚拟网卡,并配置网络信息,注意下面的 172.168.0.0/24 根据自己的宿主机网络段设置。

docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 opwrtnet

命令解释:此命令使用Docker创建一个名为opwrtnetmacvlan网络

macvlan是一种Linux内核网络虚拟化技术,它可以用于创建和管理虚拟网络接口。它可以为每个虚拟机或容器创建一个与主机物理网卡绑定的虚拟网卡,并且每个虚拟机或容器都有自己的IP地址。这使得虚拟机或容器能够直接和物理网络中的其他设备通信,就像它们是直接连接在物理网络上一样

查看

docker network ls

6e1a0e16742d   bridge            bridge    local
136b63f0da30   host              host      local
3b647a96f9dc   opwrtnet          macvlan   local  #就是这个
b0265f7d9516   none              null      local

方式二:使用docker桥接,创建子网,并指定ip

docker network create --subnet=172.168.0.0/24 --gateway=172.168.0.1 opwrtnet

方式三:直接使用默认网络,不指定ip,映射容器端口到宿主机

这里分为创建独立的docker网络和不创建的方式

如创建独立的桥接网络(不指定子网和网关,使用默认),如下:

docker network create opwrtnet

2.3 初始化配置准备

运行一个未做任何准备的容器

docker run --name openwrt -d \
--privileged \
registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

使用docker ps查看容器运行状态,确保容器已正常运行

创建openwrt配置文件存放路径

mkdir -p /data/openwrt/config

复制初始容器中的配置文件

docker cp openwrt:/etc/config/. /data/openwrt/config

停止并移除初始化配置用的容器

docker stop openwrt && docker rm openwrt

修改网络配置文件,这里根据自己的需要设置(下面是设置wan口的方式)

vi /data/openwrt/config/network

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth1'
        option proto 'static'
        option ipaddr '10.16.0.1'
        option netmask '255.255.255.0'
        option delegate '0'

config interface 'wan'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '172.18.0.2'     # 这里替换为 openwrt 容器的 ip 地址
        option netmask '255.255.255.0'
        option gateway '172.18.0.1'    # 这里替换为 openwrt 容器的 网关 地址
        option dns '8.8.8.8'           # 这里替换为 dns 地址,我这里使用 公共的

config interface 'vpn0'
        option ifname 'tun0'
        option proto 'none'

设置为lan口的方式

config  interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option packet_steering '1'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option ipaddr '172.18.0.2'  # 这里替换为 openwrt 容器的 ip 地址
        option gateway '172.18.0.1' # 这里替换为 openwrt 容器的 网关 地址
        option dns '8.8.8.8'        # 这里替换为 dns 地址,我这里使用 公共的

config interface 'vpn0'
        option ifname 'tun0'
        option proto 'none'

修改防火墙配置,允许wan口访问openwrt的web界面

vi /data/openwrt/config/firewall

找到如下部分,将其中的REJECT替换为ACCEPT

config defaults
        option syn_flood '1'
        option input 'ACCEPT' # 替换为`ACCEPT`
        option output 'ACCEPT'
        option forward 'ACCEPT' # 替换为`ACCEPT`
        option flow_offloading '0'
        option flow_offloading_hw '0'
        option fullcone '0'

...

config zone
        option name 'wan'
        list network 'wan'
        list network 'wan6'
        option input 'ACCEPT'  # 替换为`ACCEPT`
        option output 'ACCEPT'
        option forward 'ACCEPT' # 替换为`ACCEPT`
        option masq '1'
        option mtu_fix '1'

2.4 运行 openwrt 容器

方式一:独立mac地址,独立ip 运行

下面的ip替换为网络准备中 对应方式中,你需要设置的ip

docker run --restart always \
--name openwrt -d \
--network opwrtnet \
--ip 192.168.1.6 \
--user=root \
--privileged \
-v /data/openwrt/config:/etc/config \
registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

此方式,只要访问电脑和 openwrt 容器 中配置的 ip 在一个网段 或者有做路由,即可直接使用 openwrt 容器 ip 进行访问。

方式二:使用docker桥接,创建子网,并指定ip

docker run --restart always \
--name openwrt -d \
--network opwrtnet \
--ip 172.168.0.254 \
--user=root \
--privileged \
-v /data/openwrt/config:/etc/config \
registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

此方式,宿主机中可以直接访问 openwrt 容器 ip 地址,如是与宿主机 相同网端的 其他主机要访问,则需要增加静态路由

增加静态路由的方式,后面的 192.168.85.150 为宿主机 ip

# linux中
sudo ip route add 172.168.0.0/24 via 192.168.85.150

# 移除
sudo ip route delete 172.168.0.0/24

# windows中
route ADD 172.168.0.0 MASK 255.255.255.0 192.168.85.150
# 永久
route -p add 172.168.0.0 mask 255.255.255.0 192.168.126.150

# 移除
route DELETE 172.168.0.0

使用以上方式添加后,可能会出现能够ping通172.168.0.1,但是ping不通172.168.0.254的问题

这是由于没有将docker网桥的接口添加到外部域,如下方式添加外部域

# iptables方式
sudo iptables -A FORWARD -i docker0 -j ACCEPT
sudo iptables -A FORWARD -o docker0 -j ACCEPT

# firewall方式
firewall-cmd --permanent --zone=external --change-interface=docker0

有可能还需要对172.168.0.0/24网段做伪装IP设置:

# iptables方式
sudo iptables -t nat -A POSTROUTING -s 172.168.0.0/24 -o eth0 -j MASQUERADE

# firewall方式
firewall-cmd --permanent --zone=external --add-rich-rule='rule family=ipv4 source address=172.168.0.0/24 masquerade'

网络转发设置

# iptables方式
sudo iptables -t nat -A POSTROUTING -s 172.168.0.0/24 -j SNAT --to-source 172.168.0.1

# firewall方式
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 172.168.0.0/24 -j SNAT --to-source 172.168.0.1

方式三:直接使用默认网络,不指定ip,映射容器端口到宿主机

wsl 中 貌似只能使用这种方式

如没有创建虚拟网络,则下面的 --network opwrtnet 不需要

docker run --restart always \
--name openwrt -d \
-p 88:80 \
-p 8022:22 \
--network opwrtnet \
--user=root \
--privileged \
-v /data/openwrt/config:/etc/config \
registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

此方式运行的openwrt容器,需要访问的openwrt端口,都要提前先映射出来,否则,每次增加端口映射,都需要先停止移除容器后,再次增加端口映射后,再次运行。

备注:将容器内的配置文件挂载到宿主机后,openwrt容器运行时,必须指定--user=root身份,否则可能会出现接口配置保存应用不生效的问题。

docker exec -it openwrt bash
作者:admin  创建时间:2024-05-12 17:39
最后编辑:admin  更新时间:2024-05-13 19:28