Docker部署Macvlan的OpenWrt与ADG做旁路由并与宿主机通信

下载docker镜像

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

建立macvlan

docker network create -d macvlan --subnet=192.168.123.0/24 --gateway=192.168.123.1 -o parent=enp4s0f1 macnet

开启网卡混杂模式

ifconfig enp4s0f1 promisc

方法一

建立OpenWrt的配置文件

mkdir -p /opt/openwrt

vim /opt/openwrt/network

按自己的网络情况修改内容

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 ''
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ipaddr '192.168.123.10'
option gateway '192.168.123.1'
option dns '192.168.123.1'

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

运行Docker run启动容器

docker run --restart always --name openwrt -d --network macnet --privileged --ip 192.168.123.10 -v /opt/openwrt/network:/etc/config/network registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

在【网络】-【防火墙】-【自定义规则】增加规则:

iptables -t nat -I POSTROUTING -j MASQUERADE

方法二

运行Docker run启动容器

docker run --restart always --name openwrt -d --network macnet --privileged --ip 192.168.123.10 -v /opt/openwrt/network:/etc/config/network registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init

创建docker后进入容器

docker exec -it openwrt /bin/bash

vim /etc/config/network

按自己的网络情况修改内容

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.123.10'
option gateway '192.168.123.1'
option dns '192.168.123.1'

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

重启容器,进入web页面

将【网络】-【接口】-【物理设置】,将【桥接接口】选项去掉

在【网络】-【防火墙】-【自定义规则】增加规则:

iptables -t nat -I POSTROUTING -j MASQUERADE

安装ADG

使用以下docker run命令直接安装

docker run --name AdGuard_Home -d --network school --privileged --ip 192.168.123.5 -v /opt/AdGuard_Home/work:/opt/adguardhome/work -v /opt/AdGuard_Home/conf:/opt/adguardhome/conf --restart=always -d adguard/adguardhome

设置宿主机与Docker通信

配置一个.sh

例如:vi /home/macvlan-setup.sh

输入以下内容

!/bin/bash

ifconfig enp4s0f1 promisc
ip link add macvlan-proxy link enp4s0f1 type macvlan mode bridge
ip addr add 192.168.123.20 dev macvlan-proxy
ip link set macvlan-proxy up
ip route add 192.168.123.10 dev macvlan-proxy
ip route add 192.168.123.5 dev macvlan-proxy

可以依据需要继续添加容器的地址,例如:

ip route add 192.168.123.XXX dev macvlan-proxy

enp4s0f1是物理网卡的名称

192.168.123.20是宿主机通信地址,可以是其他地址也可以是物理网卡的地址

如果旁路由被DHCP做为网关需要添加

route add default gw 192.168.123.10 macvlan-proxy

添加执行权限

chmod +x /home/macvlan-setup.sh

创建systemctl

vi /etc/systemd/system/macvlan-setup.service

填入

[Unit]
Description=Setup Macvlan Network
After=network.target

[Service]
Type=oneshot
ExecStart=/home/macvlan-setup.sh

[Install]
WantedBy=multi-user.target

启动这个守护进程

sudo systemctl enable macvlan-setup.service

sudo systemctl start macvlan-setup.service

现在openwrt和adg容器是全功能且能与宿主机通信的状态