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
项目。