Docker和Shorewall


16

我在服务器上使用Shorewall作为简单的独立防火墙,也希望使用Docker

通过使用Docker容器及其端口重定向, Docker 可以设置自己的iptables规则/链,如果重新启动Shorewall,这些规则/链将被杀死。因此容器将变得不可及

是否有人在重新启动Shorewall后设法保存/恢复Docker规则,还是有人有其他解决方法?

也可以看看:

Answers:


19

以下配置更改应确保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 / interfaces

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

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zones

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

#ZONE   INTERFACE
dock    ipv4

/ etc / shorewall / policy

您可能希望允许Docker容器与主机 Internet通信,因此这是一个很好的起点:

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

您可能还需要一个类似的ACCEPT交通政策,从fwdock,如果你不已经与打开它fwall

您可以根据需要在策略规则文件中进一步加强此功能。例如,以上内容未明确允许外部流量到达您的Docker容器;检查您的其他区域/政策/规则。


1
IP_FORWARDING=YesIP_FORWARDING=True工作。我已经在多个生产路由器上使用了,但是您的答案比我的要清楚得多。做得好。
亚伦·德·布鲁恩

原谅我的无知-当我在添加给定规则后重新启动Shorewall时,我收到一条警告,即Dock是“空接口” ...事实上,阅读以上内容,我不清楚Shorewall如何推断出两者之间的联系。 172.17地址和“码头”区域。我是否想知道关于岸墙工作原理的明显信息?
约翰·克莱门茨

抱歉,我错过了interfaces文件中的更改。我已经编辑了答案,请参阅新部分/etc/shorewall/interfaces
2015年

谢谢。它也可以与Shorewall 5(支持docker的)配合使用,以使主机加入其容器。
Drasill '17

masq设置非常重要,否则docker-container将无法使用外部IP访问其他容器-它将被阻止
Eugen Mayer

6

由于Docker引入了其网络隔离功能,因此如果您要使用自定义网络,此处提到的其他解决方案将不再足够。Shorewall 5.0.6引入了对Docker的支持,包括Docker网络。这个:

  • 允许以任意顺序启动/停止/重新启动Shorewall和docker
  • 无需维护扩展脚本

2

只是在我的盒子上弄清楚了。确保/etc/shorewall.conf具有:

IP_FORWARDING=Yes

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

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

编辑/etc/shorewall/masq,您将需要类似于以下内容的行:

br0 172.17.0.0/12

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


2

您可以通过创建扩展脚本来确保Docker规则集在Shorewall重新启动后继续生存,该扩展脚本会DOCKER在重新启动之前保存链,然后在之后重新进行恢复。我刚刚发布了一个示例,介绍了如何执行此操作,尽管我确信这与唯一可行的方法相去甚远。


0

可以在不影响正在运行的容器的情况下重新启动docker服务,并且可以在Shorewall重新启动后运行以重新加载docker特定规则。很显然,到容器的网络连接将在很短的时间内中断。

至少在我的一些Archlinux安装中,这是正确的。


0

刷新操作不会破坏iptable,因此,如果您只想刷新规则或策略,则可以运行refresh而不是restart:

sudo shorewall refresh

显然,如果您确实需要重新启动Shorewall,问题仍然存在。然后,您必须重新启动docker并重新启动容器。


0

一种可能的选择是使用--net = host选项运行Docker,以允许容器化的应用访问主机网络而无需ip转发和NAT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.