Windows Dockers环境下,让windows与Dockers互通解决方案,iptables解决方案过程原理了解

看图解说

要做到网络互通,首先你必须对整个网络拓扑结构有了解。笔者为你们画了出来了。基本结构就是这样。
首先必须强调的概念是。这些网络当中,
要让我们的dockerMachine帮我们转发请求,必须在docker-machine 上面最端口转化,因为docker-machine 上面有两张网卡,一张 对外,一张对内。在其上,可以做端口映射,如将该机器上的端口50222 映射到Container1上的22端口
在这里插入图片描述
因为dockerMachine在外面可以访问,所以可以通过开放端口,映射目标地址的方式。

研究的方法
1.首先导出Iptables
通过iptables-save >before.txt

2.通过尝试添加一个redis容器,并将容器的6379端口映射到外部的56379端口,
导出iptables
3.通过iptables-save >>after.txt

得到before.txt 与after.txt。比较这两个文件

在nat 表中,添加了如下的记录。

-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 6379 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 56379 -j DNAT --to-destination 172.17.0.2:6379

在filter 表中,添加了如下的记录

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 6379 -j ACCEPT

在nat表中的第一条,表示,在下图的filter链
在这里插入图片描述

的PostRouteing ,一般是数据包向外发送的。这个一般看作是docker容器中的请求发送给dokcerMachine ,dockerMachine充当路由器的角色,将对数据包的源地址进行转化成为本机地址,我们称之为MASQUERADE,也就是自动替换(如果是路由器将会替换成公网地址)。本条我们就不必关注了。

关注nat的第二条-A DOCKER ! -i docker0 -p tcp -m tcp --dport 56379 -j DNAT --to-destination 172.17.0.2:6379这一条在nat 的DOCKER链中,添加了一条规则,这条规则是,

  1. ! -i docker排除docker0接口来的请求
  2. -p tcp只支持tcp 传输协议
  3. -m tcp使用 tcp 扩展模块的功能 (tcp扩展模块提供了 --dport, --tcp-flags, --sync等功能)
  4. --dport 56379表示目标端口是本机的56379端口
  5. -j DNAT目标地址转化,目标地址可能是本机,需要转化成为172.17.0.2 所以后面跟着一个
  6. --to-destination 172.17.0.2:6379后面跟着一个转化目标地址,表示数据包的请求的目标地址与端口转化成为规则制定的那样。

照猫画虎
sudo iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 50222 -j DNAT --to-destination 172.17.0.3:22

然后尝试着请求一下50222端口(前提是你的172.17.0.3容器开22端口,否则还是不会通的!!!)
在这里插入图片描述
发现果然没有通,让我们来分析一下原因,数据包在经过docker-machine 的时候,目标地址确确实实被转化了,但是源地址没有转化呀!你随便丢一个网段来的数据包我就给你访问,这不是搞笑吗?

扫描二维码关注公众号,回复: 8681645 查看本文章

所以分析filter表里面新增的iptables规则描述。
同样我们可以写出一条新的。
sudo iptables -t filter -A DOCKER ! -i docker0 -p tcp -m tcp --dport 22 -j ACCEPT
在这里插入图片描述

尝试着访问,果然是ok,好了,本教程到此结束,望读者能举一反三。

发布了73 篇原创文章 · 获赞 55 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/blueboz/article/details/89300260