原文地址:http://blog.163.com/liang8421@126/blog/static/89481957200810110498814/
Linux中的防火墙是由netfilter/iptables网络构架实现的包过滤防火墙,可以实现大部分硬件防火墙的功能,所以可以在企业的应用方案中可以作为硬件防火墙的替代品。
如果Linux的内核是在2.4以上的版本,都可以使用iptables来实现防火墙的功能。由于Linux的防火墙是在Linux的内核中实现的,而在内核中使用了netfilter构架实现防火墙的功能,iptables其实就是管理netfilter的工具而已,所以我们一般使用iptables来实现对防火墙的管理。
---------------------------
iptables规则链
如图01所示:
iptables规则链的作用就是为netfilter的处理提供相关的规则,这些规则告诉netfilter,对于接收到的数据,他们来自那里,目标是那里,什么协议的数据包,该作一些什么样的处理。如果对于一个接受到的数据包,如果符合规则链中的要求,则netfilter就会根据这些规则对数据包进行处理。
iptables一共有我个规则链,我们来看看这些规则链的作用:
1、本地输入规则链:传送到本机的数据包
2、转发规则链:经过本机路由传送给别人的数据包
3、本地输出规则链:从本机传送出去的数据包
4、输入规则链:所有收到的数据包,包括传给本机的和经过本机路由传动给别人的数据包。收到数据包后,还没有判断目的地的数据包。
5、输出规则链:所有从本机出去的数据包,包括从本机传送出去的数据包和经过本机路由传动给别人的数据包。
为了使用iptables对这些数据包的处理,一般使用:
1、INPUT:表示本地输入规则链
2、FORWARD:表示转发规则链
3、OUTPUT:表示本地输出规则链
4、PREROUTING:表示输入规则链
5、POSTROUTING:表示输出规则链
------------------------------
规则表
iptable的规则链是组织在3个不同的规则表中的,这三个规则表和这些表的作用如下:
1、filter:过滤数据包
2、nat:网络地址转换
3、mangle:改变数据包的内容
iptables根据不同的数据包过滤处理功能来使用不同的规则表,下面分别看看这三个表能对数据包做哪些过滤的处理:
filter:过滤数据包的功能上可以针对:
INPUT:传送到本机的封包
OUTPUT::从本机传送出去的封包
FORWARD:经过本机路由传动给别人的封包
三个规则链设定过滤条件
nat:网络地址转换的功能上,可以针对:
PREROUTING:所有收到的数据包,包括传给本机的和经过本机路由传动给别人的数据包。
OUTPUT:从本机传送出去的数据包
POSTROUTING:所有从本机出去,包括从本机传送出去的数据包和经过本机路由传送给别人的数据包
三个规则链设定过滤条件
mangle:改变数据包的内容的功能上,可以针对:
PREROUTING:所有收到的封包,包括传给本机的和经过本机路由传动给别人的封包
OUTPUT:从本机传送出去的封包
三个规则链设定过滤条件,来设定要改变的封包的内容
-----------------------------
明白了以上的规则链后,再来看看netfilter过滤数据包的流程
当一个数据包从网卡进入之后,首先会经过PREROUTING,数据包经过PREROUTING的处理后,系统才会判断这个数据包的目的地。是送到本机的数据包,还是只是经过本机路由的数据包。
1、如果要路由到其他主机封包的话,就或经过FORWARD,并判断在FORWARD有没有过滤条件,数据包经过FORWARD的处理后,在送到POSTROUTING,并判断在POSTROUTING中有没有过滤条件,经POSTROUTING处理后,数据包从另一个网卡传送出去。
如图02所示:
2、如果数据包送到本机,则会经过INPUT,并判断在INPUT中有没有过滤条件,依据数据包中的内容,传送到相关的服务器使用的端口,当这个数据包处理完成之后,系统会回应一个报数据包给来源的主机,这个时候会经过OUTPUT,并判断OUTPUT中有没有相应的过滤条件,经过OUTPUT的处理后,在送到POSTROUTING,并判断在POSTROUTING中有没有过滤条件,经过POSTROUTING处理后,数据包从另一个网卡传送出去。
如图03所示:
-----------------------------
规则
了解以上的netfilter的处理数据的流程以后,我们要作的就是要添加处理数据包的规则了,规则是防火墙中最基本的设置,用于对防火墙的策略的设置,经过某个数据链的时候,都要按照这个数据链中的先后顺序经过规则的过滤。
如图04所示,一个数据包的过滤规则:
-------------------------------
iptable的基本配置
在Linux的网络防火墙的管理中,防火墙的功能由内核实现,而管理需要使用iptables,所以要使用iptables软件包,这个软件包默认是安装了的。
在RHEL5.1中,系统中默认是以iptables的服务程序运行。服务的启动脚本是/etc/rc.d/init.d/iptables文件,如图05所示:
表示现在的iptables服务正在运行。
有的时候需要临时的关闭防火墙,可以通过iptables服务的启动和停止来设置:
如图07所示,关闭防火墙:
如图08所示,开启防火墙:
还可以通过图形界面的方式来启动和关闭防火墙:
如图9所示:执行指令:system-config-securitylevel
或者执行指令:system-config-securitylevel-tui,如图10所示:
都可以用来启动和关闭防火墙
以上都属于iptables的一些基本的配置。
现在来看看防火墙的一些基本运行状态,这个时候,我们就使用到iptables的指令了,使用iptables -L指令显示默认的filter规则表的内容,如图11所示:
---------------------------------
防火墙的配置
以上的基本操作熟悉了之后,现在来开始防火墙的配置。如果服务器在本地,我们可以直接使用指令system-config-securitylevel,开启图形化的配置界面,如图12所示:
如果我们需要开启某些服务让客户端访问,那么我们可以在信任的服务中选择所要开启的服务。如果提供的服务不再这个列表中,那么在其他端口中可以添加相应的端口,就可以了。
这里我们主要配置的是在文本界面下使用iptables指令来对防火墙进行配置。这种方法一般都是在远程配置的时候,作用很大,不过有一些小小的毛病,就是有可能把自己挡在外面,自己也无法进入,如果是这样,我们一般的原则是现在本地作一些基本的配置,
1、清空防火墙的所有信息,使用指令,iptable -F,如图13所示:
使用iptables -L指令显示默认的filter规则表的内容,发现表中的信息都没有了。
由于主机的安全性主要几种在filter表中的INPUT和OUTPUT规则链,所以以下的大部分都是针对这表来作配置。
iptables的语法:
iptables [-t tables] -[L/F/X] [chain] [options]
在默认的情况下如果不是用-t参数指定表,那么默认是针对filter进行操作,可以在-t参数后面跟上表的明来指定对某个表进行操作。可以跟上filter、nat、mangle三个表。
-L:显示规则表的内容
-F:清空防火墙的所有信息
-X:删除所有自定义的规则链
china:就是指的针对规则表中的那个规则链进行操作。
options:可以是对数据报操作的过程,也可以没有。
--------------------------------------
添加第一条规则
如图14所示:
iptales -A INPUT -i lo -j ACCEPT
先分析以下这个语句:
-A INPUT:表示在规则链中增加一条过则,在添加规则的时候需要指定在那条规则链中增加规则,所以在这里的IUPUT,就表示在IUPUT这条规则链中增加规则。如果是-D,表示删除规则链中的规则。
-i lo:表示数据包的流入网络接口,lo表示本地的网络回环接口。如果是物理网卡,则为eth0。
-j ACCEPT:表示允许数据包通过,如果是-j DROP则将数据报丢弃。
iptables -L -v:表示显示filter表中的详细信息
如图15所示:
表示eth0网络接口接受所有来自192.168.0.0/24这个网段中所有的数据包
如果我们需要RHEL5.1提供的网络服务可以为一些客户端服务,那么我们就必须开放相应的端口,那么就需要在iptables中要指定协议并指定端口。如图16所示:
-p tcp:表示数据包所使用的协议
--dport 80:表示开放80端口,也就是web服务,可以更具需要来更改这个端口。
完整的设置是这样的:要拒绝来至192.168.0.0/24这个网段的数据包,就可以这样处理:
iptables -t filter -A INPUT -s 192.168.0.0/24 -d 127.0.0.1 -j DROP
-t:table
filter:表示将这个策略设置在fulter表中
-s:source:数据包的来源
-d:数据包的目标
-------------------------------
默认策略
如图04的数据包的过滤规则中,最后一般有一个默认策略,当所有的策略都不符合数据包的内容的时候,就采用默认策略。
可以使用-P,来指定规则链的默认策略,如图17所示:
这样就设置了当不符合所有的策略的时候,就拒绝这个数据包。
最后就是保存这些设置的策略了,如果不保存,那么这些策略在下次重新启动的时候,就没有了。
如图18所示,这样就将所有的策略保存在配置文件中。
技巧:由于设置策略的时候,一条一条的设置策略非常的麻烦,通常是将所有的策略放置在一个脚本文件中,这样,每次设置防火墙的时候,我们先修改这个脚本文件,然后在执行这个脚本文件就可以了,例如一个脚本文件的样本如下:
#!/bin/bash
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables-save
将这个脚本更改为可执行文件,然后执行就可以了。