Shorewall 与 Docker

Shorewall 与 Docker

我正在尝试在 shorewall(版本 5.1.3.2)中启用 docker 支持。我已按照指南操作http://shorewall.org/Docker.html

然而,当我尝试启动 shorewall 时出现以下错误:

* Starting shorewall ...iptables-restore v1.6.1: Couldn't load target `DOCKER-INGRESS':No such file or directory

Error occurred at line: 39
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
ERROR: iptables-restore Failed. Input is in /var/lib/shorewall/.iptables-restore-input
iptables-restore v1.6.1: Couldn't load target `DOCKER-INGRESS':No such file or directory

Error occurred at line: 14
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
ERROR: /sbin/iptables-restore Failed.
Terminated
[ !! ]
* ERROR: shorewall failed to start

我尝试过先启动 docker 再启动 shorewall 或在 docker 之前启动 shorewall 但总是遇到同样的问题。

我该如何解决这个问题?

谢谢

答案1

这与 docker swarm 模式有关,它创建了一个 DOCKER-INGRESS 规则链,该链不受 shorewall 管理。据我所知,没有人要求在 shorewall 中添加该规则链管理。应该有一个解决方法,例如跳过或在 shorewall 中按名称保存/恢复链,例如

答案2

正式,Shorewall 不支持 Docker swarm:

从 Shorewall 5.0.6 开始,Shorewall 对简单的 Docker 配置提供原生支持。... Shorewall 目前不支持 Docker Swarm 模式。

你可能会像我一样幸运地使用所描述的方法这里。我的 Shorewall 规则太严格了,所以我不得不调整文章评论中列出的脚本,使用一个添加規則。

解决方法是创建两个文件/etc/shorewall/init/etc/shorewall/stop,内容如下:

rules=/etc/shorewall/.docker_rules
if iptables -t nat -L DOCKER >/dev/null 2>&1; then
    echo '*nat' > $rules
    iptables -t nat -S | grep -i docker > $rules.nat
    grep '^-N' $rules.nat >> $rules
    tac $rules.nat | sed -n 's/^-A \([^ ]\+\) /-I \1 1 /p' >> $rules
    rm -f $rules.nat
    echo 'COMMIT' >> $rules

    echo '*filter' >> $rules
    iptables -t filter -S | grep -i docker > $rules.filter
    grep '^-N' $rules.filter >> $rules
    tac $rules.filter | sed -n 's/^-A \([^ ]\+\) /-I \1 1 /p' >> $rules
    rm -f $rules.filter
    echo 'COMMIT' >> $rules
fi

然后/etc/shorewall/start使用以下内容进行创建:

rules=/etc/shorewall/.docker_rules
if [ -f $rules ]; then
    iptables-restore -n < $rules
    rm -f $rules
fi

如果你尝试这个我必须重复一下有关网络规则/脚本的警告您应该仔细检查生成的 iptables 规则,以确保您没有不必要地暴露您的网络并且规则按预期工作。

答案3

检查 shorewall.conf 中是否启用了 Docker 支持:

DOCKER=Yes

相关内容