# 前言

之前就好奇什么是软路由旁路由,但是没有设备
正好看见通过 Docker 安装 Openwrt 的文章,跟着动手学习下

# 我的基本环境

matebook
VBox 虚拟机 ubuntu 镜像
网路设置
连接方式: 桥接网卡
网卡: WIFI 6
混杂模式: 全部允许

# 开启网卡混杂模式

# 查看网卡名称,如我的是 enp0s3
ifconfig
# 开启网卡混杂模式 
ip link set enp0s3 promisc on

# 开启 ipv4 转发

vim /etc/sysctl.conf 
#添加 net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf

# 配置 macvlan 模式的 Docker 网络

# --subnet=192.168.1.0/24   #填入宿主机网段
# --gateway=192.168.1.1     #网关
# parent=eth0    #宿主机 192.168.1.0/24 所使用的网卡
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=enp0s3 macnet
# 查看是否创建成功
docker network ls

# 创建网络配置文件

mkdir -p /home/docker/openwrt
vi /home/docker/openwrt/network

network 配置文件如下

其中修改 ipaddr,gateway,dns 为需要的地址。

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 '192.168.1.147'
        option gateway '192.168.1.1'
        option dns '192.168.1.1'
config interface 'vpn0'
        option ifname 'tun0'
        option proto 'none'

# 拉取镜像并初始化

# --privileged 使用该参数,container 内的 root 拥有真正的 root 权限。否则,container 内的 root 只是外部的一个普通用户权限。privileged 启动的容器,可以看到很多 host 上的设备,并且可以执行 mount。甚至允许你在 docker 容器中启动 docker 容器。
# --network 刚刚创建的 macvlan 网络  
# --ip 不冲突的 IP 地址  
# -v 映射目录 (这里映射的是网络配置)
# openwrt 镜像选择 nonnichen/nonniwrt 或 piaoyizy/openwrt-x86
docker run --restart always --name openwrt -d --network macnet --privileged --ip 192.168.1.147  -v /home/docker/openwrt/network:/etc/config/network nonnichen/nonniwrt /sbin/init

# 操作容器

# 进入容器
docker exec -it openwrt bash
# 编辑网络 (初始化容器时可以忽略映射网络配置目录,自己编辑网络)
vi /etc/config/network
# 重启网卡
/etc/init.d/network restart
# 修改密码命令(初始密码一般是 password, 可以根据需要修改)
passwd

# 访问 openwrt

http://192.168.1.147 (前面配置的容器 ip)
默认用户名:root
默认密码:password

# 进入 openwrt

进入 网络 =》接口 修改配置
没有特殊需要一般都关闭 ipv6 关闭 dhcp

# 无线网卡 + macvlan 组合有问题

虽然 openwrt 成功安装,但是发现容器内无法 ping 通网关,无法访问外网,可以 ping 通物理机
因为对 openwrt 和 macvlan 半懂不懂,只能边查询边配置,如 openwrt 中,不勾选桥接,防火墙规则等等,结果都不行

最后发现可能是无线网卡 + macvlan 组合的问题,由于用的笔记本只能用无线网卡,且只有 wifi 连接,没法继续测试。

  • https://www.saoniuhuo.com/question/detail-2371253.html
  • https://hicu.be/macvlan-vs-ipvlan
  • https://stackoverflow.com/questions/56900857/docker-network-macvlan-driver-gateway-unreachable/56918457#56918457

看了上面的问题答案,于是尝试使用 ipvlan,并且初始化一个轻型容器 busybox,发现可以正常 ping 通网关,访问外网

## 创建 ipvlan 
docker network create -d ipvlan --subnet 192.168.1.0/24 -o ipvlan_mode=l2 -o parent=enp0s3 ipvlan
## 初始化容器
docker run --net=ipvlan --ip=192.168.1.145 -id --name c1 busybox sh
## 进入容器
docker exec -it c1 sh

最后修改网络配置,重新初始化了一个关联 ipvlan 的 openwrt 容器
这里注释了 option type 'bridge',因为关联 ipvlan 网络时,发现类型为桥接时,网络配置失败

config interface 'loopback'
        option device '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 ipaddr '192.168.1.147'
        option ipv6 '0'
        option netmask '255.255.255.0'
        option gateway '192.168.1.1'
        option dns '192.168.1.1'
docker run --restart always --name openwrt -d --network ipvlan --privileged --ip 192.168.1.147  -v /home/docker/openwrt/network:/etc/config/network nonnichen/nonniwrt /sbin/init

# 参考链接

  • https://zhuanlan.zhihu.com/p/565520760
  • https://www.jianshu.com/p/d7fbbd165052
  • https://www.cfmem.com/2021/08/docker-openwrt.html#google_vignette
  • https://blog.csdn.net/ndd1996/article/details/109185747
更新于 阅读次数