【2022.04.21】在docker中搭建openwrt软路由系统,实现多网口以及主路由功能


【2022.04.21】在docker中搭建openwrt软路由系统,实现多网口以及主路由功能

前言

没搞完,不知道为啥一直重启,下次再补上这篇博客

因为大多docker搭建软路由时,实现的是旁路由单网口的拓扑

这次想要尝试下多网口搭建openwrt,以便实现主路由功能

本次使用的docker镜像:raymondwong/openwrt_r9 - Docker Image | Docker Hub

网口设置

先用ifconfig查看一下接口名称,我这里是enp2s0与enp3s0

那么将对应的网卡启动混淆模式

ip link set enp3s0 promisc on
ip link set enp2s0 promisc on

后期要关闭的话,把on改成off

为了以防万一,比如外接网卡可能在服务器重启后失效,那么还要加入开机自启动

nano /etc/init.d/iplinkset.sh

将上面的两句命令,和脚本规范开头一起复制进来

#!/bin/sh
ip link set enp3s0 promisc on
ip link set enp2s0 promisc on

ctrl+x y entel 保存退出

增加可执行权限

chmod +x /etc/init.d/iplinkset.sh

设置开机启动

update-rc.d iplinkset.sh defaults

如果想要删除这个启动项

update-rc.d -f iplinkset.sh remove

虚拟网卡

  • 我们现在要基于现有的网卡创建两个 macvlan 类型的网卡,这样后面创建的容器才能有网卡进行挂载使用,并且使用独立的网卡进行数据报文的通讯。macnet1 我们作为后面 openWRT容器 运行的 Wan口 使用, macnet2 则是 Lan口
  • OPENWRT 使用网络说明
    • wan: 192.168.1.0/24
    • lan:192.168.22.0/24

macvlan模式

docker 的 macvlan 模式,这个模式通俗一点讲就是在一张物理网卡上虚拟出两个虚拟网卡,具有不同的MAC地址,可以让宿主机和docker同时接入网络并且使用不同的ip,此时 docker 可以直接和同一网络下的其他设备直接通信,相当的方便,但是这种模式有一个问题,宿主机和容器是没办法直接进行网络通信的,如宿主机ping容器的ip,尽管他们属于同一网段,但是也是ping不通的,反过来也是。因为该模式在设计的时候,为了安全禁止了宿主机与容器的直接通信,不过解决的方法其实也很简单——宿主机虽然没办法直接和容器内的 macvlan 接口通信,但是只要在宿主机上再建立一个 macvlan,然后修改路由,使数据经由该 macvlan 传输到容器内的 macvlan 即可,macvlan 之间是可以互相通信的。

创建网络

因为我现在双网口只接了一条,这条是入网的wan口,且在enp3s0上

因此在shell中输入以下命令

docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=enp3s0 macnet1

可以在可视化界面见到新建的网络

建立lan口的网络,这里我还没接上线

docker network create -d macvlan -o parent=enp2s0 macnet2

同理也是进入可视化界面验证一下

创建容器

输入以下命令

这句命令可以让现在未接入的LAN口分配地址192.168.1.254

docker run --name openwrt --restart always -d --network macnet2 --privileged -v /lib/modules:/lib/modules raymondwong/openwrt_r9:autobuild-main-x86_64 /sbin/init

输完这条命令后,可以进入192.168.1.254,默认密码password

参考链接

Docker 部署多网口 openWrt 软路由 - 「Yang'zun」PlayGround (treesir.pub)

Docker 部署的 openWrt 软路由, 并解决无法与宿主机通信问题 - 「Yang'zun」PlayGround (treesir.pub)

Docker跨主机通信之macvlan · Docker实战 (baoshu.red)