Linux下的NAT服务器架设实战(上)
【IT168 专稿】NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。
NAT工作原理
NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。如图1所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共 IP,为202.204.65.2;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机166.111.80.200发送了1个IP包(Des=166.111.80.200,Src=192.168.1.2)。当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP并转发到公共网,此时IP包(Des=166.111.80.200,Src= 202.204.65.2)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT的公共IP,响应的IP包(Des= 202.204.65.2,Src=166.111.80.200)将被发送到NAT。这时,NAT会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。
![]() |
| 图 1 NAT工作原理图 |
1. NAT的实现方法
NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。比如Cisco路由器中已经加入这一功能,网络管理员只需在路由器的IOS中设 置NAT功能,就可以实现对内部网络的屏蔽。,其他如Linux中的IP伪装(IP Masquerade),FreeBSD中的NATD或Windows98的Sygate软件和Windows 2000 、2003都包含了这一功能。
2. NAT分类
(1) 源NAT(Source NAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。
(2) 目的NAT(Destination NAT,DNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据懈的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。
二、 Linux下NAT的工作原理
1. netfilter/iptables 系统是如何工作的?
netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的 链(chain)中。虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter和 iptables 组成。 netfilter 组件也称为 内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为 用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有 目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。图2 用图形说明了这个信息包过滤过程。
![]() |
| 图 2 信息包过滤过程 |
2. 基于netfilter/iptables的NAT如何工作
Linux下的NAT 是基于netfilter/iptables的。表1 是 netfilter/iptables 内核空间默认的表和链说明:filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。Mangle不经常使用还在开发当中。我们下面主要介绍Nat表来实现NAT功能。
![]() |
(1)用户使用iptables命令在用户空间设置NAT规则,通过使用用户空间iptables命令,可以构建用户自己的定制NAT规则。所有规则存储在内核空间的nat表中。根据规则所处理的信息包类型,将规则分组在链中。要做SNAT的信息包被添加到POSTROUTING链中。要做DNAT的信息包被添加到PREROUTING链中。直接从本地出站的信息包的规则被添加到OUTPUT 链中。
(2)内核空间接管NAT工作
图 3是 数据包穿越nat表的流程图
![]() |
| 图 3 数据包穿越nat表的流程图 |
做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。图4 是数据包穿越整个netfilter/iptables的流程图。
![]() |
| 图4 数据包穿越整个netfilter/iptables的流程图 |
图5 是netfilter钩子函数在NAT模式(module)下的使用情况示意图。
![]() |
| 图5 netfilter钩子函数在NAT模式(module)下的使用情况示意图 |
(3)NAT工作步骤:
DNAT:若包是被送往PREROUTING链的,并且匹配了规则, 则执行DNAT或REDIRECT目标。为了使数据包得到正确路由, 必须在路由之前进行DNAT。
路由:内核检查信息包的头信息,尤其是信息包的目的地。
处理本地进程产生的包:对nat表OUTPUT链中的规则实施规则检查, 对匹配的包执行目标动作。
SNAT:若包是被送往POSTROUTING链的,并且匹配了规则, 则执行SNAT或MASQUERADE目标。 系统在决定了数据包的路由之后才执行该链中的规则。
3. 与NAT相关的iptables命令格式
(1)命令格式:
iptables [-t nat] CMD [chain] [rule-matcher] [-j target]
-t nat:表示操作nat表
CMD:为操作命令
chain:为链名
rule-matcher:为规则匹配器
target:为目标动作
说明:iptables的语法非常复杂,要查看该工具的完整语法,应该查看其手册页。iptables 中的指令,均需严格区分大小写。
(2)指定操作命令:
-A:在所选链的链尾加入一条规则;
-D:从所选链中删除一条匹配的规则;
-R:在所选链中替换一条匹配的规则;
-I:在链内某个位置插入一条新规则;
-L:列出指定链的所有规则。
(3)规则匹配器
指定规则匹配器
匹配源地址
使用--source或--src或-s参数
匹配目的地址
使用--destination或--dst或-s参数
匹配网络接口
对于PREROUTING链,只能用-i参数匹配进来的网络接口
对于POSTROUTING链和OUTPUT链,只能用-o参数匹配出去的网络接口
匹配协议及端口
使用-p选项来匹配协议
对于udp和tcp协议,还可以用--sport和--dport选项来分别匹配源端口和目的端口。
(4)动作目标
指定与NAT有关的目标动作:
用于设置IP伪装:
-j MASQUERADE
用于设置端口转发:
-j REDIRECT --to-port port-number
Linux网络地址转换(NAT)也可以使用 iptables 进行配置。从根本上来说,NAT 是一种使用连接将来自本地子网地址的封装报文在发送(在 OUTPUT 链上)之前作为外部 WAN 地址进行跟踪的方法。执行 NAT 的网关/路由器需要记住哪台本地机器连接到了哪台远程机器上,当报文从远程机器上返回时,它需要对这种地址转换反向进行解析。
尽管从过滤器的角度来看,我们可以简单地认为 NAT 并不存在。我们指定的规则应该使用 “真正的” 本地地址,而不必关心 NAT 如何封装它之后将其呈现给外部世界。
总结:本文介绍了NAT原理以及NAT在Linux应用环境下的实现,下篇文章笔者将结合具体应用情况构建Linux下的NAT服务器,敬请关注(点击)。
