【跟唐老师学习云网络】 - iptables - 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进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
- 点赞
- 收藏
- 关注作者
评论(0)