Docker操作iptables规则以提供网络隔离

Docker和iptables

在Linux上,Docker操作iptables规则以提供网络隔离。 这是一个实现细节,您不应修改Docker插入的iptables策略。

在Docker的规则之前添加iptables策略

Docker的所有iptables规则都已添加到DOCKER链中。 不要手动操作该表。 如果您需要添加在Docker规则之前加载的规则,请将其添加到DOCKER-USER链中。这些规则将在任何Docker自动创建的规则之前加载。

限制与Docker后台程序的连接

默认情况下,允许所有外部源IP连接到Docker后台程序。 要仅允许特定的IP或网络访问容器,请在DOCKER过滤器链的顶部插入一个否定的规则。 例如,以下规则将外部访问限制为除192.168.1.1之外的所有IP地址:

$ 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(使用--src-range--dst-range时,请记住还要添加-m iprange):

$ 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保持打开状态。

iptables很复杂,更复杂的规则超出了本主题的范围。 有关更多信息,请参见Netfilter.org HOWTO

防止Docker操作iptables

可以在Docker引擎的配置文件/etc/docker.daemon.json的中将iptables键设置为false,但是此选项不适用于大多数用户。 完全阻止Docker创建iptables规则是不可能的,事后创建它们非常复杂,并且超出了这些说明的范围。 将iptables设置为false很有可能破坏Docker引擎的容器网络。

对于希望将Docker运行时构建到其他应用程序中的系统集成商,请探索moby项目

下一步

阅读Docker参考架构:设计可扩展的便携式Docker容器网络