美文网首页
Docker iptables 详解

Docker iptables 详解

作者: M_ZH | 来源:发表于2020-09-04 11:56 被阅读0次

1. 环境说明

该环境安装了docker ,并启动了一个容器做了端口映射

iptables 里raw、mangle 表都是空的


// docker 容器

docker ps| grep 43040d1aba46

43040d1aba46 aylei/aliyun-exporter:0.3.1 "python -u /usr/loca…" 2 months ago Up 2 months 9522/tcp, 0.0.0.0:9525->9525/tcp gallant_lumiere

// iptables filter 表 配置

Chain INPUT (policy ACCEPT)

target prot opt source destination         

Chain FORWARD (policy DROP)

target prot opt source destination         

DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0           

DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED

DOCKER all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)

target prot opt source destination         

Chain DOCKER (1 references)

target prot opt source destination         

ACCEPT tcp -- 0.0.0.0/0 172.17.0.6 tcp dpt:9525

Chain DOCKER-ISOLATION-STAGE-1 (1 references)

target prot opt source destination         

DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)

target prot opt source destination         

DROP all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-USER (1 references)

target prot opt source destination         

RETURN all -- 0.0.0.0/0 0.0.0.0/0     

// iptables nat 表配置

Chain INPUT (policy ACCEPT)

target prot opt source destination         

Chain FORWARD (policy DROP)

target prot opt source destination         

DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0           

DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED

DOCKER all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)

target prot opt source destination         

Chain DOCKER (1 references)

target prot opt source destination         

ACCEPT tcp -- 0.0.0.0/0 172.17.0.6 tcp dpt:9525

Chain DOCKER-ISOLATION-STAGE-1 (1 references)

target prot opt source destination         

DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)

target prot opt source destination         

DROP all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-USER (1 references)

target prot opt source destination         

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

[root@yunwei_jenkins-dev_1 ~]# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)

target prot opt source destination         

DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)

target prot opt source destination         

Chain OUTPUT (policy ACCEPT)

target prot opt source destination         

DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination         

MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0           

MASQUERADE tcp -- 172.17.0.6 172.17.0.6 tcp dpt:9525

Chain DOCKER (2 references)

target prot opt source destination         

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9525 to:172.17.0.6:9525

2. 数据如何经过iptables

接着来梳理,数据经过iptables 是如何处理的。首先需要了解iptables 的组成:
iptables 有4表(raw、mangle、nat、filter)5链(prerouting、input、forward、output、postrouting),数据经过iptables 需要按顺序经过5链进行处理。看下图:

image.png

1、首先数据经过prerouting表,由于 raw、mangle表都为空,所以可以直接看nat表的prerouting 链:

从这里可以看到通过nat表中的prerouting链,将所有访问本地地址的数据都匹配到Docker 链;

而Docker 这里有DNAT 规则,将访问宿主机 9525端口的数据转发到 172.17.0.6:9525


// nat 表

# iptables -t nat -nL   

Chain PREROUTING (policy ACCEPT)

target prot opt source destination         

DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)

target prot opt source destination         

Chain OUTPUT (policy ACCEPT)

target prot opt source destination         

DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination         

MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0           

MASQUERADE tcp -- 172.17.0.6 172.17.0.6 tcp dpt:9525

Chain DOCKER (2 references)

target prot opt source destination         

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9525 to:172.17.0.6:9525

2、再到input链,其中mangle表为空,直接看nat、filter表中的input链:

从【1】可以看到nat 中input链以及filter表的input链都没做任何规则


// filter表

# iptables -t filter -nL

Chain INPUT (policy ACCEPT)

target prot opt source destination         

Chain FORWARD (policy DROP)

target prot opt source destination         

DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0           

DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED

DOCKER all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)

target prot opt source destination         

Chain DOCKER (1 references)

target prot opt source destination         

ACCEPT tcp -- 0.0.0.0/0 172.17.0.6 tcp dpt:9525

Chain DOCKER-ISOLATION-STAGE-1 (1 references)

target prot opt source destination         

DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)

target prot opt source destination         

DROP all -- 0.0.0.0/0 0.0.0.0/0           

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

Chain DOCKER-USER (1 references)

target prot opt source destination         

RETURN all -- 0.0.0.0/0 0.0.0.0/0           

3、再接着到output链,raw、mangle为空,直接查看nat、filter表中的output 链

从上可以看到 nat 表中的output链将所有目的地址为非环回地址的本地地址数据匹配到Docker链,然后重复DNAT;

再到filter表中的output链没有做任何规则

4、 最后到postrouting 链,mangle 为空,nat 表将目标地址为0.0.0.0 数据通过SNAT做动态转发出去,而目标地址为172.17.0.6 的则转发到9525 端口

PS:
这是经过朋友的讲解和自己一些理解,如有错误请指正。

相关文章

  • Docker iptables 详解

    1. 环境说明 该环境安装了docker ,并启动了一个容器做了端口映射 iptables 里raw、mangle...

  • iptables

    iptables详解 iptables简介 netfilter/iptables(简称为iptables)组成Li...

  • docker容器iptables failed: iptable

    docker容器iptables failed: iptables --wait -t nat -A DOCKER...

  • ubuntu20.04 ufw 无法管控docker映射端口的问

    需要关闭docker iptables功能,具体操作如下 添加iptables规则 删除iptables规则

  • iptables 安全

    注解;来自某位大神的详解,做个笔记。 iptables防火墙简介 Netfilter/Iptables(以下简称I...

  • linux中iptables 和路由配置

    route 配置 添加和删除例如 添加和删除默认路由 iptables 配置 iptables 配置详解 删除ip...

  • Docker iptables failed

    启动 docker 容器时报错,提示iptables failed 。 1.问题回顾 >docker contai...

  • centos, minikube coredns CrashLo

    systemctl stop kubelet systemctl stop docker iptables --f...

  • iptables 详解

    和window系统的防火墙一样,Linux也是有防火墙的。 如果你搜索【Linux防火墙】: 就会发现,大家都在教...

  • iptables详解

    iptables俗称防火墙,或许我们已经不在陌生,但是作为openstack基础,这里还是对其做一些补充,了解更多...

网友评论

      本文标题:Docker iptables 详解

      本文链接:https://www.haomeiwen.com/subject/qqjzsktx.html