《深入理解OpenStack Neutron》—2.7 iptables

举报
华章计算机 发表于 2019/05/30 11:27:08 2019/05/30
【摘要】 本书摘自《深入理解OpenStack Neutron》一书中的第2章,第2.7.1节,作者是李宗标。

2.7 iptables

iptables与前文介绍的tap/tun等不同,它并不是一个网络设备。不过它们又有相同点:都是Linux的软件。通过iptables可以实现防火墙、NAT等功能,不过这句话也对,也不对。说它对,我们确实是通过iptables相关的命令行,实现了防火墙、NAT的功能;说它不对,是因为iptables其实只是一个运行在用户空间的命令行工具,真正实现这些功能的是运行在内核空间的netf?ilter模块。

它们之间的关系如图2-15所示。

image.png

我们不必太在意这个图是什么意思,那样有点偏离主题,只需有个直观的感觉即可。本节所要描述的内容位于图中“iptables命令”方框。

iptables内置了三张表:f?ilter、nat和mangle。

f?ilter和nat顾名思义,是为了实现防火墙和NAT功能而服务的。mangle,翻译成汉语是“乱砍;损坏;用轧布机砑光”等意思,它在这里指的是“主要应用在修改数据包内容上,用来做流量整形”。

iptables还内置了另外2张表raw和security,这里不详细介绍了。

iptables内置的既是三张表,也是三条链(chain),或者换个角度说,iptables内置的是三种策略(policy),而这些策略,是由不同规则(rule)串接而成。什么叫规则呢?我们以防火墙为例,讲述一条规则:

iptables -A INPUT -i eth0 -p icmp -j ACCEPT

这条规则表达的意思是:允许所有从eth0端口进入且协议是ICMP的报文可以接受(可以进入下一个流程)的。

这就是一条规则,至于iptables的命令行格式(语法)只是一个表象,它的本质是对进入的IP报文进行说明,如:符合什么样的条件(比如本条命令的条件是“允许所有从eth0端口进入且协议是ICPM的报文”)、做什么样的处理(比如本条命令的处理是“接受”,可以进入下一个流程)。

iptables可以定义很多策略/规则,从图2-16中我们知道,这些规则最终会传递到内核netf?ilter模块,netf?ilter模块会根据这些规则做相应的处理。netf?ilter的处理方式是:从报文进入本机(linux host或vm)的那一刻起,到报文离开本机的那一刻止,中间这段时间(或者是发自本机的报文,从报文准备发送的那一刻,到报文离开本机的那一刻止,中间这段时间),netf?ilter会在某些时刻点插入处理模块,这些处理模块根据相应的策略/规则对报文进行处理。

至于nat、f?ilter、mangle三张表也可以这么理解:仅仅是为了达到不同的目的(功能)而实现的三个模块而已。

netf?ilter插入的这些时刻点如图2-16所示。

image.png

图2-16 Netf?ilter处理报文的时刻点

在这些时刻点中,上文提到三张表(模块)并不是所有的时刻都可以处理。在同一个时刻点,也可以有多个模块进行处理,那么这些模块就有一个处理顺序,谁先处理,谁后处理。这么说有点绕,具体请参见图2-17。

image.png

图2-17 Netf?ilter处理报文的详细时刻点

图中的几个关键时刻点,含义如下:

1)PREROUTING:报文进入网络接口尚未进入路由之前的时刻;

2)INPUT:路由判断是本机接收的报文,准备从内核空间进入到用户空间的时刻;

3)FORWARD:路由判断不是本机接收的报文,需要路由转发,路由转发的那个时刻;

4)OUTPUT:本机报文需要发出去,经过路由判断选择好端口以后,准备发送的那

一刻;

5)POSTROUTING:FORWARD/OUTPUT已经完成,报文即将出网络接口的那一刻。

三张表,所能对应的时刻点,如表2-4所示。

表2-4 三张表所能处理的时刻点

image.png


这三张表(三个模块)在这些时刻点,到底是做什么处理呢?下面我们逐个讲述。

2.7.1 NAT

1.?NAT的基本概念

在讲述nat这张表做何处理之前,我们首先介绍一下NAT的基本概念。

NAT(Network Address Translation,网络地址转换),顾名思义,就是从一个IP地址转换为另一个IP地址。当然,这里面的根本原因还是IP地址不够用的问题(解决IP地址枯竭的方法一个是IPv6,另一个就是NAT)。所以,NAT,大家基本做的还是公网地址与私网地址的互相转换。如果一定要在公网地址之间互相转换,或者私网地址之间互相转换,技术上是支持的,只是这样的场景非常非常少。

NAT,从实现技术角度来说,分为:静态NAT、动态NAT和端口多路复用三种方案。

(1)静态NAT(Static NAT)

静态NAT(Static NAT),有两个特征(如图2-18所示)。

image.png

①私网IP地址与公网IP地址的转换规则是静态指定的,比如10.10.10.1与50.0.0.1互相转换,这个是静态指定好的。

②私网IP地址与公网IP地址是1∶1,即一个私网IP地址对应1个公网IP地址。

(2)动态NAT

一般情况是公网IP比私网IP地址少的时候,用到动态NAT方案。如果公网IP地址比私网IP地址还多(或者相等),则用静态NAT就可以了,没必要这么麻烦。

动态NAT,就是一批私网IP与公网IP地址之间不是固定的转换关系,而是在IP报文处理过程中由NAT模块进行动态匹配。虽然,公网IP比私网IP地址少,但是,同时在线的私网IP需求小于等于公网IP数量,不然某些私网IP将得不到正确的转换,从而导致网络通信失败。

动态NAT,有三个特征(如图2-19所示)。

image.png

①私网与公网IP地址之间不是固定匹配转换的,而是变化的;

②两者之间的转换规则不是静态指定的,而是动态匹配的;

③私网IP地址与公网IP地址之间是m∶n,一般m < n

(3)端口多路复用/PAT

如果私网IP地址有多个,而公网IP地址只有一个,那么,静态NAT显然是不行了,动态NAT也基本不行(只有一个公网IP,不够用)。此时,就需要用到端口多路复用。多个私网IP映射到同一个公网IP,不同的私网IP利用端口号进行区分,这里的端口号指的是TCP/UDP

端口号。所以端口复用又叫PAT(Port Address Translation)。

端口多路复用(PAT)的特征是(如图2-20所示)。

image.png

①私网IP:公网IP = m∶1;

②以公网IP +端口号来区分私网IP。

(4)SNAT/DNAT

前面说的是静态NAT(Static NAT)、动态NAT。很遗憾,不能简称SNAT、DNAT,因为SNAT/DNAT有另外的含义,是另外的缩写。要区分SNAT(Source Network Address Translation,源地址转换)与DNAT(Destination Network 

Address Translation,目的地址转换)这两个功能可以简单地由连接发起者是谁来区分。

①内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

②当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。

2.?Netfilter中的NAT Chain

说chain有点太学究,大白话就是时刻点。通过前文介绍我们知道,NAT一共在三个时刻点对IP报文做了处理。下面我们一个一个描述。

(1)NAT-PREROUTING(DNAT)

NAT-PREROUTING(DNAT)的处理时刻点,如图2-21所示。

IP报文流的顺序是图中的“1-2-3-4-5”,在图2-21中A处,即PREROUTING时刻点进行NAT处理。IP报文的目的地址是IP1(公网IP),这个IP1就是Linux内核空间对外(公网)

呈现的IP地址(说明这样的IP地址可以有多个)。当报文到达PREROUTING这个时刻点时,NAT模块会做处理。如果需要(即提前做了相关NAT配置),NAT模块会将目的IP从IP1

转换成IP2(这个是提前配置好的),这也就是所谓的DNAT。

(2)NAT-POSTROUTING(SNAT)

NAT-POSTROUTING(SNAT)的处理时刻点,如图2-22所示。

image.pngimage.png

图2-21 NAT-PREROUTING(DNAT) 图2-22 NAT-POSTROUTING(SNAT)

IP报文流的顺序是图中的“1-2-3-4-5”,在图中“E”处,即POSTROUTING时刻点进行NAT处理。IP报文的源地址是IP3(私网IP),这个报文最后经过POSTROUTING这个时刻点时,如果需要(即提前做了相关NAT配置),NAT模块会做处理。NAT模块会将源 IP从IP3转换成IP1(这个是提前配置好的),这也就是所谓的SNAT。这个IP1就是Linux内核空间对外(公网)呈现的IP地址(说明,这样的IP地址可以有多个)。

(3)NAT-OUTPUT(DNAT)

NAT-OUTPUT(DNAT)的处理时刻点,如图2-23所示。

image.png

图2-23给人一种“迷惑/诡异”的感觉,这个IP报文是谁发出来的?如果我们把Linux内核空间(Netf?ilter)

往“外”设想一下,把它想象成一个网元,比如防火墙(防火墙里可以有NAT功能),这个防火墙自己对外发送一个报文。这个报文在D处,即OUTPUT时刻点,会做一个DNAT。这样这个报文不需要在“3”处,即POSTROUTING时刻点再做NAT,因为内核空间的IP源地址已经是公网IP,而目的地址已经在“2”处,即D处/OUTPUT时刻点已经做了DNAT。

(4)小结

Linux内核空间Netf?ilter模块的NAT处理,一共有三个Chain(处理时刻点),如表2-5所示。

表2-5 Linux内核空间Netfilter模块的NAT处理

image.png

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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