文章插图
该机器真正的网口是enp0s3 。docker 启动的虚拟网口是docker0
docker服务本身会在iptables中插入很多规则 , 甚至定义许多自定义化的链
当我们我们在192.68.31.23 这台机器上访问192.168.31.102的3306端口时 。
首先数据包被nat表中PREROUTING链命中

文章插图
该链中的规则会被命中 , 同时将数据包导向nat表的DOCKER 链
nat中的DOCKER链修改目标地址

文章插图
- 第一条规则的输入网口是docker0 , 显然从192.168.31.102外部访问该机器不可能走这个网口进入 , 因为docker建立了虚拟网络 , 不可能被外部访问 , 所以第一条规则不会命中
- 第二条规则的输入网口是
!docker0
, 表示非docker网络 , 该规则能被匹配 。由于mysql 实际安装在docker内 , 如果最终要实现访问 , 就要对请求包的目标地址进行修改 , 于是该条规则在匹配后的动作是:tcp dpt:3306 to:172.17.0.2:3306
, 即将目标网络端口改成docker网段下的172.17.0.2:3306

文章插图
由于prerouting对包进行了目标地址的修改 , 于是路由决策会将该包路由到foward链 。所有表中的input 链将直接忽略 。
- forward链中的第一条规则 , 会应用于DOCKER-USER链 。该链的规则是直接返回包 。
文章插图
相当于第一条规则没启作用 。直接会进入第二条规则进行匹配计算
- 第二条链会包导入DOCKER-ISOLATION-STAGE-1链进行规则计算
文章插图
- 一路链下去 , 最终只有图中的规则
③
能命中 , 而该规则对包的处理方式 , 是RETURN , 也即交给下个规则处理
- 第三条规则
文章插图
是对目标网口是docker0的包进行匹配 , 按理说我们的包会匹配这条规则 , 但是这条规则被匹配还有一个条件 , 就是包链接的状态要是已建立的连接才行 , 我们第一次从外部对数据库进行访问显然不符合这个要求 , 于是该规则不会命中 。进入第四条规则匹配
- 第四条规则命中后 , 进入DOCKER 链
文章插图
从截图可以看到 , 包到了这里 , 被完美匹配 。该包首先是一个非docker网络到docker网络的访问 , 其次 , 其目标ip是172.17.0.2 的3306端口 , 匹配后 , 处理动作是ACCEPT 。也即最终该访问被响应 , 我们从外部网络访问到数据库了 。
经验总结扩展阅读
- 华为车载智慧屏值得买吗_华为车载智慧屏使用评测
- 夏天使用空调怎么更省电 空调不制冷解决方法
- Pytest进阶使用
- RAID5 IO处理之条带读代码详解
- RAID5 IO处理之写请求代码详解
- RAID5 IO处理之重构代码详解
- RAID5 IO处理之replace代码详解
- 法国大宝能当晚霜使用吗?
- 如何使用 pyqt 读取串口传输的图像
- 你们觉得华为手机卡不卡,使用体验如何(华为加装nm卡缺点)