【Docker network 1】 docker 网络模式详解

Docker 网络模式

  在刚安装docker后,docker默认是拥有三种docker网络模式

    1. Bridge(在安装docker后,宿主机会多出一个网络设备docker0。默认情况下容器的网络模式为bridge,即所有的container都连接在docker0上,实现二层互通。当然取决enable-icc的值。docker0的enable-icc 为true)

      --net=bridge

    2. none (创建container后,网络配置没有指定,需要手动配置,但是新的namespcae已经被创建)

       --net=none

    3. Host ( 和宿主机使用同一个NameSapce,即container 没有自己的网络内核协议栈,和主机共享IP,Port,Socket等)

        --net=host

 TIP: Linux 可以使用 ip netns list 命令查看当前linux所有的network namespace。实际就是读取 /var/run/netns 目录。而如果创建container不是指定network 为host模式,都会创建一个新的network namespace。但是我们却用ip netns list 无法读取。docker 容器默认的network namespace 存取在/var/run/docker/netns 目录下。如果想使用ip netns list 读取docker 的namespace 。可以创建软连接。

 

4. Container (和指定的Container共享一个网络协议栈,即和指定的容器共享ip,port和socket等)

     --net=container:

 

 

Bridge 模式

 本文主要讲解Bridge模式,该种模式是docker网络缺省模式,同时也是最重要的。

首先讲解一下docker0 这个网桥设备

    【Docker network 1】 docker 网络模式详解_第1张图片

可以看到docker0 的ip地址是 172.17.0.1 ,而docker 缺省的bridge模式使用的地址是 172.17.0.0/16  

【Docker network 1】 docker 网络模式详解_第2张图片

同时我们可以看到sysctl  net.ipv4.ip_forward 的值已经是1。即内核开启了转发模式。

 

防火墙和Docker

     由于我们的产品有防火墙和DPI 功能,我们是通过netfilter来hook流量。我们会在ARP ,IPv4和IPv6 hook number上挂载我们的callback函数。那这个防火墙能不能拦截docker的流量呢。

场景: 

    Container1: 172.17.0.2

   Container 2: 172.17.0.3 

 默认情况下,Container1 和Container2 互通,可以Container1和Container2 都可以访问公网。

【Docker network 1】 docker 网络模式详解_第3张图片

当将防火墙打开,附加一条策略(阻止ICMP incoming)。

1. 使用docker0这个网桥

  a. 容器之间的流量能否被拦截

     由于Container内部的网卡一般是veth设备对,一端连接在container内,一端连接在docker0上。用来连接container的namespace和global namesapce(缺省的namespace)。当container1 ping container2。 流量会先通过veth到达docker0。而container2就是连接在docker0上,会直接在二层就转发了。由于我们的netfilter hook在arp,ipv4 ipv6上。所以设置了防火墙策略(阻止icmp in)并不能生效。但是如果设置的策略是阻止ARP报文 incoming ,就会ping不通,但是一般不会有人设置这样的策略。

【Docker network 1】 docker 网络模式详解_第4张图片

b. 容器访问外部网络

  由于container的流量会通过docker0,而由于是访问外部网络,Bridge转发机制走完后,会将网络包转交给宿主机的内核协议栈,而在进内核协议栈的时候,会执行我们挂载的callback函数。所以这种情况,防火墙是可以组织容器访问外部的流量。

【Docker network 1】 docker 网络模式详解_第5张图片

 

2. 如果使用自己创建的网桥,同时还将宿主机的网卡eth0 附加到创建的网桥上后

  当使用自己创建的网桥,而且物理网卡被附加到网桥后,容器拿到的ip地址会和宿主机是同一个网段,类似于桥接的模式。

   a. 容器之间的流量能否被拦截

    同1, 不能被拦截

  b. 容器访问外部网络

     这时候访问外部网络,是不会经过宿主机的内核协议栈的。同样也就不会执行我们的callbak函数了。所以这种情况下,我们的防火墙也是不生效。

 

自己创建的网桥和docker0的区别可以参考我另一篇博客

https://blog.csdn.net/sinat_33822516/article/details/98648415

 

 

 

你可能感兴趣的:(Linux,docker)