我在我的服务器上使用Shorewall作为简单的独立防火墙,并且也想使用Docker 。
通过使用Docker容器及其端口redirect docker设置自己的iptables规则/链,如果shorewall被重新启动,将会被终止。 所以容器将变得无法访问 。
有没有人设法保存/恢复docker规则在岸边墙重新启动或有没有人有另一种解决方法?
也可以看看:
以下configuration更改应确保Docker和Shorewall主机之间的stream量。 testingShorewall 4.5.21.9,但应适用于最新版本:
/etc/shorewall/shorewall.conf
确保IP转发已启用(大多数configuration项目是是/否,但是这是“开”):
IP_FORWARDING=On
的/ etc /的shorewall /伪装
为您的私人Dockernetworking启用伪装(NAT)(如果您使用不同的networking,即您使用--bip=#.#.#.#/#启动泊坞窗,则相应地更改)。 将eth0更改为具有外部连接的主机上的任何接口:
#INTERFACE:DEST SOURCE eth0 172.17.0.0/16
的/ etc /的shorewall /接口
添加一个接口条目,以便Shorewall知道dock区域涉及的接口:
#ZONE INTERFACE OPTIONS dock docker0
在/ etc /的shorewall /区
创build一个新的区域; 注意, docker太长,会导致“无效的区域名称”错误。
#ZONE INTERFACE dock ipv4
在/ etc /的shorewall /政策
您可能希望允许Docker容器与主机和 Internet进行通信,因此这是一个很好的起点:
#SOURCE DEST POLICY # ...(other policies)... dock all ACCEPT # ...(other policies, catch-all)...
如果您还没fw打开它,您可能还需要一个类似的从fw到dockstream量的ACCEPT策略。
您可以根据需要在策略文件或规则文件中进一步收紧。 例如,上面没有明确允许外部stream量到达您的Docker容器; 检查你的其他区域/政策/规则。
由于Docker引入了networking隔离function,如果您想使用自定义networking,这里提到的其他解决scheme已经不够了。 Shorewall 5.0.6引入了对包括Dockernetworking在内的Docker的支持 。 这个:
只是在我的箱子里弄明白了。 确保/etc/shorewall.conf具有:
IP_FORWARDING=Yes
Docker依赖于转发,而我在所有服务器上将“puppet”设置为“No”。
更新:您可能还需要伪装来自Docker的WANstream量。
编辑/etc/shorewall/masq ,你需要一行类似于:
br0 172.17.0.0/12
在这种情况下,我的WAN接口实际上是br0(桥接器),但是你的可能是eth0。 (使用ifconfig查看您的接口和它们的IP地址)。 在我的机器上,docker使用172.17.0.0/24这是一个RFC1918专用地址范围。 这可能在其他系统上有所不同,但您可以再次使用ifconfig查看范围以查找docker0接口。
您可以通过创build在重新启动之前保存DOCKER链的扩展脚本来确保Docker规则集能够在shorewall重新启动后生存,然后再次恢复。 我刚刚提出了一个如何做到这一点的例子 ,虽然我相信这是唯一可能的方法。
docker服务可以在不影响正在运行的容器的情况下重新启动,并且可以在Shorewall重新启动后运行以重新加载docker工具特定的规则。 与集装箱联网中断的时间显然很短。
至less在我的几个Archlinux安装上是这样的。
刷新操作不会closuresiptable,所以如果你只是想刷新规则或策略,你可以运行刷新而不是重新启动:
sudo shorewall refresh
显然,如果你真的需要重新启动shorewall,问题仍然存在。 然后,您必须重新启动Docker并重新启动容器。
一个可能的select是使用–net = host选项运行Docker,允许容器化的应用程序访问主机networking,而不需要ip转发和NAT。