(docker绕过linux防火墙)Docker容器网络-实现篇

   本篇文章给大家谈谈docker有自己的防火墙吗,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

  提问1:Docker容器网络-实现篇

  本文贡献者:【后eg是否自】 ,解答(docker有自己的防火墙吗)的问题,如果问题解决,可以关注本站!

   前面介绍了: Docker容器网络-基础篇

  前文说到容器网络对Linux虚拟化技术的依赖,这一篇章我们将一探究竟,看看Docker究竟是怎么做的。通常,Linux容器的网络是被隔离在它自己的Network Namespace中,其中就包括:网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和iptables规则。对于一个进程来说,这些要素,就构成了它发起和响应网络请求的基本环境。

  我们在执行 docker run -d --name xxx 之后,进入容器内部:

  并执行 ifconfig:

  我们看到一张叫eth0的网卡,它正是一个Veth Pair设备在容器的这一端。

  我们再通过 route 查看该容器的路由表:

  我们可以看到这个eth0是这个容器的默认路由设备。我们也可以通过第二条路由规则,看到所有对 169.254.1.1/16 网段的请求都会交由eth0来处理。

  而Veth Pair 设备的另一端,则在宿主机上,我们同样也可以通过查看宿主机的网络设备来查看它:

  在宿主机上,容器对应的Veth Pair设备是一张虚拟网卡,我们再用 brctl show 命令查看网桥:

  可以清楚的看到Veth Pair的一端 vethd08be47 就插在 docker0 上。

  我现在执行docker run 启动两个容器,就会发现docker0上插入两个容器的 Veth Pair的一端。如果我们在一个容器内部互相ping另外一个容器的IP地址,是不是也能ping通?

   容器1:

   容器2:

  从一个容器ping另外一个容器:

  我们看到,在一个容器内部ping另外一个容器的ip,是可以ping通的。也就意味着,这两个容器是可以互相通信的。

  我们不妨结合前文时所说的,理解下怎么一个容器能访问另一个容器?先简单看如一幅图:

  当在容器1里访问容器2的地址,这个时候目的IP地址会匹配到容器1的第二条路由规则,这条路由规则的Gateway是0.0.0.0,意味着这是一条直连规则,也就是说凡是匹配到这个路由规则的请求,会直接通过eth0网卡,通过二层网络发往目的主机。而要通过二层网络到达容器2,就需要127.17.0.3对应的MAC地址。所以,容器1的网络协议栈就需要通过eth0网卡来发送一个ARP广播,通过IP找到MAC地址。

  所谓ARP(Address Resolution Protocol),就是通过三层IP地址找到二层的MAC地址的协议。这里说到的eth0,就是Veth Pair的一端,另一端则插在了宿主机的docker0网桥上。eth0这样的虚拟网卡插在docker0上,也就意味着eth0变成docker0网桥的“从设备”。从设备会降级成docker0设备的端口,而调用网络协议栈处理数据包的资格全部交给docker0网桥。

  所以,在收到ARP请求之后,docker0就会扮演二层交换机的角色,把ARP广播发给其它插在docker0网桥的虚拟网卡上,这样,127.17.0.3就会收到这个广播,并把其MAC地址返回给容器1。有了这个MAC地址,容器1的eth0的网卡就可以把数据包发送出去。这个数据包会经过Veth Pair在宿主机的另一端veth26cf2cc,直接交给docker0。

  docker0转发的过程,就是继续扮演二层交换机,docker0根据数据包的目标MAC地址,在CAM表查到对应的端口为veth8762ad2,然后把数据包发往这个端口。而这个端口,就是容器2的Veth Pair在宿主机的另一端,这样,数据包就进入了容器2的Network Namespace,最终容器2将响应(Ping)返回给容器1。在真实的数据传递中,Linux内核Netfilter/Iptables也会参与其中,这里不再赘述。

  CAM就是交换机通过MAC地址学习维护端口和MAC地址的对应表

  这里介绍的容器间的通信方式就是docker中最常见的bridge模式,当然此外还有host模式、container模式、none模式等,对其它模式有兴趣的可以去阅读相关资料。

  好了,这里不禁问个问题,到目前为止只是单主机内部的容器间通信,那跨主机网络呢?在Docker默认配置下,一台宿主机的docker0网桥是无法和其它宿主机连通的,它们之间没有任何关联,所以这些网桥上的容器,自然就没办法多主机之间互相通信。但是无论怎么变化,道理都是一样的,如果我们创建一个公共的网桥,是不是集群中所有容器都可以通过这个公共网桥去连接?

  当然在正常的情况下,节点与节点的通信往往可以通过NAT的方式,但是,这个在互联网发展的今天,在容器化环境下未必适用。例如在向注册中心注册实例的时候,肯定会携带IP,在正常物理机内的应用当然没有问题,但是容器化环境却未必,容器内的IP很可能就是上文所说的172.17.0.2,多个节点都会存在这个IP,大概率这个IP是冲突的。

  如果我们想避免这个问题,就会携带宿主机的IP和映射的端口去注册。但是这又带来一个问题,即容器内的应用去意识到这是一个容器,而非物理机,当在容器内,应用需要去拿容器所在的物理机的IP,当在容器外,应用需要去拿当前物理机的IP。显然,这并不是一个很好的设计,这需要应用去配合配置。所以,基于此,我们肯定要寻找其他的容器网络解决方案。

  在上图这种容器网络中,我们需要在我们已有的主机网络上,通过软件构建一个覆盖在多个主机之上,且能把所有容器连通的虚拟网络。这种就是Overlay Network(覆盖网络)。

  关于这些具体的网络解决方案,例如Flannel、Calico等,我会在后续篇幅继续陈述。

  上文就是百学百科小编解疑贡献者:(后eg是否自)回答的关于“Docker容器网络-实现篇”的问题了,不知是否已经解决你的问题?如果没有,下一篇内容可能是你想要的答案,接下来继续分折下文用户【超越梦想】解答的“容器防火墙原理”的一些相关问题做出分析与解答,如果能找到你的答案,可以关注本站。

  提问2:容器防火墙原理

  本文贡献者:【超越梦想】, 疑问关键字:docker有自己的防火墙吗, 下面就让百学百科小编为你解答,希望本文能找到您要的答案!

  优质回答防火墙的原理就是包过滤。

  基于软件容器网络对NAT的依赖以及NAT自身的局限性,网络工程师在其基础设施内部署容器时面临一些显著的挑战,但通过了解容器主机如何支持NAT模式可帮助我们避免这些问题。

  操作

  编辑 语音基于软件容器网络对NAT的依赖以及NAT自身的局限性,网络工程师在其基础设施内部署容器时面临一些显著的挑战,但通过了解容器主机如何支持NAT模式可帮助我们避免这些问题。

  首先,让我们看看主机如何创建新的网络命名空间(这在概念上类似于MPLS/VPN模型中的虚拟路由和转发实例)以及被称为虚拟以太网(vEth)的特殊网络接口。vEth接口是用于连接命名空间的一对端点,主机将vEth的一端放在默认命名空间用于与外部世界通信,另一端放在新创建的命名空间。

  默认命名空间中的vEth被绑定到桥接,例如Docker中的docker0以及LXC中的lxcbr0。主机使用Linux中的iptables来配置NAT以及轻量级动态主机配置协议(DHCP)服务器来分配地址,例如dnsmasq。

  以上就是百学百科小编解答(超越梦想)分析关于“容器防火墙原理”的答案,接下来继续为你详解用户(末世歌者)解答“Docker 设置远程连接”的一些相关解答,希望能解决你的问题!

  提问3:Docker 设置远程连接

  本文贡献者:【末世歌者】 ,解答(docker有自己的防火墙吗)的问题,如果问题解决,可以关注本站!

  优质回答vi /usr/lib/systemd/system/docker.service

  默认是:

  修改为:

  可以通过命令:

  如果natstat命令不存在:

  执行

  测试配置是否成功:

  执行命令:

  出现上述内容即认为设置成功

  如果使用外部连接工具连接docker 依旧无法连接的话

  查看linux防火墙,设置端口加入防火墙白名单

  或者直接关闭防火墙

  以上就是百学百科小编解答(末世歌者)分析关于“Docker 设置远程连接”的答案,接下来继续为你详解用户(难得心□动)解答“linux如何关闭防火墙?”的一些相关解答,希望能解决你的问题!

  提问4:linux如何关闭防火墙?

  本文最佳回答用户:【难得心□动】 ,现在由百学百科小编为你详解与【docker有自己的防火墙吗】的相关内容!

  优质回答1、 打开Linux系统进入桌面,点击上方菜单栏处【系统】选项

  2、在弹出的菜单栏中,依次点击【管理】,【防火墙】选项

  3、进入防火墙界面,输入用户密码,进行安全验证(Linux所谓的安全性,你懂的)

  4、密码验证成功,点击上方【禁用】选项,防火墙已经关闭

  5、当然也可以使用命 令进行关闭,右键点击桌面空白区域,选择【在终端中打开】

  6、进入终端界面,输入 su 命令点击回车  ,输入登录密码点击回车,取得超级管理员权限

  7、输入 service iptables stop 命令,点击回车即可关闭防火墙

  最后,你如何评价[docker有自己的防火墙吗]?欢迎下面互动!想了解更多精彩内容,快来关注本站吧。

版权声明:本文内容转载自网络,该文观点仅代表作者本人。登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站举报,一经查实,本站将立刻删除。