├── Dockerfile └── README.md /Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lisaac/openwrt-in-docker/e3578161179049fcaaefaf100dfaf112b815ca07/Dockerfile -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker 中运行 openwrt 2 | 3 | [toc] 4 | 5 | # 思路 6 | 利用 `macvlan` 方式创建虚拟接口进行配置。 7 | 有感于来自恩山 betterman 及 rightwifi2017 两位大佬斐讯 N1 的玩法,也获得两位大佬的帮助,在此感谢两位大佬。 8 | 由于 N1 为单网卡,所以配置只能为单臂路由,本案为双网卡 `opewnrt` 9 | 10 | 机器拥有双网卡: `enp1s0` 及 `enp3s0` ,本案将 `enp3s0` 用作 `LAN` 口,`enp1s0` 用作 `WAN` 口。 11 | # 0. 安装 docker 12 | ``` 13 | curl -fsSL https://get.docker.com -o get-docker.sh 14 | sh get-docker.sh 15 | ``` 16 | # 1. 配置系统环境 17 | ``` 18 | #打开网卡混杂模式 19 | ip link set enp1s0 promisc on 20 | ip link set enp3s0 promisc on 21 | 22 | #加载 PPPOE 内核模块 23 | modprobe pppoe 24 | ```` 25 | # 2.docker 网络配置 26 | ``` 27 | # 为 docker 创建 macvlan 虚拟接口,并链接到 host 网卡 28 | # LAN 口 29 | docker network create -d macvlan \ 30 | --subnet=10.1.1.0/24 --gateway=10.1.1.254 \ 31 | --ipv6 --subnet=fe80::/16 --gateway=fe80::1 \ 32 | -o parent=enp3s0 \ 33 | -o macvlan_mode=bridge \ 34 | macvLan 35 | # WAN 口 36 | docker network create -d macvlan \ 37 | --subnet=192.168.254.0/24 --gateway=192.168.254.1 \ 38 | --ipv6 --subnet=fe81::/16 --gateway=fe81::1 \ 39 | -o parent=enp1s0 \ 40 | -o macvlan_mode=bridge \ 41 | macvWan 42 | ``` 43 | # 3. 创建容器 44 | ``` 45 | #导入镜像 46 | docker import https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/openwrt-19.07.0-x86-64-generic-rootfs.tar.gz openwrt:19.07.0 47 | 48 | #创建并启动容器 49 | docker run -d \ 50 | --restart unless-stopped \ 51 | --network macvLan \ 52 | --privileged \ 53 | --name openwrt \ 54 | openwrt:19.07.0 \ 55 | /sbin/init 56 | 57 | #将第二网卡的 macvlan 挂接到 openwrt 58 | docker network connect macvWan openwrt 59 | ``` 60 | # 4. 配置 openwrt 61 | ``` 62 | #进入容器 63 | docker exec -it openwrt /bin/sh 64 | 65 | #编辑 / etc/config/network 66 | config interface 'lan' 67 | option type 'bridge' 68 | option ifname 'eth0' # 需要与 docker netwrok 中的虚拟接口匹配(macvLan) 69 | option proto 'static' 70 | option ipaddr '10.1.1.254' 71 | option netmask '255.255.255.0' 72 | option ip6assign '60' 73 | 74 | config interface 'wan' 75 | option ifname 'eth1' # 需要与 docker netwrok 中的虚拟接口匹配(macvWan) 76 | option proto 'dhcp' 77 | option ip6assign '60' 78 | 79 | #重启 openwrt 网络 80 | /etc/init.d/network restart 81 | ``` 82 | # 5. 宿主机出口 83 | 由于 `docker` 网络采用 `macvlan` 的 `bridge` 模式,即使宿主机与容器在同一网段,相互之间也是无法通信的。 84 | 为了解决这个问题,需利用多个 `macvlan` 接口之间是互通的原理,在 `LAN` 口新建一个 `macvlan` 虚拟接口: 85 | 86 | ``` 87 | # 使用 ip 命令 88 | ip link add link enp3s0 mac30 type macvlan mode bridge # 在 enp3s0 接口下添加一个 macvlan 虚拟接口 89 | ip addr add 10.1.1.2/24 brd + dev mac30 # 为 mac30 分配 ip 地址 90 | ip link set mac30 up 91 | ip route del default #删除默认路由 92 | ip route add default via 10.1.1.254 dev mac30 # 设置静态路由 93 | echo "nameserver 10.1.1.1" > /etc/resolv.conf # 设置静态 dns 服务器 94 | 95 | # 或者使用 nmcli 96 | nmcli connection add type macvlan dev enp3s0 mode bridge ifname mac30 autoconnect yes save yes 97 | ``` 98 | 99 | 或者,若是在 debian 中可以编辑 `/etc/network/interface` 并加入: 100 | ``` 101 | auto mac30 102 | iface mac30 inet manual 103 | pre-up ip link add link enp3s0 mac30 type macvlan mode bridge 104 | pre-up ip addr add 10.1.1.250/24 brd + dev mac30 105 | up ip link set mac30 up 106 | post-up ip route del default 107 | post-up ip route del 10.1.1.0/24 dev enp3s0 108 | post-up ip route add default via 10.1.1.254 dev mac30 109 | post-down ip link del dev mac30 110 | ``` 111 | # 6. 配置客户端 IP&enjoy 112 | 后续就是 openwrt 的玩法,除了没有 wifi,其他基本一致。有一点,若需要加载内核模块,则需要在 host 中事先加载 113 | --------------------------------------------------------------------------------