V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JOKERdmb
V2EX  ›  宽带症候群

关于基于 docker 部署 openwrt

  •  
  •   JOKERdmb · 2023-04-20 15:54:16 +08:00 · 3466 次点击
    这是一个创建于 562 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我先陈述一下环境吧!

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

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

    21 条回复    2023-04-21 12:37:08 +08:00
    kaedeair
        1
    kaedeair  
       2023-04-20 16:07:05 +08:00
    docker 部署的 openwrt 只能做旁路由不能做主路由
    JOKERdmb
        2
    JOKERdmb  
    OP
       2023-04-20 16:13:29 +08:00
    @kaedeair 啊!! T T ,那还需要再给镜像加一个网络吗(我现在只有一个 macvlan ,用在了 lan 口),直接 DHCP 就可以吗
    EasonSummer
        3
    EasonSummer  
       2023-04-20 16:14:24 +08:00
    我没实践过 搜到这个不知道对你有没有帮助。https://www.cnblogs.com/luoshuifushen/p/16989469.html
    JOKERdmb
        4
    JOKERdmb  
    OP
       2023-04-20 16:15:27 +08:00
    @EasonSummer 我来康康!!!
    mohumohu
        5
    mohumohu  
       2023-04-20 16:36:18 +08:00
    其实你有没有考虑过你真的需要 openwrt 吗?你都能部署 docker 了,那 openwrt 提供的服务是不是对应的 docker 也可以提供
    kaedeair
        6
    kaedeair  
       2023-04-20 16:36:31 +08:00
    @JOKERdmb 2# 做主路由需要虚拟机跑 openwrt ,并直通一个物理网口做 wan
    EasonSummer
        7
    EasonSummer  
       2023-04-20 16:43:00 +08:00
    也是,如果要富强,v2rayA 或 clash 的 docker 都能办到也能透明代理。其他业务 docker 更是可以了
    JOKERdmb
        8
    JOKERdmb  
    OP
       2023-04-20 16:46:29 +08:00
    @kaedeair 大佬,也就是 docker 不行,需要 kvm 是不是
    JOKERdmb
        9
    JOKERdmb  
    OP
       2023-04-20 16:46:53 +08:00
    @EasonSummer 我其实也就是富强,是不是没有必要非要 op
    JOKERdmb
        10
    JOKERdmb  
    OP
       2023-04-20 16:49:31 +08:00
    @mohumohu 我其实就是一个富强,别的没有啥刚需。大佬一语点醒梦中人
    JOKERdmb
        11
    JOKERdmb  
    OP
       2023-04-20 16:50:51 +08:00
    @mohumohu 说白了,我需要的功能就是帕斯沃,不知道有没有替代品
    kaedeair
        12
    kaedeair  
       2023-04-20 16:57:59 +08:00
    你这个需求,直接 linux 跑代理就行了啊
    levenwindy
        13
    levenwindy  
       2023-04-20 17:02:00 +08:00
    ```bash
    # 假设 lan 口 (eth1)为 192.168.1.1 ,作为网关, 没有 ipv6 就删掉(--ipv6 --subnet=fe80::/80 )
    docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ipv6 --subnet=fe80::/80 -o parent=eth1 macvlan1
    # 指定 ip 192.168.1.254 ( OP 管理口)
    docker run -d --name op1 --restart=always --privileged --net=macvlan1 --ip=192.168.1.254 < 镜像名 >
    ```
    /etc/config/network 记得修改里面的配置,后面自己弄吧
    totoro625
        14
    totoro625  
       2023-04-20 17:02:01 +08:00
    你可能仅仅需要一个能配置机器代理的程序 ShellClash: https://github.com/juewuy/ShellClash
    luckjoe680
        15
    luckjoe680  
       2023-04-20 17:02:06 +08:00 via Android
    @JOKERdmb 跑个 clash 不比 passw 强?
    JOKERdmb
        16
    JOKERdmb  
    OP
       2023-04-20 17:06:33 +08:00
    @totoro625 跑起来这个以后,效果跟 pw 一样吗
    JOKERdmb
        17
    JOKERdmb  
    OP
       2023-04-20 17:07:32 +08:00
    @luckjoe680 我是想软路由接一个交换机,然后笔记本啥的客户端接上去就能富强,小猫也能做到吗
    cwbsw
        18
    cwbsw  
       2023-04-20 19:42:52 +08:00
    docker 设计是部署应用的,网络配置就是残废。
    你的需求建议用 LXC 来解决,和 docker 同样是基于 linux 容器技术,但是功能强大的多。
    luckjoe680
        19
    luckjoe680  
       2023-04-21 07:39:36 +08:00 via Android
    @JOKERdmb 小猫就是用来干这个的呀 openwrt 上也是用小猫呀
    libook
        20
    libook  
       2023-04-21 12:22:20 +08:00
    Docker 是可行的,我曾经使用 OpenWrt 官方的 rootfs 镜像成功做过旁路网关,几台设备配置网关为这个 OpenWrt 的地址实现透明代理,但已经忘了怎么配置的了。

    可以参考这个,但不确定是不是我最终参考的 https://sspai.com/post/68511

    不过有两点不是很好。
    一个是容器几乎劫持了宿主机,包括但不限于 tty ,这个跟用容器来做环境隔离避免污染的预期不大相符。
    另一个是做的所有配置更改都是在容器内部,重新部署就全都丢失了,得研究如何在更新镜像的同时保留设置。
    Projection
        21
    Projection  
       2023-04-21 12:37:08 +08:00   ❤️ 2
    我想纠正一下 @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 服务器上开启代理应用的容器。

    写的很粗糙,如果有什么问题欢迎指出。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:32 · PVG 21:32 · LAX 06:32 · JFK 09:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.