我正在尝试在 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