# 前言
之前就好奇什么是软路由旁路由,但是没有设备
正好看见通过 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