lisaac / luci-app-dockerman

Docker Manager interface for LuCI
GNU Affero General Public License v3.0
836 stars 233 forks source link

【建议】关于默认配置iptables的行为 #173

Closed Joee-D closed 1 year ago

Joee-D commented 1 year ago

问题描述 背景: 1.使用官方openwrt23.05版本,默认用的是nftables。当前仓库的dockerman启动默认配置了iptables。 2.了解到dockerd对nftables支持的有问题,所以还是默认使用的iptables 3.了解到官方仓库中的dockerman是基于本仓库的早期版本。对比了下官方仓库中,在启动时没有对防火墙做相关的操作。 官方仓库dockerman

问题: 1.对于只使用HOST网络的情况下,理论上应该可以不需要配置相关防火墙规则。 2.dockerman的防火墙规则和dockerd中的防火墙规则是否重复,是否只需要配置一个就可以了?

建议: dockerd当前提供了iptables=false配置选项,默认不配置iptables。 https://github.com/openwrt/packages/blob/83f60a6ee74184cbd30e49f96c08f993e7e71eca/utils/dockerd/files/dockerd.init#L210C7-L210C7

是否可以在启动时去读取下dockerd的配置文件,如果有iptables=false的配置,就不对防火墙进行处理。

使用命令行 同样的操作使用命令行的结果

版本信息:

lisaac commented 1 year ago

@Joee-D dockerman 与 dockerd 中的防火墙配置并不重复,dockerman 只是针对访问控制做的一些规则,而 dockerd 的规则是实现端口暴露的转发,以及容器 nat 相关的规则。分开两个 chain 比较有利于管理。

感觉 iptables = false 似乎没什么必要,它会使得 bridge 网络(无论是你自己创建还是默认的 bridge 网络)下的容器出问题,我能想到的就是只用 host 网络或 macvlan 网络的容器。其次配置 iptables = false 貌似也没有什么副作用。

唯一的想到就是你提到的 nftables 作为了默认防火墙配置,开启 iptables = false 之后可以完全抛弃 iptables,不知道这是不是你想要的。

说回你的建议,完全可以接受,并且我觉得挺合理。

Joee-D commented 1 year ago

@Joee-D dockerman 与 dockerd 中的防火墙配置并不重复,dockerman 只是针对访问控制做的一些规则,而 dockerd 的规则是实现端口暴露的转发,以及容器 nat 相关的规则。分开两个 chain 比较有利于管理。

感觉 iptables = false 似乎没什么必要,它会使得 bridge 网络(无论是你自己创建还是默认的 bridge 网络)下的容器出问题,我能想到的就是只用 host 网络或 macvlan 网络的容器。其次配置 iptables = false 貌似也没有什么副作用。

唯一的想到就是你提到的 nftables 作为了默认防火墙配置,开启 iptables = false 之后可以完全抛弃 iptables,不知道这是不是你想要的。

说回你的建议,完全可以接受,并且我觉得挺合理。

感谢回复。 是的,当前是自己编译的23.05,默认用的nftables,dockerd配置了iptables=false,尝试替换官方仓库版本dockerman到本仓库,还是配置了iptables规则而且没看到可以不配置的地方,所以提出了疑问1。

另外,看了下代码,发现启动时会把dockerd的防火墙配置都删除掉,所以提出了疑问2。 https://github.com/lisaac/luci-app-dockerman/blob/3e98bd7cd5d044e133c3806099f8891723c1575b/applications/luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman#L26

我这边会自己尝试本地改改试试。 另外也如另一个issue #140 中所提,希望能回归仓库主线版本~

lllrrr2 commented 1 year ago

请问一下大佬,这个怎么解决,是不是将/packages//utils/dockerd/files/dockerd.init下面这二个部分删除

Add network interface

if ! uci_quiet get network.${iface}; then
    logger -t "dockerd-init" -p notice "Adding interface '${iface}' to network config"
    uci_quiet add network interface
    uci_quiet rename network.@interface[-1]="${iface}"
    uci_quiet set network.@interface[-1].device="${device}"
    uci_quiet set network.@interface[-1].proto="none"
    uci_quiet set network.@interface[-1].auto="0"
    uci_quiet commit network
fi

Add firewall zone

if ! uci_quiet get firewall.${zone}; then
    logger -t "dockerd-init" -p notice "Adding firewall zone '${zone}' to firewall config"
    uci_quiet add firewall zone
    uci_quiet rename firewall.@zone[-1]="${zone}"
    uci_quiet set firewall.@zone[-1].input="ACCEPT"
    uci_quiet set firewall.@zone[-1].output="ACCEPT"
    uci_quiet set firewall.@zone[-1].forward="ACCEPT"
    uci_quiet set firewall.@zone[-1].name="${zone}"
    uci_quiet commit firewall
fi
lllrrr2 commented 1 year ago

我用官网23.05分支编译后,无法访问容器

Joee-D commented 1 year ago

我用官网23.05分支编译后,无法访问容器

这个应该跟这个issue的问题没有太大关系,issue的问题仅会创建iptables规则不会导致无法启动 回到你的问题,我记得最开始也有遇到这个现象,具体解决方法有点记不太清了,交流几个建议的思路: 1.你可以用命令行看看dockerd是不是已经运行起来了 2.看下是用的当前仓库的插件还是官方仓库的插件 3.如果修改过docker根目录,检查下dockerd的相关配置 /etc/config/dockerd中的option data_root是不是预期的;看下/etc下,或者/etc/config下是否还有其他docker相关的配置在生效

关于防火墙规则,23.05默认nftable,dockerd会默认添加iptable规则: 1.如果需要使用bridge就不要动防火墙规则 2.如果只用host或macvlan: (1)官方插件只需要在/etc/config/dockerd添加 option iptables '0' (2)本仓库插件除了需要在/etc/config/dockerd添加 option iptables '0',还需要删除/luci-app-dockerman/root/etc/init.d(其他方法不配置防火墙也可以)

Pacio commented 7 months ago

我用官网23.05分支编译后,无法访问容器

这个应该跟这个issue的问题没有太大关系,issue的问题仅会创建iptables规则不会导致无法启动 回到你的问题,我记得最开始也有遇到这个现象,具体解决方法有点记不太清了,交流几个建议的思路: 1.你可以用命令行看看dockerd是不是已经运行起来了 2.看下是用的当前仓库的插件还是官方仓库的插件 3.如果修改过docker根目录,检查下dockerd的相关配置 /etc/config/dockerd中的option data_root是不是预期的;看下/etc下,或者/etc/config下是否还有其他docker相关的配置在生效

关于防火墙规则,23.05默认nftable,dockerd会默认添加iptable规则: 1.如果需要使用bridge就不要动防火墙规则 2.如果只用host或macvlan: (1)官方插件只需要在/etc/config/dockerd添加 option iptables '0' (2)本仓库插件除了需要在/etc/config/dockerd添加 option iptables '0',还需要删除/luci-app-dockerman/root/etc/init.d(其他方法不配置防火墙也可以)

我也遇到这问题了~问一下删除/luci-app-dockerman/root/etc/init.d是指编译前删除吗

Joee-D commented 7 months ago

我也遇到这问题了~问一下删除/luci-app-dockerman/root/etc/init.d是指编译前删除吗

对,启动脚本会删除dockerd添加的iptables规则,然后自己添加一套iptables规则。