《深入理解OpenStack Neutron》—2.7 iptables
2.7 iptables
iptables与前文介绍的tap/tun等不同,它并不是一个网络设备。不过它们又有相同点:都是Linux的软件。通过iptables可以实现防火墙、NAT等功能,不过这句话也对,也不对。说它对,我们确实是通过iptables相关的命令行,实现了防火墙、NAT的功能;说它不对,是因为iptables其实只是一个运行在用户空间的命令行工具,真正实现这些功能的是运行在内核空间的netf?ilter模块。
它们之间的关系如图2-15所示。
我们不必太在意这个图是什么意思,那样有点偏离主题,只需有个直观的感觉即可。本节所要描述的内容位于图中“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所示。
图2-16 Netf?ilter处理报文的时刻点
在这些时刻点中,上文提到三张表(模块)并不是所有的时刻都可以处理。在同一个时刻点,也可以有多个模块进行处理,那么这些模块就有一个处理顺序,谁先处理,谁后处理。这么说有点绕,具体请参见图2-17。
图2-17 Netf?ilter处理报文的详细时刻点
图中的几个关键时刻点,含义如下:
1)PREROUTING:报文进入网络接口尚未进入路由之前的时刻;
2)INPUT:路由判断是本机接收的报文,准备从内核空间进入到用户空间的时刻;
3)FORWARD:路由判断不是本机接收的报文,需要路由转发,路由转发的那个时刻;
4)OUTPUT:本机报文需要发出去,经过路由判断选择好端口以后,准备发送的那
一刻;
5)POSTROUTING:FORWARD/OUTPUT已经完成,报文即将出网络接口的那一刻。
三张表,所能对应的时刻点,如表2-4所示。
表2-4 三张表所能处理的时刻点
这三张表(三个模块)在这些时刻点,到底是做什么处理呢?下面我们逐个讲述。
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所示)。
①私网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所示)。
①私网与公网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所示)。
①私网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所示。
图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所示。
图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处理
- 点赞
- 收藏
- 关注作者
评论(0)