关于基于 docker 部署 openwrt

2023-04-20 15:54:16 +08:00
 JOKERdmb

我先陈述一下环境吧!

硬件:畅网双网口软路由 系统:ubuntu 22.04 网络环境:学校工位,通过一个静态 ip 上网(只有一个静态 ip ),软路由的 eth0 连接到外网。eth1 连接了一个小交换机。

各位大佬帮帮忙,卡在这个问题上好久好久了。自编译了一个支持 docker 部署的 openwrt 镜像,但是不想在真机上部署,想把它部署在 docker 上。现在搜了好多好多教程,基本的配置方法大概是: 1 、开启网卡混杂模式 2 、创建一个 macvlan 的虚拟网络,然后将 lan 口(在我的机器上是 eth1 )加入这个 macvlan 的网络 这两步已经成功,并且能够进入 web 管理界面,但是现在的问题就是,我不知道该如何配置 wan 口也就是上网的口(在我的机器上是 eth0 ),看了好多教程都是开启 DHCP 等待分配,但是学校工位的网络是给一个网口给一个静态 ip ,没找到类似这种的教程,望大佬们帮帮忙给小弟一个具体的 Docker 部署 openwrt 的方法,万分感谢!

3516 次点击
所在节点    宽带症候群
21 条回复
Projection
2023-04-21 12:37:08 +08:00
我想纠正一下 @kaedeair ,Docker 部署的 OpenWrt 容器是可以作为主路由的,也可以正常 PPPoE 拨号上号。

我用 OpenWrt 容器做主路由只是为了避免在光猫上拨号,让自己可以对网络进行更加细节的控制。甚至我的 Docker 服务器只有一个网卡,只是在交换机上划分了 VLAN 。用 OpenWrt 而不是其他方法拨号是为了避免配置防火墙等,同时有开箱即用的 DHCP 、DNS 等功能。

如果 OP 只是需要透明代理网关,使用对应工具的 Docker 镜像 + iptables 规则也可以做到,没有必要使用 OpenWrt 。或者可以自己基于 Alpine 、Debian 等基础镜像自己 DIY 一个。

如下是使用 VLAN 进行单网口复用的方案( OP 的情况只需针对对两个接口分别创建 macvlan 网络即可,不需要使用 VLAN ):

```bash
# 创建 macvlan 网络(假设 WAN 的 VLAN ID 为 10 ,LAN 的 VLAN ID 为 20 )
WAN_VLAN_ID=10
LAN_VLAN_ID=20
docker network create --driver macvlan --opt parent=eth0.$WAN_VLAN_ID wan
docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 --ip-range 192.168.1.0/28 --opt parent=eth0.$LAN_VLAN_ID lan

# 导入 OpenWrt 镜像
docker import https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/openwrt-22.03.3-x86-64-rootfs.tar.gz openwrt:22.03.3

# 只给 `--cap-add NET_ADMIN` 无法拨号,所以这里暂时用 `--privileged`
# 如果不需要 PPPoE 拨号,可能 `--cap-add NET_ADMIN` 已经足够
docker create --name openwrt --privileged --network lan openwrt:22.03.3 /sbin/init
docker network connect wan openwrt
docker start router
```

不过在使用 macvlan 时需要注意几点:

- 一般情况下,宿主机和使用 macvlan 网络的容器无法直接通信,解决方法见 [Using Docker macvlan networks]( https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/);
- 创建容器时指定的 IP 不必是 `--ip-range` 中指定的 IP ,根据此原理 OpenWrt 容器可以自己决定使用哪个 IP 。

---

⚠️ 以下只是我的凭空臆想,我目前还没有在双网口机器上测试过!

如果不想使用 OpenWrt 作为主路由,那么可以在 Ubuntu 上为 `eth0` 配置好静态 IP ,保证可以正常上网并开启 IP 转发。

然后配置好 `eth1` 任意内网地址作为你的 LAN 地址( SSH 连接的地址),比如 192.168.1.120/24 。

接着在 `eth1` 上创建 macvlan 网络,指定网关地址为 192.168.1.1 。(此时网关 IP 只是占位,并没有任何设备占用)

然后参照 [Using Docker macvlan networks]( https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/) 在 Ubuntu 上创建网络桥接到 macvlan 网络,地址为 192.168.1.1 。这样可以保证容器和宿主机之间相互通信没有问题,容器才可以通过 macvlan 网络正常上网。

然后就是在容器中使用代理工具配置 iptables 了,这没有什么好说的。当然这样的方法还需要自己配置 DHCP 服务。

---

上面的步骤之所以这么复杂是因为想要在一台机器上实现 NAT 和透明网关,而 macvlan 网络会导致宿主机和容器无法直接通信。如果 OP 有另外一台现成的路由器,那么问题可以直接简化为在创建 macvlan 网络并在 Docker 服务器上开启代理应用的容器。

写的很粗糙,如果有什么问题欢迎指出。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/934065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX