NAT服务器与防火墙

来源:百度文库 编辑:神马文学网 时间:2024/04/27 20:54:02
来源:南方Linux (2006-06-20 14:50:37)
NAT服务器与防火墙
▓ 浅谈IP
▓ NAT原理及主要功能
▓ NAT服务器的安装与使用
▓ iptables在防火墙上的运用
▓ 实例练习
▓ 防火墙的简单设置
▓ iptables 设置文件参考范例
Squid 服务器有着快速读取功能,减少了客户端直接连接Internet的机会,不足,这在目前以IPv 4为主流的网络环境中,的确困扰着许多系统及网络设计人员。因此本章将使用NAT的方式来提供这一问题的解决方案。除此之外,利用NAT概念的扩展,我们也将介绍防火墙的基本概念以及它对企业网络安全性的影响。
◆ 浅谈IP
因为NAT的使用主要是为了解决IP地址不足的问题,所以在学习NAT的内容前,必须先对IP地址的意义及功能要有基本的了解。本节将就IP的基本特性逐一介绍以帮助读者建立正确的概念。
◆ IP的定义
IP是位于OSI网络模型中的网络层(Network Layer)能信协议,它也是TCP/IP 通信协议,它也是TCP/IP通信协议组件中最重要的两个通信协议之一,目前Internet中使用的版本是IPv4,有关它的标准都定义在RFC 791中。
◆ IP主要定义3个基本概念:
● 在TCP/IP网络中定义数据传输的基本单位- -数据报(Datagram),所有数据在网络上传递都有特定的格式。
● IP运行路由(Routing)的功能,它会选择一条最佳路径供数据传输之用。
● 订立数据报在不可靠(Unreliable)的网络上传递时应该遵循的原则。
通常IP是利用以下的运作模式将数据发送到网络上的:
① 源主机IP层之上的传输服务会选将数据以TCP或UDP的格式发送到IP层上。
② IP层再将来源及目地的地信息(用来在网络上路由的数据)与IP数据报组合。
③ 接下来IP层将数据报向下发送到网络接口层,在这一层中,数据链路服务会将IP数据报转换成框架,以便在物理网络中的特定媒体上进行传递。
④ 因为每个IP数据报都包含来源及目的的地址,然后将这个地址与区域维护的路由表相比较,再判定需进一步采取的转送动作,而在目的地主机上则要运行反向处理。
◆ IP寻址
除了路由之外,IP的另一项重要功能为寻址(Addressing)目前Internet上都使用这套标准来表示主机和网络点的逻辑地址,而通过这个管理模式,可以确定每台主机或网络都拥有惟一的识别方法,这可避免地址重复问题的发生。
有一点请大家注意的,每个网络设备的物理地址(MAC)也具有惟一性,可以用来精确表示网络上的主机位置,但因为无法利用其地址来建立一套管理方法,所以通常无法达到寻址的功能所以才设计出IP的寻址方法。
在IPv4中,每台主机所使用的IP地址都是以32个二进制的数字来表示,如011110101011001010010110101101111,这种表示法可以确保Internet上的每台主机都有惟一的地址,因为这些地址都需要经过InterNIC的授权才可以使用。如果知道特定的IP地址,就可以利用这个地址来连接到此主机。
以上的例子中使用32个二进制的数字来表示IP地址,当然也可以使用十六进制(75652D6F)或十进制(196965039)来表示,但这些表示法都很难让一般用户记忆。所以IP地址通常使用Dotted Decimal Notation(DDN)表示法,它是将32个二进制的位分为4个字节(有时也称为Octet),然后将每个字节以十进制来表示,而每个字节之间以一具句点(.)来分隔。因此,上例中的IP地址DDE表示法为117.101.45.111,这个表示法并没有什么特殊意义,只是利于识别的方便,如图1-1所示。

根据IP的定义,每个IP地址都是由两个部分所组成:网络识别码(Network ID)及主机识别码(Host ID)。例如,网络识别码包含8位,则主机识别码就有32-8=24个位。而用来判断网络识别码的主机识别码包含的位数,就必须使用“子网掩码”(Subet Mask)和IP地址来运算,举例来说,在一般情形下,IP地址为150.23.51.36的网络识别码是“150.23”,而主机识别码为“51. 36”,如图1-2所示。

网络识别码在网络中是相当重要的概念,因为它可用来识别TCP/IP网络中的网络节点,而所有位于同一具网络节点中的主机,都拥有相同的网络识别码。换句话说,如果两台主机的IP地址中包含相同的网络识别码,则它们可以互相传递信息,而无需通过路由器或网关转送。反之,如果两台主机的IP地址经过子网掩码运算后的网络识别码不同,则它们必须通过路由器或网关转送才可彼此通信。当在规划局域网时须特别注意这一点,否则随意地指定IP地址,可能会产生无法通信的问题。
而主机识别码是用来识别TCP/IP网络中的节点(可能是工作站、服务器、路由器或其他TCP/IP设备),每台设备的主机识别码在本地的网络节点都必须惟一,如果同一个网络节点中的两台主机具有相同的主机识别码,则它们会发生无法连接网络的问题,但是在不同网络节点中的两台主机可以使用相同的主机识别码。例如,150.128.3.11和150.128.3.11不以同时存在网络中,因为它们的网络识别码和主机识别码都相同,但是150.128.3.11和145.200.3.11可以同时存在不同的网络中,因为它们的主机识别码虽然相同,但是网络识别码却不同。
◆ IP地址类别
因为每个IP地址都是由32个二进制的数字组成,所以理论上来说,应该会存在2的32次方个合法IP地址(232=4294967296),但是事实上并没有如此多的IP地址。目前InterNIC利用控制IP地址中的第一个字节(前8个位)来区分为5个IP类别,我们称它们为Class A、 Class B、Class C、Class D、和Class E、如图1-3所示。

● Class A
在Class A的网络中,每个网络都是利用前8个位来定义,因此有时也称为“/8网络”。因为第一个位已被事先定义为二进制的0,所以ClassA的第1个字节是由00000001~01111111,也就是十进制的1~127,但因为127是个特殊的网络识别码(Lookback Address),所以目前Internet上具有126个Class A网络。
Class A使用最后3个字节(24个位)来表示主机识别码,因此每个Class A网络可以包含的主机数目为224,也就是16777216台主机。但是主机识别码全为1和0表示广播网络地址,因此每个Class A网络实际的主机机数目为16777214,由此可知,所有Vlass A的主机数目是126*16777214=2113928964。
● Class B
在Class B网络中,每个网络都是利用前16个位来定义,因此有时也称为“/16网络”。因为前2个位已被事先定义为二进制的10,所以Class B的第一个字节是由10000001~10111111,也就是十进制的128~191,而第二个字节也是网络识别码,所以Internet上具有64*28=16384个Class B网络。
Class B使用最后2个字节(16个位)来表示主机识别码,因此每个Class B网络可以包含的主机数目为216 ,也就是65536台主机。但是主机识别码,因此每个Class B网络可以包含的主机数目为65534,由此可知,所有Class B的主机数目是167384 * 65534=1073709056。
● Class C
在Class C的网络中,每个网络都是利用前24个位来定义,因此有时也称为“/24网络”。因为前3个位已被事先定义为二进制的110,所以Class C的第一具个字节是由11000001~11011111,也就是十进制的192~223,而第2和第3个字节也是网络识别码,所以目前Internet上具有32 * 216=2097152个Class C网络。
Class C使用最后1个字节(8个位)来表示主机识别码,因此每个Class C网络可以包含的主机数目为28,也就是256台主机。但是主机识别码全为1和0表示广播及网络地址因此实际的主机数目为254,而所有Class C的主机数目是254 *2097152=532676608。
● Class D
Class D的IP 地址只供多点发送(Multicast)的群组计算机使用,也就是说以这些地址发送的信息可以同时发送到多台主机,这些地址是用在某些特殊的软件组或服务。
Class D网络的前4个位已被事先定义为二进制的1110,所以Class D的第一个字节是由11100001~1101111,也就是十进制224~239,所以目前有16个Class D网络,但这些地址并不提供给一般的Internet主机使用,它可以不具有子网掩码。
● Class E
Class E的IP 地址是属于实验用的地址,这些地址并不提供给一般的Internet 主机使用,它的前5个位已被子事先定义为二进制的11110,所以Class E的第一个字节是由11110001~11110111,也就是十进制的240~254,所以目前有15个Class E网络。
● 私有IP地址(Private IP Address)
如果用户的网络不不连接Internet,那么无湎为了使用TCP/IP通信协议而向InterNIC或ISP取得已登录的IP 地址使用权,在此情形下,IANA(Internet Assigned Numbers Authority)建议使用“私有IP地址”。这些地址都是由IANA所保留,主要是提供在TCP/IP网络上的私人使用,Internet上的主机也不可使用这些地址,而这些私有IP地址正是NAT运作上所使用的地址。
这些私有IP地址的范围如表1-2所示

================================
注:
有些人习惯将这些IANA保留IP地址称为虚拟IP,而开放在Internet上的地址则称为物理IP地址,但是作者认为这些名称并不合适。因为这些保留的IP地址也是由RFC正式定义的IP地址,何称“虚拟”呢?所以我们将用“内部IP”表示从IANA所保留的IP地址,而在Internet上使用的IP地址则是以“外部IP”来表示。
=================================
◆ 子网掩码(Subnet Mask)
子掩码和一般的IP地址相同,都是由32个二进制的数字所组成,它的惟一功能就是辨别IP地址中网络识别码和主机识别码部分为什么,这在网络传输上相当重要,因为具有相同网络识别码的主机要以直接地通信,而不同网络识别码的主机就需要通过网关来转送信息。
在利用子网掩码判断IP地址的网络识别码和主机识别码的部分时,要按以下的步骤来运算我们在此以一个Class B的IP地址——150.23.56.25和Clalss B默认的子网掩码---255.255.0.0为例。
将IP地址转换为二进制表示法
在所有的子网掩码运算和子网分割运算中,所有的IP地址及子网掩码都必须先转换为二进制表示法。在本例中150.23.56.25的二进制表示法为
10010110000101110011100000011001
===============================
注:
在转换为二进制表示法时须注意一点,如果不足8位时须以0补足,例如56的二进制表示法应写成“00111000”,而不是“111000”。
===============================
将子网掩码转换为二进制表示法
在本例中子网掩码255.255.0.0的二进制表示法为1111111111111110000000000000000,而各种类型网络默认的子网掩码如表1-3所示。

将以二进制表示法的IP地址和子网掩码利用“AND”运算
所谓“AND”运算是指真值表中“与”的运算,只要二者其中有一个是0,则运算后值就为0,只有在二者都为1的情形下才会为1。有关“AND”运算的结果如下所示:
1 AND 1 = 1 1 AND 0 = 0
0 AND 1 = 0 0 AND 0 = 0
在了解“AND”运算后,就可以将以二进制表示法的IP地址和子网掩码利用“AND”来运算,运算的过程及结果如图1-4所示。

运算结果中非0的部分为网络识别码
在IP地址和子网掩码利用“AND”运算后,它的结果中不是0的部分就是网络识别码,在本例中为150.23,但是通常习惯用0来将它写成类似IP地址的形态,如150.23.0.0。在发送信息前,IP即是以这种方法来判断目的地的主机是否存在本地网络,如果目的地主机位于远程网络,IP就会将此信息发送到路由或默认的网关,如图1-5所示。

由以上的结果可知,如果要避免寻址及路由问题,应该确保在同一网络区域上的所有TCP/IP主机都使用相同的子网掩码。
◆ NAT原理及主要功能
前面内容介绍了IP的基本概念,接下来将开始介绍有关NAT的内容。所谓“网络地址转换”(Network Address Translation, NAT),它是定义于RFC 1631中的Internet标准,主要是用来简化及保存IP地址,它可让原本无法上网,但是可以使用内部IP地址的主机可以成功地连接Internet。这可大大减少IP地址的需求,因为基本上整个内部网络都可凭借NAT上的一具外部IP来连接Internet,如图1-6所示。

当NAT作用于路由器时,通常可连接两组以上的网络上在转送数据包到其他网络前,将内部IP地址转换为Internet上合法的外部IP地址。此外,NAT还可以对外只用一个地址代表整个网络,这样可以提供更高的安全性,将整个内部网络隐藏在该地址后,将这种安全性及地址保存的双重功能的程序通常安装在远程访问的环境。目前许多的路由器支持NAT这项功能,其他如Linux中的IP伪装(IP Masquerade),FreeBSD中的NATD或Windows上的Sygate软件都具有相同的功能。
使用NAT的优点如下:
● 减少IP地址使用量。在使用NAT以后,Internet上的主机会误以为它正与NAT服务器进行通信,因为它们并不知在NAT主机后包含一个局域网。于是,回传的数据包会直接发送到NAT服务器,然后NAT服务器再将这个数据包头文件目的地的IP地址更为局域网里真正发出信息的计算机。
● 可在NAT服务器上的外部IP上建立多个“IP Alias”,当收到传给那些IP Alias的请求时,NAT可以把这些请示求转送给内部网络中提供服务的服务器。
● 负载平衡(Load Balancing),也就是说,将同一个IP Alias请求分别导向到其他运行相同服务的服务器,可减少单一服务器的工作量。
虽然使用NAT具有以上的优点,但是在某些情况下,必须注意NAT潜藏的缺点,以下举出几个例子以供读者参考:
● 理论上,NAT服务器只使用一个IP地址,就可涵盖无数个内部IP地址,但是许多网络通信协议或应用程序都需要真正点对点的连接。
● 有些数据包是从出发地到目的地过程中的过程中都不能修改,像IP安全体系结构就不可以使用NAT进行映射,因为数据包的头文件中含有数字签名,如果头文件被更改(即使是任何一个字),这个数字签名便从此失去效力。
● 虽然NAT对于无法取得足够IP地址的企业组织来说,它是一个极佳的解决方案,但当该组织必须合并多个局域网时,必须仔细重新规划IP分配,否则很容易产生IP重复的情况(因为每个局域网都使用内部IP地址)。
● NAT通常被人视为增加计算机安全性的保护措施,但是如果入侵者可以控制NAT服务器,那么整个局域网就会暴露在Internet当中,因此NAT并不能拿来代替防火墙使用。
NAT依其作用的方向性可区分两种类型:
● Source NAT (SNAT):所谓的Source NAT 就是改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。
● Destination NAT (DNAT):Destination NAT刚好与SNAT相反,它是改变第一个数据懈的目的地地址,如平衡负载就是属于DNAT。

◆ NAT服务器的安装与使用
经过以上两个小节的说明,想必各位读者现在对于IP及NAT服务器的原理一定有所了解,接下来将实际进行NAT服务器的安装。本书中的环境假设NAT服务器目前只具备一张网卡(负责连接Internet),而且这张网卡使用以下的外部IP地址配置:
● 网卡名称:eth0。
● IP地址:24.68.32.118。
● 子网掩码:255.255.252.0。
而为了连接内部网络(本书假设为192.168.1.x)必须再新建一张网卡,它使用内部IP地址配置:
● 网卡名称:eth1。
● IP地址:192.168.1.1.
● 子网掩码:255.255.252.0。
图1-8所示是本书范例使用的网络体系结构。

iptables安装
在安装NAT服务器前,必须确定系统上已安装iptables程序,如果不知是否已经安装iptables,可以使用以下的方法来判断:
[root @ ns l root]# rpm-qa iptables
Iptables-1.2.7a-2
如果尚未安装iptables,可以在第一张安装光盘中的/Red Hat/RPMS目录下,找到名为“iptables-1.2.7a-2.i386.rpm”的安装程序,然后按照以下的方法进行安装:
[root @ ns l root]# rpm –ivh iptables-1.2.7a-2.i386.rpm
为了使开机时能自动运行iptablas,可以在终端机窗口中输入“ntsysv”指令,然后在出现的画面中,利用上下方向键将光标移到菜单中的“iptables”项目(同时确定ipchains选项没有被选中),然后按空格键以选择,最后利用Tab键将光标移到“确定”按钮并按Enter键即完成设置,如图1-9所示。

网卡安装
在安装iptables程序后,接下来我们将安装第二张网卡连接内部网络,以下是逐步的安装说明。
为了避免安装时的失败,建议先准备一张Linux支持的网卡,如果不确定这张网卡是否可用,可到以下网址查阅(本书以Red Hat为例):
http:// hardware.redhat.com/
插入网卡并启动电源后,Linux会自动检测这张网卡,然后Linux会要求输入IP地址、子网掩码、网关和DNS服务器IP地址等配置信息。
启动第二张卡。
[root @ ns l root]# ifup eth l
使用IP Forwarding功能
在安装第二张网卡后,接下来须使用IP Forwarding的功能,代替内部网络的主机发送数据包,以下是使用的步骤及说明:
① 修改/etc/sysctl.conf文件内容,将“net .ipv4.ip_forward=”这行设置为“1”。
[root @ ns l root]# vi /etc/sysctl.conf
Net.ipv4.ip_forward=1
② 使用IP Forwarding功能。在此介绍两种使用IP Forwarding功能方法,可以直接运行以下的指令:
[root @ ns l root]# echo 1 > /proc/sys/net/ipv4/ip_forward
或在/etc/sysconfig/network文件中,加入以下的记录:
[root @ ns l root]# vi /etc/sysconfig/network
③ 最后重新加载/etc/rc.d/init.d/xinetd,以便设置生效:
[root @ ns l root]# /etc/rc.d/init.d/xinetd reload
重新加载配置设置: 确定 ]
④ 在此可以先忽略安全性的考虑,等安装完成并测试成功后,再进行安全管理。以下的指令表示允许所有内部网络的主机连接到Internet,这也是一般所称的“IP伪装”(IP Masquerading):
[root @ ns l root] # iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j MASQUERADE
但有时使用以上的指令后,FTP会无法正常运作,此时可以尝试以下的指令:
[root @ ns l root# modprobe ip _conntrack_ftp
[root @ ns l root ] # modprobe ip_nat_ftp
客户端设置
在NAT服务器设置后,最后的步骤就是客户端的设置,本书在此以Windows 2000客户端为例。以下是设置的步骤与说明:
① 选择桌面上的“网上邻居”图标,然后右击并选择菜单中的“属性”选项,系统即会出现“网络和拨号连接”窗口,如图1-10所示。

② 在出现的“网络和拨号连接”窗口中选择“本地连接”图标,然后右击并选择要菜单中的“属性”选项,系统会随即出现“本地连接属性”窗口,如图9-11所示。

③ 在出现的“本地连接属性”窗口中,选择“Internet协议(TCP/IP)”选项,并单击右下角的“属性”按钮,系统会随即出现“Internet协议(TCP/IP)属性”窗口,如图1-12所示。

④ 在出现“Internet协议(TCP/IP)属性”窗口中,首先选择“使用下面的IP地址”选项,然后输入以下的信息:
● “IP地址”字段:输入192.168.1.X,本书在此以192.168.1.5为例。
● “子网掩码”字段:输入255.255.255.0,必须与NAT服务器内部IP使用的子网掩码相同。
● “默认网关”字段:这是最重要的设置,必须输入NAT服务器的内部IP(此处是192.168.1.1),千万不可填入NAT服务器的外部IP,否则数据包永远也无法传到NAT服务器(因为“网络ID”不同即无法通信)。
● “首选DNS服务器”字段:如果网络中有DNS服务器,就可以在此输入DNS服务器的IP地址。
⑤ 完成客户端的设置。
◆ iptables在防火墙上的运用
介绍安装NAT服务器时简要地说明了iptables程序,其实它还有许多功能尚未说明,因此本节将再进一步说明iptables程序在防火墙上的运用。
iptables体系结构与处理流程
“iptables”程序的功能都是属于数据包(Packet)层的工作,而这些工作都是利用不同的“规则表”(Rule Table)来定义的。在iptables中包含3个默认的Rule Table:Filter Table、NAT Table与Mangle Table,而每一个Rule Table又是由数个“链”(Chain)所组成。举例来说,在Filter Table中除了定制的链之外,还包含3个内置的链:INPUT Chain、 OUTPUT Chain和FORWARD Chain,如图1-13所法。

Filter Table是iptables中的默认Rule Table,也就是说,在运行时如果没有指定其他参数,则iptables会套用Filter Table中的规则,令外两种Rule Table都需要配合指令参数使用。而在防火墙的运用上,iptables主要是使用默认的Filter Table功能,所以有人就称为“包过滤器”(Packet Filter)。Filter Table可以先检索到数据包,然后通过预选取一义的规则(Rule)来判断是否发送此数据包。由于它运行于网络层,所以不论是否发送数据包,都不会影响到数据包中的数据内容。
=================================
注:
所谓“包过滤”是指利用一具软件查看经过数据包的表头(Header),而由此决定整个数据包的处理,可能的处理方式有:丢弃这个数据包(DROP)、接受这个数据包(ACCEPT),或其他更复杂的动作。
=================================
数据包过滤原理
图1-14是在Filter Table中内置的3个链与防火墙发送数据包之间的流程图。

图1-14表示,当一个数据包抵达图9-13中的任何一个链,则这个链就会开始检查这个数据包,以决定后续的处理,如丢弃或接受。
其实每个链都是一个检查列表,它会利用预先设置的规则来对数据包进行判断,如果判断的结果不符合(Mach),就会交给链中的下一个规则继续处理。如果到最后已没有任何规则可供判断,那内核就会利用链的规则(Policy)来作出决定,但是为了安全起见,规则通常会要求内核丢弃此数据包。
以下就是防火墙发送数据包的流程说明:
① 当防火墙拦截到数据包后,内核首先会检查此数据包的目的地(Destination),而这个检查的过程便称为“路由(Routing)。
② 如果目的地址为本机,则此数据包就会流向INPUT链,而由本机程序来负责接管。然后由OUTPUT链处理,如果此数据包可被此处的规则接受,则这个数据包可送到它所指向的接口。
③ 此时如果内核没有启动转送功能(Forwarding),或不知道如何转送此数据包,则这个数据包就会被丢弃。
④ 如果转送功能已启动,那么此数据包就会被指向另一个网络接口,而流向FORWARD链,如果此数据包可被此处的规则接受,这个数据包就可送到它所指向的接口。
iptables程序使用
在了解iptables程序的基本原理后,接下来的内容将介绍iptables程序的使用方法以及各个选项与参数。Iptable的语法结构如表1-4所示。

Table类型
“Table类型”是指目前内核的Rule Table类型,而在指定Table 类型时必须配合“- -table”或“-t”参数的使用,表1-5列出了可供设置的Table类型及说明。

指令(Command)
“指令”表示要求iptables程序运行的工作,而在每一个iptables指令中,只允许使用一个指令。除了“help”指令之外,所有的指令都必须用大写(Upper-Case)字母来表示,表1-6列出了可供使用的指令名称及说明。

参数
在指定iptables参数选项时,如果在选项前加入惊叹号“!”则表示否定的意思,例如“-s! localhost”是表示除了localhost的来源地址都可以。可以命名用如表1-7所示的参数。

==============================
注:
在来源(-s)和目的地(-d)的表示法有以下3种:
使用完整的主机名称,如www.jschouse.com或localhost。
使用IP地址,如24.68.53.226。
使用网络地址,如192.168.1.0/24或192.168.1.0/255.255.255.0,两者都是包含192.168.1.1~192.168.1.255的IP地址。斜线后的数字表示子网掩码的位数,例如/8表示255.0.0.0。
===============================
选项
在iptables指令最后一部分为“选项”,但这部分的可设置项目会随着前面的“参数”而变,因此本书在此分别介绍不同情形下的选项说明:
通信协议选项
在“参数”部分如果使用“- -protocol”或“-p”,可以指定使用的通信协议种类,其中包括TCP、UDP、ICMP或全部(all)。此处的写法没有区分大小写,而且能以数学代替,如果要知道每种通信协议代表的数字,可以查阅/ etc/protocols文件中的内容,例如tcp为6、udp为17而icmp为1。表1-8列出了在选择不同通信协议时可用的选项名称及说明。

● 目标选项
在“参数”部分如果使用“-j”或“--jump”,就可设置此规则的“目标”(Target),这可说是最重要的设置项目,如果少了这个选项,此规则就形同虚设。在此选项后必须使用大写来指定规则的目标,其中可用的目标选项及说明如表1-9所示。

◆ 保存iptables设置
因为使用iptables程序所建立的规则只会保存在内存中,因此如果要重新启动计算机,那么这些设置都将消失。如果希望某些规则可以在每次开机后都生效,则必须将此规则保存在/etc/sysconfig/iptables文件中。
要将规则保存在/etc/sysconfig/iptables文件中并不需要手动输入,可利用以下的指令进行:
[root @ ns l root] # /etc/rc.d/init.d /iptables save
保存目前的设置到/etc/sysconfig/iptables:确定 ]

[root @ ns l root] # /sbin/service iptables save
保存目前的设置到/etc/sysconfig/iptables:确定 ]
在运行以上的指令后,iptables初始指令文件会运行/sbin/iptables-save程序,并且将结果写入/etc/sysconfig/iptables文件中。以下是/etc/sysconfig/iptables文件的范例内容:

因为/etc/sysconfig/iptables 文件只允许管理员读取,所以不必担心有关数据包筛选规则的内容会泄露到其他用户。
[root @ ns l root] # ls –l /etc/sysconfig/iptables
-rw------- l root root 490 4 月 9 13:24 /etc/sysconfig/iptables
在将iptables规则存入/etc/sysconfig/iptables文件后,下次主机重新启动时,iptables初始指令文件会运行/sbin/iptables-restore程序来使用保存规则。
◆ 范例练习
以下将通过各种不同类型的范例来说明iptables的实际设置,读者可以先由这些练习开始尝试,待熟练后再加以修改其中的内容,以符合实际环境的需求。
新建链
以下的范例将新建一个简单链,可以定制链的名称,不过最多不可超过31个字符,本书在此chain-1为例。在新建后,才可以开始将规则加入其中,在此应该使用“-N”或“- -new-chain”选项:
[root @ ns l root]# iptables –Nchain-n

[root @ ns l root] # iptables –new-chain chain-1
如果使用的链名已经存在,系统会出现以下的错误信息:
iptables:Chain already exists
删除链
以下的范例将删除一个链,这里应该用“-X”或“--delete-chain”选项,同时指定要删除的链名:
[root @ ns l root] # iptables –X chain-1

[root @ ns l root ] # iptables --delete-chain chain-]
但是在删除链时需注意以下几个重点:
● 在此链中必须没有存在任何规则。
● 此链不可为任何规则的目标。
● 不可删除任何内置链。
● 如果没有指定链名,可能会误删所有用户定义的链。
清空链的内容
以下的范例清空一个链的内容,在此应该使用“-F”或“- -flush”选项,同时指定要清空的链名,否则会清空所有链的内容:
[root @ ns l root] # iptables –F chain –l

[root @ ns l root ] # iptables –flush chain-l
列出链的内容
以下的范例将列出链的内容,在此应该使用“-L”或“- -list”选项,同时指定要列出内容的链名,否则会列出所有链的内容:
[root @ ns l root ]# iptables –L chain –l

[root @ ns l root ] # iptables --list chain-l
因为目前范例为新建的链,因此列出的内容中只包含字段名称,如果希望得到较详细的内容,可以同时使用“-V”选项:
Chain chain -1 (0 references)
Target prot opt source destination
关闭所有服务
为了达到最高的安全性,可以禁止所有进出INPUT Chain、FORWARD Chain和OUTPUT Chain的数据包,但因为此举具有最高的优选权,即如果选设置禁止服务,此后的所有允许的规则都将失效,所以建议将此步骤列为最后的步骤。以下是关闭所有服务的方法:
[root @ ns l root]# -P INPUT DENY
[root @ ns l root]# -P FORWARD KENY
[root @ ns l root]# -P OUPPUT DENY
提醒读者一点,在设置任何的规则后,千万不可重新启动iptables服务,否则所有的设置都会被清空。
[root @ ns l root ]# /etc/rc.d /init.d/iptables restart
释放所有目前的设置与用户定义的chains:确定 ]清除所有的设置和用户定义的chains:确定]
套用iptables防火墙设置:确定 ]
开放特定服务
如果主机上提供某些服务,可以利用启动该服务的连接端口,允许客户端使用该服务,以下的范例表示开放FTP服务,因为FTP使用连接端口20和21,所以必须使用两行指令:
[root @ ns l root] # iptables –A INPUT –i ethl –p tcp --dport20 –j ACCEPT
[root @ ns l root] # iptables –A INPUT –i ethl –p tcp --dport21 –j ACCEPT
===========================
注:
也可以直接使用服务名称来替代连接商品号码,请参考/etc/services文件内容。
===========================
关闭特定服务
关闭原本提供的服务,其设置方法和开放服务时很相似,只是将“-j ACCEPT”修改为“-j DROP”,以下的范例表示关闭原来开放的FTP服务:
[root @ ns l root] # iptables –A INPUT –i ethl –p tcp –d
port20 –j DROP
[root @ ns l root] # iptables –A INPUT –i ethl –p tcp --dport21 –j DROP
数据包过滤
如果希望禁止网络上某台主机或某个网络节点发送数据包,可以使用“数据包过滤”功能。以下的范例会禁止所有来自192.168.1.0/24 网络区段的主机,连接IP地址为24.76.251.26的Web服务器:
[root @ ns l root ]# iptables –A FORWARD –p TCP –s 192.168.1.0/24-d 24.76.251.26—dport www –j DROP
◆ 防火墙简单设置
除了以上利用iptables程序的方式来设置防火墙外,在Red Hat Linux 中也包含了名为“lokkit”的防火墙设置程序,它最大的好处是允许用户利用预先设置的选项来进行防火墙设置,虽然它的功能不如iptables程序强大,但是它极易上物的特性,确实获得了许多用户的青睐。所以在这个小节中,将介绍“loddik”程序的使用与设置时的选项说明。
要启动“lokkit”程序,可以在X Window或文字模式下输入“lokkit”,系统就会启动“Firewall Configuration”画面,如图1-15所示。
在“Firewall Configuration”画面的“Security Level”选项中,共包含3种内置的安全性设置,即High、Medium和No firewall。以下是这些内置安全性设置的说明:
Hige
这是安全性最高的选项,如果选择此选项,在默认的情形下,防火墙只会开放以下两种服务的功能:
● DNS回应。
● DHCP请求。
如果主机目前已连接到Internet,但是并不想提供任何的服务,这是最好的选项。

Medium
这是Red Hat Linux默认的防火墙设置,如果选择此选项,在默认情况下系统会禁止以下服力:
所有连接端口号码小于1023的服务,如FTP、SSH、telnet和HTTP。
● NFS服务(连接端口2049)。
● X字型服务器(连接端口7100)
● X Window连接服务(连接端口6000~6009)。
===============================
注:
在高安全性和中等安全性的防火设置下,NIS与LDAP等网络验证方式将无法使用。
===============================
No firewall
这个选项表示没有启动防火墙的功能,也就是说,系统可以提供客户端所有服务,而且不作任何安全性的检查,它比较适合使用在内部的网络环境(不连接Internet)或系统测试时。
如果这些内置的安全性设置无法实际需求,那也可以利用定制的方式来设置。首先需将光标移到“Custom”按钮并按Enter键,然后系统会出现“Firewall Configuration-Custom”画面,如图1-16所示。

Trusted Devices
如果有多个网络设备在定制服务类型时,要在此字段选择指定的网络接口设备,如eth0(第一张网卡)或ppp0(第一部调制解调器),表示允许远程用户访问所有通过此设备的服务,而不受防火墙的限制。所以如果希望限制某一接口的数据包通过,不可选择此接口名称,在此作者不建议使用任何连接到公众网络(如Internet)的接口,以降低网络的安全性。
Allow incoming
选择这些选项可以指不定期允许通过防火墙的服务。以下是可供选择的网络服务类型:
● DHCP:使用此选项,则会允许使用此接口的DHCP服务器服务,以响应来自客户端的IP地址租用请求,通常建议使用DHCP。
● SSH:Secure Shell (SSH)是用来登录远程主机与运行指令的工具。
Telnet :Telnet 也是一种用来登录远程主机的工具,但是由于Telnet连接并未加密,所以在此不建议选择此选项,以加强系统的安全性。
● WWW(HTTP):选择此选项可以允许WWW服务器的访问,但是如果要使用安全性的HTTP连接(HTTPS),则需要在下方“其他端口”的字段中设置。
● Mail(SMTP):如果使用此选项可以允许电子邮件通过防火墙,使远程主机可以直接连接到服务器来发送邮件,但是如果客户端利用POP3或IMAP通信协议来下载邮件,就不需使用这个选项。因为不当的SMTP设置会造成远程主机利用此服务器来发送垃圾邮件,所以在决定是否开放此选项前,需慎重考虑。
● FTP:这个选项可以允许客户端与FTP服务器间的互相发送文件。
● Other ports:如果要允许访问的服务没有列在以上的列表中,可以再以字段输入这些服力,而在输入时必须使用“服务名称:通信协议名称”的格式。例如,如果要允许SMTP通信协议通过防火墙,可设置如下:
Imap : tcp
也可以直接指定连接端口号码,例子如允许边接端口1234上的UDP数据包通过防火墙,则可设置如下:
1234 :udp
◆ iptables配置文件参考范例
本章到此已说明了以iptables程序来设置防火墙的基本内容,如果要将防火墙的功用发挥到极致,除了具有正确的概念外,平日的实践更不可或缺的。而在本节,将提供一个iptables配置文件的范例以供读者参考。
因为iptables是以指令为主的防火墙设置工具,所以在设置上终究有其不便之处。鉴于此,多数有经验的管理员都习惯将iptables的设置以指令文件的方式保存,然后在主机启动时自动运行所有的iptables指令,以避免经常性的输入和错误。
以下iptables配置文件的建立及使用方式:
① 新建iptables配置文件,本书以/etc/rc.d/firewall-1为例。
[root @ ns l root]# vi/etc/rc.d/firewall-1
② 修改iptables配置文件的访问权限
[root @ ns l root ]# chmod 774/etc/rc.d/firewall-1

[root @ ns l root ]# chmod ug +rwx/etc/rc.d/firewall-l
③ 在etc/rc.d/rc.local文件的最后一行,回入iptables配置文件的完整路径。
[root @ ns l root ] # vi/etc/rc.d/rc.local
在运行以上的3个步骤后,每次计算机重新启支系统都会自动运行这里所设置的iptables配置文件(/etc/rc.d/firewall-l)。而在本章的最后将提供一个iptables配置文件的范例内容,读者可自己修改来符合需求。
Iptables配置文件范例内容