防火墙简介

    防火墙可以分为硬件防火墙和软件防火墙,硬件防火墙是由厂商设计好的,这种类型的防火墙的操作系统的主要功能就是实现数据包的过滤,由于它将这种功能软件集成在ASIC芯片里,因此,这种防火墙的过滤效果要比软件防火墙的好。不管是哪种类型的防火墙,他们的"防火"原理都是一样的。根据数据包的包头信息与内核中的定义好的规则进行比对,如果包头信息和规则匹配,则执行相应的动作。否则,继续比对下一条规则;如果包头信息与任何一条规则都不匹配,则执行默认策略(或者叫做默认规则也行)。


iptables和netfilter的联系?

很多人一提到防火墙立马就想到了是iptables,其实iptables并不是防火墙,他只是一个软件或者说是一个工具,这个软件可以编写某些规则,将写好的规则保存到netfilter的规则数据库中。因此,真正起到"防火"的功能是netfilter,并不是iptables。netfilter是内核中的一个框架,这个框架里面包含了4个表和5个链,这些链又包含了很多的规则。而数据包要比对的规则就是这个链中所定义的规则。

因此,可以用一句话来概括iptables和netfilter的关系:

iptables将写好的规则保存在netfilter的某些表的某些链中,进而才起到防火墙的功能

 


在netfilter中,真正起到防火墙功能的就是里面的4个表和5个链(chain),每一个链作用在不通的地方,这些链的作用分别如下:

PREROUTING:可见理解成路由前,因此这个链作用在路由决策前,一般用在目标地址转换上。

INPUT:这个链用于过滤或允许外地主机访问到本地linux主机资源

OUTPUT:这个链用于过滤或允许本地linux主机访问外地主机资源

FORWORD:这个链主要用于转发数据报文,因此本地路由功能必须开启。在linux系统内,路由功能是相对于主机而言的,并不是根据网卡来决定的。因此某个主机上面的任意两个网卡之间的通信都不需要开启路由功能。

POSTROUTING:可以理解成路由后,因此这个链作用在路由决策后,一般用在源地址转换上。

 


在netfilter中有4个表,每一个表又包含着相应的链(chain),这些表和这些链的对于关系如下:

这里的4个表分别是:

filter:这个表主要用来过滤数据报文的和转发数据报文的。因此,这个表包含着3个链(chain),分别是INPUT、OUTPUT、FORWORD

nat:这个表主要用来做地址转换的。因此,这个表主要包含着3个链,分别是PREROUTING、POSTROUTING、OUTPUT

mangle:这个表主要是用来对特定的数据包进行修改的。这个表包含着5个链,分别是PREROUTING、INPUT、OUTPUT、POSTROUTING。虽然这个表包含的链比较多,但是基本上我们用不到。

raw:这个表的作用是为了不让iptables做数据包的链接跟踪,提高性能。这个表包含着2个链,分别是PREROUTING、OUTPUT。这个表也用的不多。

 


 在这些表当中,raw表的优先级最高,其次是mangle表,接着是nat表,最后才是filter表

因此,他们的优先级顺序应该是这样的:

raw---->mangle--->nat--->filter

因此,当一个数据包进入到防火墙时,它会依次根据这些表中的相关链中的规则对数据包进行匹配,允许则通过,拒绝则丢弃。反之,出防火墙时,也是根据这个顺序进行规则匹配的,允许则通过,拒绝则丢弃。


 iptables的语法格式及其语法如下:

iptables   [-t  TABLE]    COMMAND   CHAIN  [CHAIN_NUMBER]   匹配标准    -j   执行动作


其中-t  TABLE指定要编辑的表名,如果此处不写,默认表为filter表


COMMAND表示要执行的命令,这些命令包括这几大类:

                管理规则类命令:

                        -A:表示附加一条规则,添加在链的尾部

                        -I:表示插入一天规则,默认插在链的首部

                        -D:表示要删除指定链中的某条规则

                        -R:修改某条链的某个规则


                管理链类命令

                        -F [CHAIN]:flush,表示清空指定链的所有规则,如果省略CHAIN,则表示清空指定表中的所有规则(除默认规则之外),默认清空的是filter表

                        -P:修改指定链的默认规则(或者叫默认策略)

                        -N:自定义一个新的空链

                        -X:删除一个自定义的空链

                        -E:重命名自定义的链

                        -Z:将指定链中所有规则的计数器置零


 

                  查看规则类命令

                         -L:显示指定表中的所有规则,不加表名则显示所有表中的所有规则,-L还有子选项:

                                    -n:以数字格式显示主机地址和端口号

                                    -v:显示链及其规则的详细信息

                                    -vv:显示链及其规则的更佳的详细信息(不是-w哦,是两个v)

                                    -x:显示规则中的计数器的精确值

                                    --line-numbers:显示规则号码


CHAIN:指定链名

CHAIN_NUMBER:表示指定链的第几条规则


匹配条件有通用匹配条件和扩展匹配条件,其中扩展匹配包含隐式扩展匹配和显式扩展匹配。

隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}即可

显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能

                通用匹配条件有:

                    -s SIP:根据源ip进行匹配

                    -d DIP:根据目标ip进行匹配

                    -p {tcp|udp|icmp}:根据指定协议来进行匹配

                    -i interface:根据数据包入向接口来进行匹配,可用于定义标准的链有:PREROUTING,INPUT,FORWARD

                    -o interface:根据数据包出接口进行匹配,可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD


                 扩展匹配条件:

                        隐式扩展匹配条件:

                               (1)、tcp协议隐式扩展

                                 -p  tcp  --sport  PORT[-PORT]:对tcp的源端口做匹配。

                                 -p  tcp  --dport  PORT[-PORT]:对tcp的目标端口做匹配。多个连续的端口可以使用PORT-PORT的形式给出。

                                 -p  tcp  --tcp-flags  mask  comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;

                                例如:只检查tcp三次握手中的第一次:

                                             -p tcp --tcp-flags  SYN,ACK,FIN,RST  SYN

                                -p  tcp   --syn:只检查tcp三次握手中的第一次,和上面的作用一样

 

                               (2)、icmp隐式扩展

                                -p icmp  --icmp-type {0|8}:根据icmp的报文类型进行匹配。其中0表示响应报文类型,8表示请求报文类型

                                

                                (3)、udp隐式扩展

                                 -p  udp  --sport   PORT[-PORT]:根据udp源端口进行匹配

                                 -p  udp  --dport   PORT[-PORT]:根据目标端口进行匹配


                        显式扩展匹配:必须加上选项-m

                                    state:状态扩展:是结合ip_conntrack这个模块来追踪会话的

                                    -m  state --state  NEW:根据新请求(第一次请求)进行匹配

                                    -m  state  --state ESTABLISHED:根据已建立的连接进行匹配

                                    -m  state  --state RELATED:根据相关联的连接进行匹配,多用于开放ftp服务

                                    -m   state  --state INVALID:根据非法连接进行匹配

使用状态扩展还要装载ip_conntrack_ftp和ip_nat_ftp模块

在iptables中,可以利用ip_conntrack这个模块来追踪客户端和服务器端的连接状态(包括tcp、udp、icmp连接) ,它是内核中的一个模块,实时记录了客户端和服务器端的连接状态,并记录每一个连接处于哪种状态。

在/proc/net/ip_conntrack这个文件中保存了客户端和服务端之间的tcp连接信息

在/proc/sys/net/ipv4/ip_conntrack_max这个文件中保存了客户端和服务器的最大连接数,默认为65535

在/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established文件里定义了tcp连接的超时时间,默认为5天(432000秒).如果在这个时间内还没有数据传输,则会断开该连接。并且也会将这个连接的信息删除。

对于高并发的服务器而言,尽量不要启用ip_conntrack这个模块。避免后续的大量请求被丢弃

对于服务请求不是很多的服务器而言,可以启用ip_conntrack这个模块

注意:使用iptables  -t nat  -L命令时会启动ip_nat这个模块,而这个模块会依赖于ip_conntrack这个模块。因此,执行该命令,也会启用ip_conntrack这个模块

可以使用iptstate命令来查看客户端和服务器端的连接状态信息

iptstate -t:还可以显示所有的连接个数

 


                                   multiport: 离散的多端口匹配扩展

                                   -m  multiport  --source-ports  PORT1,PORT2...:对源端口进行匹配

                                   -m  multiport  --destination-ports  PORT1,PORT2...:对目标端口进行匹配

                                   -m  multiport  --ports  PORT1,PORT2...:对指定端口进行匹配


                                   iprange:连续的ip地址或地址范围扩展

                                   -m   iprange  --src-range   {IP-IP|NETWORK/MASK}:对指定返回内的源地址匹配

                                   -m   iprange  --dst-range  {IP-IP|NETWORK/MASK}:对指定范围内的目的地址进行匹陪

这里的ip范围可以是连续的ip,例如-m iprange 192.168.1.10-192.168.1.100

也可以是某一个网段内,例如-m  iprange 192.168.1.0/24        


                                   connlimit:限制每一个客户端连接数扩展

                                    -m  connlimit  ! --connlimit-above  num   ACCEPT:允许每个客户端的最大连接数

                                    在这里不加!,则后面的动作为DROP或REJECT

!表示取反的意思。在前面的选项当中也可以使用


                                    limit:数据包速率限制扩展

                                    -m limit  --limit RATE:表示达到最大值时,单位时间内允许通过的请求数

                                    ---limit-burst :表示初始时的最大并发数为多少(即请求刚开始时能够匹配的最大数据包)


                                    string:字符串匹配扩展

                                    -m string  --algo  {bm|kmp}  :指定匹配算法

                                   --string  ”STRING”  :对指定的字符串进行匹配


-j   执行动作有:

        ACCEPT:表示接受或放行

        DROP:表示丢弃

        REJECT:表示拒绝

        DNAT:表示做目标地址转换

        SNAT:表示做源地址转换

        REDIRECT:表示端口重定向

        RETURN:如果应用在主链上,则表示执行相应的策略。如果应用于自定义链上,则表示将匹配权返回给主链。

        MASQUERADE:如果上网ip不固定,可以使用该参数。系统会自动将私有源ip转换成可以上网的公网ip。用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。一般由于源地址转换中。

        LOG:表示将数据包相关信息记录下来。不影响报文的比对规则

                    其中子选项--log-prefix  "STRING"表示定义日志前缀。用于方便查看是哪种类型的日志。

        MASK:表示对报文打标记


iptables的规则保存

默认情况下,当系统重启后,之前写的规则如果没有保存的话,这些规则就会丢失。使用service  iptables  save可以将规则保存起来。且这些规则默认保存在/etc/sysconfig/iptables里。

 

自定义规则保存文件

默认iptables将写好的规则保存在/etc/sysconfig/iptables这个文件里,使用iptables-save  > /etc/sysconfig/iptables.20141031可以将规则保存至自己定义的文件里。这里的文件自行定义。

系统重启后,自定义的规则保存文件需要手动加载到内存中才会生效。使用命令iptables-restore  <  /etc/sysconfig/iptables.20141031即可完成此功能。 


利用iptables的recent模块来抵御DOS***         

在这里以ssh服务来说明

步骤如下:

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。                        

 iptables规则如下:

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起达到3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:保存在/proc/net/ipt_recent/SSH这个文件中


NAT:Network    Address   Transfer

NAT叫做网络地址转换,NAT分为源地址转换SNAT和目标地址转换DNAT

SNAT:源地址转换,由于某一个局域网内使用的基本都是私有ip地址,而私有ip地址是不能在公网上路由的。因此,当私有ip向外发送请求时,会先将请求时的源ip转换成能够路由的公网ip,并最终与互联网上的服务进行通信。不过,当互联网的服务对本地请求进行响应时,则会自动进行DNAT。SNAT一般用在nat表的POSTROUTING上。

做SNAT需要执行的地址为-j   SNAT  --to-source  SIP

SNAT工作流程如下:


DNAT:目标地址转换,当公网上的某个客户访问某个企业的服务器时,它首先会与该企业的nat服务器(或边缘路由器)进行通信。然后根据写好的规则,将该请求的目的ip转换成私有ip地址,在经过路由功能就可以实现和企业服务器进行通信(一般为私有ip地址)。不过,当本地服务器响应服务请求时(一来一回)会自动完成源地址转换。DNAT一般用在nat表的PREROUTING链上。

做SNAT需要执行的地址为-j   DNAT  --to-destination  DIP

DNAT工作流程如下:

      


 自定义规则链

步骤如下:

1、创建一条空链

 # iptables -N clean_in

2、在该链上创建相关规则

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP

# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

3、将匹配权返回交给主链 处理。如果目标地址为172.16.100.7报文一条规则都没匹配,则将由主链中的规则来继续匹配。                   

# iptables -A clean_in -d 172.16.100.7 -j RETURN                               

 4、主链调用自定义规则链。目标地址为172.16.100.7的报文将与自定义规则链中的规则进行匹配。

# iptables -A INPUT -d 172.16.100.7 -j clean_in

 

自定义规则链和主链中的规则都是按顺序来匹配的,它们之间没有优先级,谁在前就最先使用第一条规则进行匹配。

主链是netfilter中的5个链

说明一下:当某个报文被自定义规则链上的规则匹配时,则执行相应的动作;如果报文没被自定义规则链中的任何一条规则匹配,则将返回主链,继续与主链上的其他规则进行匹配。