Docker 和 Shorewall

Docker 和 Shorewall

我在用着岸墙在我的服务器上很简单独立防火墙并希望使用Docker也一样。

通过使用 Docker 容器及其端口重定向docker 设置了自己的 iptables 规则/链,如果 shorewall 重新启动,这些规则/链将被终止。因此容器将变为无法到达

是否有人设法在 Shorewall 重启后保存/恢复 docker 规则,或者是否有人有其他解决方法?

也可以看看:

答案1

以下配置更改应确保 Docker 和 Shorewall 主机之间的流量畅通。已在 Shorewall 4.5.21.9 上测试,但应适用于最新版本:

/etc/shorewall/shorewall.conf

确保 IP 转发已启用(大多数配置项都是“是/否”,但这个配置项是“开”):

IP_FORWARDING=On

/etc/shorewall/masq

为您的私有 Docker 网络启用伪装 (NAT)(如果您使用不同的网络,即使用 启动 docker --bip=#.#.#.#/#,则进行相应更改)。更改eth0为具有外部连接的主机上的任何接口:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/etc/shorewall/接口

添加一个接口条目,以便 Shorewall 知道该dock区域与哪个接口相关:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/etc/shorewall/区域

创建一个新的区域;注意,docker太长会导致“区域名称无效”错误。

#ZONE   INTERFACE
dock    ipv4

/etc/shorewall/策略

你可能希望允许 Docker 容器与主机通信互联网,所以这是一个很好的起点:

#SOURCE         DEST            POLICY
# ...(other policies)...
dock            all             ACCEPT
# ...(other policies, catch-all)...

如果您尚未开放 到 的流量,则可能还需要对从到 的ACCEPT流量实施类似的策略。fwdockfwall

您可以在政策或者规则文件。例如,以上内容未明确允许外部流量到达您的 Docker 容器;请检查您的其他区域/策略/规则。

答案2

自从 Docker 引入了网络隔离功能后,如果您想使用自定义网络,这里提到的其他解决方案就不再适用了。Shorewall 5.0.6 引入了支持 Docker包括 Docker 网络。这:

  • 允许以任何顺序启动/停止/重启 shorewall 和 docker
  • 避免维护扩展脚本的需要

答案3

刚刚在我的机器上发现了这个问题。确保 /etc/shorewall.conf 包含:

IP_FORWARDING=Yes

Docker 依赖于转发,并且我在所有服务器上将“puppet”设置为“否”。

更新:您可能还需要伪装来自 docker 的流量通过您的 WAN 接口。

编辑/etc/shorewall/masq,您将需要类似如下的一行:

br0 172.17.0.0/12

在这种情况下,我的 WAN 接口实际上是 br0(桥接器),但您的接口可能类似于 eth0。(使用查看您的接口及其 IP 地址)。在我的计算机上,docker 使用 172.17.0.0/24,这是一个 RFC1918 私有地址范围。这可能在其他系统上有所不同,但您可以再次ifconfig使用 查找接口 来查看范围。ifconfigdocker0

答案4

docker 服务可以重新启动而不会影响正在运行的容器,并且可以在 Shorewall 重新启动后运行以重新加载 docker 特定规则。显然,容器的网络会短暂中断。

至少在我安装的几个 Archlinux 中确实如此。

相关内容