NetFilter的NAT机制(IP地址的分类)

目录

0.引用与说明

1.什么是NAT

2.IP网段的划分

3.私有IP

4.如何解决内部多台计算机同时通过一个公网IP上网的问题?

4.1 额外添加一个路由器

4.2 通用NAT

5.数据包传输方向与SNAT及DNAT之间的关系

5.1 数据包流向及NAT表结构

5.2 NAT的完整结构

6.NAT的分类

7.NAT并非无所不能


0.引用与说明


SNAT和DNAT

书的一些图

粥粥同学

本文大部分内容选自《Linux网络安全技术与实现(第2版)中的第二章节》

1.什么是NAT

NAT是Network Address Translation的缩写,意即“网络地址转换”。
NAT机制可以应用在服务器端,也可以应用在客户端,当然其用意是不一样的。
比方说,NAT应用在客户端的主要目的是隐藏客户端的IP,由此达到保护客户端
主机免于遭受因特网的攻击行为,以及节省公用IP的使用量;
而在服务器端的主要用途是保护服务器端主机在因特网上的安全。

NAT种类繁多,有一对多、多对多、一对一和NATP等四种,而这四种NAT架构将在本章中逐一介绍,
请拭目以待。

2.IP网段的划分

你一定很清楚在因特网上识别计算机主机的方式就是IP地址,而IP地址是由一组二进制的数据所构成,
其长度是32位,但长度32位的二进制数据实在是让人太难记忆了,于是有人想到把这一长串的二进制数字,
分割为4组8位长度的二进制数字,接着再将其转换成人们容易记忆的十进制数字,如192.168.1.10。
然而,这些数字如果没有适当的规划,使用起来也会有很大的困难,因此,IANA将IP地址划分为三类,
分别是A类、B类及C类,而其范围如表2-8所示。

3.私有IP

   因为IP是由32位的二进制数字所组成的,所以其能代表的主机数量是有限的,而这个上
限是2^32=42,9496,7296台主机,这个数字看起来相当惊人,有42亿多台计算机!但现在地
球上需要设置IP的设备(计算机、路由器、网络设备、PDA、无线网络电话等)很多,这42亿
多个IP真的够用吗? 未来不会再有增长吗? 事实上,这42亿的数字是绝对不够用的.


   当初IANA在划分因特网IP时,早就考虑到这个问题,因此IANA分别在A类、B类及C类网段
中,各保留了一段私有IP区间,这些区段的划分请参考表2-9。何谓私有IP?私有IP是指这些
IP只能在企业内部使用,而无法应用在因特网上。也就是说,因特网上的路由器如果看到这些
私有IP,就会将之丢弃掉,这有点像企业内每个成员都会有一组分机号码,而这个分机号码在
企业内部是可以彼此互通的,但你的朋友不可能用他家里的电话直接拨这组分机号码给你,两
者是一样的原理。私有IP只能让企业内的计算机彼此互通,却无法让企业内的计算机与因特网
上的计算机彼此互通。

4.如何解决内部多台计算机同时通过一个公网IP上网的问题?

私有IP是无法在因特网上使用的,而如今普遍使用的宽带网络(ADSL)最多所能提供给用户的
IP为16个,最少则为一个,万一企业内部有50台计算机要同时连接上因特网,该如何解决呢?

4.1 额外添加一个路由器

或许你会想到额外加一个路由器来解决这个问题,但加一个路由器真的可以解决这个问题吗?
以图2-34来说明。在图中,我们在192.168,0.0/24这个私有IP与10.0.1.0/24这个公网IP
区段间加了一个路由器,而这台ADSL只有3个公网IP,因此,我们把一个公网IP设置在路由
器的接口上(假设10.0.1.200是公网IP)。另外,私有IP区段上的两台主机的默认网关则是
指向路由器的另一个接口。

  首先,192.168.0.1这台主机尝试访问因特网上的1.2.3.4主机,因此,192.168.0.1
主机会发送一个请求数据包到默认网关,这个数据包内的“来源”及“目的”IP分别如(1)所示,
来源IP为192.168.0.1,目的IP为1.2.3.4,由于是路由器的缘故,所以这个数据包的来
源及目的IP并不会有任何的改变。

   接着,路由器会将该数据包原封不动地发送给1.2.3.4这台主机,当1.2.3.4主机收到
这个数据包时,该数据包内的来源及目的IP就如(3)所示,或许你会觉得奇怪,私有IP不是不
能在因特网上传输吗?为什么1.2.3.4还可以收到这个数据包呢?

   为了提高因特网上的数据包的传输效率,因特网上的路由器通常不检查数据包中的“来源
端IP”,而只会看日的端的IP,所以192.168.0.1主机所发送的数据包,是可以被正常传输到
1.2.3.4主机上。而当1.2.3.4主机接到这个数据包之后,其会认定数据包的发送者为192.168.0.1,
因此,1.2.3.4主机即会应答192.168.0.1的请求,所以就会送了一个数据包给来源端,这个
数据包就如(4)所示,来源端IP为1.2.3.4,目的端IP为192.168.0.1。但这下麻烦了,因为数
据包中的“目的端IP”为私有IP,因此,这个数据包是不可能被送回192.168.0.1的,因为目的
端的IP为私有IP而遭到因特网上路由器的丢弃,外加路由器的方式是不能解决当前问题的。


4.2 通用NAT

   首先,192.168.0.1会发送数据包给1.2.3.4这台主机,而这个数据包的内容就如О所示,
其来源端IP为192.168.0.1,目的端IP为1.2.3.4,当然,这个数据包一定会交给默认的
网关来处理,也就是交给NAT主机来处理,接着NAT主机会将这个数据包内的“来源端IP”
改成NAT主机上的公网IP,如R所示,如此来源及目的IP都会变成公网IP,同时,NAT主机
会将这个数据包的信息记录起来。接着,这个数据包当然可以被发送到1.2.3.4主机上,
而主机1.2.3.4当然也会应答给这个发送端,这个应答的数据包就如同0所示,但这次应
答的目的端主机为10.0.1.200这个公网IP,而不会是192.168.0.1这个私有IP。

   如此一来,这个数据包当然就可以被送回NAT主机B,当NAT主机收到这个数据包后,就可
以从之前记录下来的信息中找到当初NAT主机把192.168.0.1转成10.0.1.200的记录,
因此,NAT主机就会把这个数据包内的目的端IP改成192.168.0.16。


   从以上流程可以看到,当192.168.0.1主机发送数据包给1.2.3.4主机之后,其所希望得
到的是1.2.3.4应答给192.168.0.1,如果能够符合这个条件,192.168.0.1当然就可以
正常访问1.2.3.4主机上的资源,也就代表私有IP的主机真的可以通过NAT主机去访问因
特网上的资源。

5.数据包传输方向与SNAT及DNAT之间的关系

5.1 数据包流向及NAT表结构

在了解NAT的原理之后,有两个很重要的名词请一定要了解且牢记,那就是SNAT及DNAT,
下面将进行简单说明。请注意图2-35中(1)到(2)的步骤,谁被改变了?是Source lP,对吧?
变更Source IP的机制称为SNAT,而在(5)到(6)的步骤中,Destination IP被改变了,因此
变更Destination IP的机制就叫做DNAT。

NAT机制有很多种,有一对多,多对多,一对一及NAPT,基本上,不管是哪一种NAT:
都是出SNAT及DNAT所共同搭配出来的, 因此,如果你司以完全了解NAT的原理那么在稍后学习这
几种不同的NAT机制时,就容易理解和上手.


以图2-36为例来进一步解说SNAT及DNAT机制。

图中这台主机共安装了两块网卡,

假设有一个数据包由ethl接口送入,并从eth0接口离开,那么这个数据包将流经三个不同的机制,
其先后顺序分别为PREROUTING、路由表(Routing Table)及POSTROUTING机制. 

此外,如果数据包是由eth0接口送入并由ethl接口离开,数据包同样会流经三个不同的机制,其先
后顺序分别为PREROUTING、路由表及POSTROUTING机制。由此可以得出个结论,PREROUTING、
路由表及POSTROUTING并没有规定在特定的一侧,关键在于数据包的流向。

   究竟PREROUTING和POSTROUTING是什么呢?从图2-37可以看到nat表内所有的链,以
及一个名为PREROUTING及名为POSTROUTING的链,而图2-36中所谈到的PREROUTING
及POSTROUTING就是指这两个链。此外,我们还可以看到个名为OUTPUT链的机制;
不过请你注意,这个oUTPUT链与filter机制中的OUTPUT链可是各自独立、毫无关系的两个机制。

5.2 NAT的完整结构

 5.2.1 PREROUTING

NAT有很多不同的种类,但不管是哪.种NAT,一都是由SNAT及DNAT搭配组合血成的,
因此,当我们下发“规则”要去修改数据包的“Destination iP”时,请将该规则放
在PREROUTING链中,因为PREROUTING链的功能在于执行DNAT的任务。

此外,可以从图2-38看到,PREROUTNG链的位置在整个NAT机制的最前面。
因此在执行DNAT时,儿乎是数据包一旦进入NAT机制数据包内的“Destination IP”
即被修改,而这个“顺序”问题在整个防火墙的设置王是非常重要的。

 5.2.2 POSTROUTING

与PREROUTING链不同的是,POSTROUTING链的任务是修改数据包内的“来源端IP”,
也就是说,POSTRoUTING链的功能在于执行SNAT的任务。此外注意POSTROUTING链
的位置,POSTROUTING链位于整个NAT机制的最末端,因此当我们执行SNAT操作时,
Source IP是在整个NAT机制的最末端才会被修改的。

 5.2.3 OUTPUT

最后以图2-38为例来介绍NAT机制中的OUTPUT链,不过请你先看图2-38来回答下列问题:
(1)如果网络上在一个数据包是要送给机进程,请问在这个数据包送达进程之前,
   我们可以对该数据包执行DNAT的操作吗?

(2)如果本机进程生成了一个数据包往外发送,请问在这个数据包离开本机之前,
   我们可以对这个数据包执行SNAT的操作吗?

(3)如果本机进程生成了一个数据包往外发送,请问在这个数据包离开本机之前,
   我们可以对这个数据包执行DNAT的操作吗?


你心中是否已经有答案了呢?下列是笔者的分析:
(1)从图2-38可以看到,如果一个数据包要送给本机进程,这个数据包进入系统之后,
   就会先进入PREROUTING链,所以我们可以在PREROUTING链内执行DNAT任务,接着
   数据包才会送到路由表进行路由判断,最后抵达进程。
   第1题的答案是“可以”。

(2)当本机进程生成数据包并向外发送时,该数据包会先交给路由表来判别路由,接着
  数据包进入OUTPUT链,最后进入POSTROUTING链,接着送离本机。因此,如果我们要
  改变该数据包的Source lP,可以在POSTROUTING链中执行SNAT的操作。
  第2题的答案是“可以”。

(3)当本机进程生成数据包并向外发送时,这个数据包会先交给路由表来判断路由,接着
   数据包进入OUTPUT链,最后进入POSTROUTING链,然后送离本机。因此,这个数据包
   绝不可能送到PREROUTING链内,即使你在PREROUTING链内写再多的规则,都不可能
   改变这个数据包的Destination IP。为了解决这个问题,NAT特别设计了一个名为
   OUTPUT链的机制,而这个链的功能就是执行DNAT的任务,其对象就是本机进程产生并
   要外送的这些数据包。
   因此,第3题的答案是“可以”,但DNAT的规则是要放在OUTPUT链之内。


总结一下:
OUTPUT链的功能就是执行DNAT的任务,其对象就是本机进程产生并要外送的这些数据包。

6.NAT的分类

7.NAT并非无所不能

看完以上的示例,相信你已具备构建NAT环境的能力。
但有一点必须先提醒你,NAT不是万能的,并不是把服务于因特网上的主机搬到NAT后方,
它就安全了。
事实上,以一对一NAT为例,当因特网上的使用者攻击一对一NAT的公网IP时,这个攻击
包是会被转发到NAT后方的服务主机上,因此,真正提供服务的主机并没有因为NAT的存
在而得到任何安全性的提升。

你一定会觉得很奇怪,那为什么还要把服务主机放到NAT后方呢?因为NAT要与Filter机
制结合使用,才能使服务主机得到真正的安全,至于NAT与Filter机制该如何结合?
这部分将在2.14.1一节中给出非常清楚的解释,请耐心等待,因为还有很多基本知识需要你了解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值