互联网技术 / 互联网资讯 · 2023年12月30日 0

Docker教程:利用iptables规则实现网络隔离的云计算核心技术

在linux上,DockeR操纵IPtables规则以提供网络隔离。尽管这是实现的详细信息,并且您不应修改DockeR在IPtables策略中插入的规则,但是如果您想要拥有自己的策略(而不是由DockeR管理的策略),它确实会对您需要执行的操作产生一些影响。

如果您在暴露于InteRnet的主机上运行DockeR,则可能需要适当的IPtables策略,以防止未经授权访问您主机上运行的容器或其他服务。此页面描述了如何实现此目标以及需要注意的注意事项。

添加IPtables政策的规则

DockeR安装了两个名为DOCKER-User和的自定义IPtables链DOCKER,它确保始终由这两个链首先检查传入的数据包。

DockeR的所有IPtables规则都已添加到DOCKER链中。请勿手动操作此链条。如果您需要添加在DockeR规则之前加载的规则,则将它们添加到DOCKER-User链中。在DockeR自动创建任何规则之前,将应用这些规则。

在这些链之后,FORWARD将评估添加到链中的规则(手动添加或通过另一个基于IPtables的防火墙)。这意味着,如果您通过DockeR公开端口,则无论防火墙配置了什么规则,该端口都会公开。如果您希望即使在通过DockeR公开端口时也要应用这些规则,则必须将这些规则添加到 链中。

限制与DockeR主机的连接

默认情况下,允许所有外部源IP连接到DockeR主机。要仅允许特定的IP或网络访问容器,请在DOCKER-User过滤器链的顶部插入一个否定的规则。例如,以下规则限制从以下所有IP地址进行的外部访问192.168.1.1:

$ IPtables -I DOCKER-User -i ext_if ! -s 192.168.1.1 -j DROP

请注意,您将需要更改ext_if以与主机的实际外部接口相对应。您可以改为允许来自源子网的连接。以下规则仅允许从子网进行访问192.168.1.0/24:

$ IPtables -I DOCKER-User -i ext_if ! -s 192.168.1.0/24 -j DROP

最后,您可以指定要接受的IP地址范围–sRc-Range (请记住-M IPRange在使用–sRc-Range或时也要添加–dst-Range):

$ IPtables -I DOCKER-User -M IPRange -i ext_if ! –sRc-Range 192.168.1.1-192.168.1.3 -j DROP

您可以结合使用-s或–sRc-Range与-d或–dst-Range一起控制源和目标。例如,如果DockeR守护程序同时监听 192.168.1.99和10.1.2.3,则可以制定特定于10.1.2.3并保持 192.168.1.99打开的规则。

DockeR路由

DockeR还将FORWARD链的策略设置为DROP。如果您的DockeR主机也充当路由器,这将导致该路由器不再转发任何流量。如果希望系统继续充当路由器,则可以ACCEPT向DOCKER-User链中添加明确的规则以允许它:

$ IPtables -I DOCKER-User -i sRc_if -o dst_if -j ACCEPT

防止dockeR操作IPtables

可以在DockeR引擎的配置文件中将IPtables密钥设置FAlse为/etc/dockeR/daeMon.json,但是此选项不适用于大多数用户。完全阻止DockeR创建IPtables规则是不可能的,事后创建规则非常复杂,超出了这些说明的范围。设置IPtables为FAlse很有可能会破坏DockeR引擎的容器网络。

设置容器的默认绑定地址

默认情况下,DockeR守护程序将公开0.0.0.0地址上的端口,即主机上的任何地址。如果要更改该行为以仅公开内部IP地址上的端口,则可以使用该–IP选项指定其他IP地址。但是,设置–IP仅更改 默认值,它不会将服务限制为该IP。