【跟唐老师学习云网络】 - iptables - nat穿越功能

举报
tsjsdbd 发表于 2017/09/18 11:08:12 2017/09/18
【摘要】 知道“网络骗子”是一种套路,那么它具体怎么实现这个套路的呢,我们细细分析NAT的实现。

我们从最简单的开始:

1. 启动一个Docker容器,带上端口映射的-p选项。(注:-p选项会开启一个端口NAT规则)。

#docker pull mysql

#docker run -d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql

在这个mysql的数据库容器就启动好之后,它在主机上是类似这个样子的:

这里,你可以把本机也看作是“其他Host”。(大概意思可以认为:咱们主机级别的,跟容器不是一个层次的,需要分开考虑),这里可以看到容器与外部世界的交互主要需要是:外面要能通里面,里面要能通外面。

 2. 然后咱们看看这个最简单的一个容器的NAT具体的规则是怎么设置的:

分析上图:

步骤1:为了实现入口与出口的流量控制,打开具体的iptables看看

步骤 2 & 3:DNAT=替换目的IP,主机收到报文(也就是从外部收到报文)时,把目的IP换成对应的容器的,然后转发给对应的容器里面去。(入口流量控制)

步骤4 & 5: MASQUERADE=替换源地址,主机往外发报文时,把原始是容器的源IP,换成源地址为主机的。

3. 整个效果就是“其他Host”看到的报文就是来自于另外一台主机,感觉自己只是与另外一台主机在通信:

而报文一旦到达对方主机,对方的主机就咔咔咔一顿处理,然后就转交给主机上对应的容器了。

而我们一般说的容器通信都是这种,只要报文到达对方主机,总能进入对应的容器。因为对方主机在主机上为容器开了一个口子,报文一旦到达这个口子,就进入到了容器。这个口子就是端口,一旦报文是这个端口的,统统转交给对应的容器。

看上面的例子,在主机上开的口子的端口就是3306。任何达到主机的报文,只要目的端口是3306,直接转交给mysql容器。

4. 主机上面为容器开口子大概长这个样子:

因为主机的端口数很多,所以可以使得一个主机可以有很多的容器都可以对外暴露地址。

容器对外暴露的地址就是:主机IP+主机Port

这个地址,Kubernetes取了一个好听的名字:NodePort模式。

5. 接着我们再来看一个复杂的iptables的NAT穿越

我们在Kubernetes的Node节点上面查询nat表信息:

# iptables -t nat -nL

会列出很大一片,密密麻麻的,这里肯定贴不下,这里我们就分段分析它的实现。

a) 咱们不看NodePort规则,因为上面已经解释过了

直接找到下面这种样子的规则:

这里可以看到这些规则很明确:任意源ip,特定的目的IP,直接命中规则。

步骤1:这里的目的IP是一个假的IP,实际不存在的。“网络骗子”章节介绍过,这个假的IP是DNS欺骗你的,是你通过“名字”换回来的。那么规则的意思就是一旦有人访问这个假IP,就命中iptables规则(被捕获)。每一条规则代表捕获一种假IP的访问。

步骤 2:那么我们随便找一条规则来分析,例如名字图中 2这条规则。

当报文匹配到这一条规则后,就跳转到对应名字的规则链里面去。

我们把对应的规则链找出来看看:

步骤3:可以看到这个规则链就一条规则:任意源IP,任意目的IP,命中并跳转到下一条规则链。(任意进入这条链的报文,直接进入下一跳规则链)

那么我们再看看下一条规则链:

步骤4:这里看到了,规则是这样子的:直接把报文的目的地址改为真实容器的IP。然后规则结束。这样子报文就会直接发给对应的容器了。

总结上面的流程:一旦发现有发给特定的假IP的报文,直接把目的IP换掉,换成这个假IP对应的容器的真实IP。 并且这个过程是强制的,也就是当前主机上所有的报文都得经过这个iptables的检查(即一旦访问肯定会被捕获)。

(这个就是网络骗子行骗的具体伎俩了

                                                                                                                                 作者|唐盛军

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:hwclouds.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。