栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

容器外访问容器应用详解

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

容器外访问容器应用详解

容器外访问容器应用详解
    • 1.前言
    • 2.前置知识
    • 3. 环境
      • 3.1 实验环境
      • 3.2 机器A的路由表、iptables规则、网桥
    • 4.数据包流向
    • 5.问题
    • 6. 总结

1.前言

这几天突然对容器外是如何访问容器内的应用产生了兴趣,然后看晚上讲的不是很细节,就自己弄了一下,顺便写成文章,以后自己忘记了也能够看一下。

2.前置知识

这里有几个前置知识,希望大家能有所了解:
(1)四表五链,最主要的一图已经给大家搬过来了(鸟哥那里偷的),具体的自行查阅资料哦;

图一

(2)docker容器网络默认使用桥接方式;

3. 环境 3.1 实验环境

图二

Notes:
(1) 本次实验使用机器B去访问机器A中的mysql容器;
(2) IP信息和MAC地址都已经列出来了;
(3) mysql容器指映射端口3306。

3.2 机器A的路由表、iptables规则、网桥

图三

图四

图五
4.数据包流向

(1) 从机器B访问机器A中的mysql数据库,从B机器发出去的数据包是这样的(看不到上面的图五可以重新打开一个网页一起看哦):
数据包机器B:eth0->机器A:eth0:
src ip: 172.20.187.197
src mac: 52:54:00:5d:c8:31
dest ip: 172.20.187.201
dest mac: 52:54:00:c3:d7:2a

(2) 机器A收到数据包,mac地址是本地eth0的地址,放行,数据包向上给IP层;
(3) nat表PREROUTING链: 判断目标地址是本地地址(172.20.187.201),转给DOCKER;
(4) nat表DOCKER链: 输入接口不是docker0,判断下一条;
(5) nat表DOCKER链: 输入接口不是docker0,是tcp,访问端口是3306,修改目标地址为172.17.0.2:3306,ACCPT;
(6) 路由选择: 目标地址(172.17.0.2:3306)不是本机IP,通过路由进入转发(FORWARD),由路由表可知使用docker0进行转发;
(7) filter表FORWARD链: 转给DOCKER-ISOLATION,DOCKER-ISOLATION直接返回;
(8) filter表FORWARD链: 输出接口是docker0,转到DOCKER链;
(9) filter表DOCKER链:判断目标地址是172.17.0.2/32且输入接口不是docker0,输出接口是docker0,端口是3306,接受;
(10) nat表POSTROUTING链: 源地址不是172.17.0.0/16(源地址是172.20.187.197),下一条;
(11) nat表POSTROUTING链: 源地址不是172.17.0.2/32(源地址是172.20.187.197),下一条,默认ACCEPT;
(12) 包的源mac地址填入docker0的mac地址,进入MAC层,此时docker0网桥判断目标MAC地址与172.17.0.2的MAC地址相同,则将包转发给vethb79ad42@if44,也就是转发给mysql容器;
(13) docker0 -> eth0@if45 此时包的地址信息如下:
src ip: 172.20.187.197
src mac: 02:42:5e:f6:6e:4c
dest ip: 172.17.0.2
dest mac: 02:42:ac:11:00:02
(14) 包被容器处理完后返回,发送给容器的网关,docker0(容器内的网关是机器A的网桥):
​ eth0@if45 - > docker0 此时的包地址信息如下:
​ src ip: 172.17.0.2
​ src mac: 02:42:ac:11:00:02
​ dest ip: 172.20.187.197
​ dest mac: 02:42:5e:f6:6e:4c

(15) 机器A的mac层发现mac地址是docker0,进入IP层:
(16) nat表PREROUTING链:判断出目标IP地址不是本地地址,默认ACCEPT;
(17) 路由选择: 目标地址(172.20.187.197)不是本机IP,通过路由进入转发,由路由表可知使用172.20.186.0的eth0进行转发(同一网段);
(18) filter表FORWARD链: 转给DOCKER-ISOLATION,DOCKER-ISOLATION直接返回;
(19) filter表FORWARD链: 输出接口不是docker0,跳过2条规则;
(20) filter表FORWARD链: 输入接口是docker0,输出接口不是docker0,ACCEPT;
(21) nat表POSTROUTING链: 源地址是172.17.0.0/16输出接口不是docker0,-j MASQUEREAD使用eth0的IP作为源IP发送;
​(22) 包的源mac地址填入eth0的mac地址,进入MAC层,发送;
机器A:eth0 -> 机器B:eth0 此时的包地址信息如下:
​ src ip: 172.20.187.201
​ src mac: 52:54:00:c3:d7:2a
​ dest ip: 172.20.187.197
​ dest mac: 52:54:00:5d:c8:31
(23) 机器B的eth0收到消息。

5.问题

(1) 数据包全部转给docker了,是怎么访问本地的?
答: 从图五可以发现,只有当访问端口是3306时,才会将目标地址改写为172.17.0.2。

(2) 对于DOCKER-ISOLATION这条规则链,是docker默认创建的,而对我们上面这个情况完全没啥用,进去直接就返回了,所以可以直接删除的。

6. 总结

写的不好,多多包容。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/946044.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号