简介

Docker 在运行时会自动配置 iptables 以处理容器的网络流量和端口映射,本文对docker自动配置的防火墙规则进行说明

伪装

1
2
pkts bytes target     prot opt in      out        source              destination
2099 136K MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0

规则各部分的解释

  1. 2099: 这是匹配到该规则的包的计数器,表示当前已有 2099 个数据包匹配此规则。

  2. 136K: 这是匹配到该规则的字节计数器,表示当前已有 136K 字节通过此规则。

  3. MASQUERADE: 表示这是一个伪装(Masquerading)规则。伪装是一种动态 NAT(网络地址转换)技术,通常用于允许内部网络的设备通过一个公共 IP 地址访问外部网络。

  4. all: 表示此规则适用于所有协议(包括 TCP、UDP 等)。

  5. : 这一部分通常用于分隔规则的匹配条件和目标动作,后面是匹配条件。

  6. *: 表示匹配所有输入接口。

  7. !docker0: 表示匹配所有不通过 docker0 接口的流量。docker0 是 Docker 创建的虚拟网桥接口,通常用于连接 Docker 容器。

  8. 172.17.0.0/16: 表示匹配源地址在 172.17.0.0/16 网段的流量。这是 Docker 默认的网络地址范围,通常用于 Docker 容器的内部网络。

  9. 0.0.0.0/0: 表示匹配目标地址为任意 IP 地址,意味着可以访问外部网络。

规则的作用:
对来自 172.17.0.0/16 网段(Docker 容器的内部网络)的所有流量进行伪装,且该流量不通过 docker0 接口(确保不是容器间通信)。这意味着所有从 Docker 容器发出的流量(不通过 Docker 的虚拟网桥)都将使用宿主机的公共 IP 地址进行伪装,以便能够访问外部网络。

1
2
pkts bytes target     prot opt in     out       source             destination
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:5700

规则各部分的解释:

  1. 0: 这是匹配到该规则的包的计数器,表示当前没有数据包匹配此规则。

  2. 0: 这是匹配到该规则的字节计数器,表示当前没有字节通过此规则。

  3. MASQUERADE: 表示这是一个伪装(Masquerading)规则。伪装是一种动态 NAT(网络地址转换)技术,通常用于允许内部网络的设备通过一个公共 IP 地址访问外部网络。

  4. tcp: 表示此规则适用于 TCP 协议。

  5. : 这一部分通常用于分隔规则的匹配条件和目标动作,后面是匹配条件。

  6. *: 表示匹配所有输入接口。

  7. *: 表示匹配所有输出接口。

  8. 172.17.0.3: 表示匹配源地址为 172.17.0.3 的流量。这个 IP 地址通常是 Docker 容器的内部 IP 地址。

  9. 172.17.0.3: 表示匹配目标地址为 172.17.0.3 的流量。

  10. tcp dpt:5700: 表示匹配目的端口为 5700 的 TCP 流量。

规则的作用:
对来自 IP 地址 172.17.0.3 的 TCP 流量(目标端口为 5700)进行伪装。伪装的过程是将源地址替换为宿主机的公共 IP 地址,以便能够通过外部网络访问。

目标地址转换(Destination NAT)

1
2
pkts bytes target     prot opt in       out       source               destination
42 2352 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5700 to:172.17.0.3:5700

规则各部分的解释:

  1. 42: 这是匹配到该规则的包的计数器,表示有 42 个数据包匹配了此规则。

  2. 2352: 这是匹配到该规则的字节计数器,表示总共传输了 2352 字节的数据。

  3. DNAT: 表示这是一个目标地址转换(Destination NAT)规则。用于将进入的数据包的目标地址更改为指定的地址。

  4. tcp: 表示此规则适用于 TCP 协议。

  5. : 这一部分通常用于分隔规则的匹配条件和目标动作,后面是匹配条件。

  6. !docker0: 这个条件表示匹配所有不通过 docker0 网桥接口的流量。docker0 是 Docker 默认创建的虚拟网络接口。

  7. *: 表示匹配所有输入接口。

  8. 0.0.0.0/0: 表示匹配所有源地址。

  9. 0.0.0.0/0: 表示匹配所有目标地址。

  10. tcp dpt:5700: 表示匹配目的端口为 5700 的 TCP 流量。

  11. to:172.17.0.3:5700: 这是 DNAT 的目标,表示将匹配到的流量的目标地址转换为 172.17.0.3,目标端口为 5700。这通常是一个 Docker 容器的 IP 地址。

规则的作用:

  • 将所有不通过 docker0 网桥接口的 TCP 流量(目标端口为 5700)重定向到 IP 地址为 172.17.0.3 的 Docker 容器的 5700 端口。
  • 这通常用于实现端口映射,使得外部流量可以访问 Docker 容器内的服务。