美文网首页
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 详解

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