大家好,我是张晋涛。
上周有小伙伴在群里问到 Docker 和 iptables 的关系,这里来具体聊聊。
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。
(MoeLove) ➜ ~ dockerd --help |grep iptables
--iptables Enable addition of iptables rules (default true)
docker daemon 有个 --iptables
的参数,便是用来控制是否要自动启用 iptables 规则的,默认已经设置成了开启(true)。所以通常我们不会过于关注到它的工作。
本文中,为了避免环境的干扰,我将使用 docker in docker 的环境来进行介绍,可通过如下方式启动该环境:
(MoeLove) ➜ ~ docker run --rm -d --privileged docker:dind
f323aef7b532ba6d575ca6f9444a08f1a55f2447afec2e853954694c034e6ae0
iptables 基础
iptables
是一个用于配置 Linux 内核防火墙的工具,可用于检测、修改转发、重定向以及丢弃 IPv4 数据包。它使用了内核的 ip_tables 的功能,所以需要 Linux 2.4+ 版本的内核。
同时,iptables 为了便于管理,所以按照不同的目的组织了多张 表 ;每张表中又包含了很多预定义的 链;每个链中包含着顺序遍历的 规则;这些规则中又定义了动作的匹配规则和 目标。
对于用户而言,我们通常需要交互的就是 链 和 规则了。
理解 iptables 的主要工作流程有一张比较经典的图:
图片来源: https://www.frozentux.net/iptables-tutorial/images/tables_traverse.jpg
上面的小写字母是 表,大写字母则表示 链,从任何网络端口 进来的每一个 IP 数据包都要从上到下的穿过这张图。
引用自 ArchWiki
不过这不是本篇的重点,所以就不展开了。如果大家对 iptables 的内容感兴趣也欢迎留言,后续可以写一篇完整的。
Docker 网络与 iptables
接下来我们直接看看 Docker 在开启和关闭 iptables 时,具体有什么区别。
关闭 Docker 的 iptables 支持
在本文开头已经为你介绍过 docker daemon 存在一个 --iptables
的参数,用于控制是否使用 iptables 。我们使用以下命令启动一个 docker daemon 并关闭 iptables 支持。
(MoeLove) ➜ ~ docker run --rm -d --privileged docker:dind dockerd --iptables=false
7135a54c913af5e9ce69a45a0819475503ea9e3c5c673d62d9d38f0f0896179d
进入此容器,并查看其所有 iptables 规则:
(MoeLove) ➜ ~ docker exec -it $(docker ps -ql) sh
/ # iptables-save
# Generated by iptables-save v1.8.8 on Mon Dec 12 01:46:38 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2:80]