一、防火墙简介

防火墙分为网络防火墙和应用层防火墙

   1、网络防火墙

网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些***,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊***。最后,它可以禁止来自特殊站点的访问,从而防止来自不明***者的所有通信。

   2、应用层防火墙

应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。

因为应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。

Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(网络层防火墙)。

二、iptables的表链结构

   1、iptables简介

平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。

   2、iptables的表、链结构

   iptables是由四表五链组成的,想要配置iptables必须先了解这四表五链

clip_image002

一个规则可以出现在多个表中,谁先谁后呢?所以在这四个表中是存在优先级关系的:

1)四表

优先级:raw表  >  mangle表 >  nat表  >  filter表

①、raw表

RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。

       RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

       raw内含有两个链:PREROUTING和OUTPUT

②、mangle表

       mangle表一般是对数据包进行修改用的

比如在网络的转发过程中,数据包要从X到Z,中间夹了一个Y,当数据从X到Y的时候,Y要运行拆包,看是不是自己的,如果是就收下了,如果不就是重新封装,把源IP改为自己的,而不再是X的了,再进行转发。

       mangle表中含五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

③、nat表

用于nat功能(端口映射,地址映射等)

主要用来处理一些将要到达本机路由和将要离开本机路由的数据包,修改数据包中的源、目标IP地址或端口;其对应的模块为iptable_nat。

       nat表内含三个链:PREROUTING、POSTROUTING、OUTPUT

④、filter表

一看名字就知道是用来做过滤用的。filter表是iptables的默认表,如果在设置规则时,不指定表,则默认就是在filter表上操作

       filter表内含三个链:INPUT、FORWARD、OUTPUT

   2)五链

这五条链其实就是针对防火墙策略的规则

①、PREROUTING

路由前,数据包在经过防火墙前应做如何处理

②、INPUT

在数据包进行进入本机前就做何处理,目标是本机,不是网络内的主机

③、OUTPUT

在数据包离开本机时做何处理,源是本机,目标是其它主机

④、FORWARD

对于转发数据包做如何处理,因为本机可能是一台代理服务器,网络内的其它主机在与互联网通信时都需要经过这台服务器的转发

⑤、POSTROUTING

在数据包离开防火墙时做如何处理

   INPUT、OUTPUT链主要用在“主机型防火墙”中,即主要针对服务器本机进行保护的防火墙;而FORWARD、PREROUTING、POSTROUTING链多用在“网络型防火墙”中,

三、iptables数据包的过滤流程

为了更直观的表现数据包的过滤流程,请参考第二步及下图

clip_image004

四、iptables使用规则

   iptables规则=检查条件+处理机制

   1)检查条件

(1)IP:源IP,目标IP

(2)Protocal:TCP、UDP、ICMP

               TCP:源端口、目标端口、Flags

               UDP:源端口、目标端口

               ICMP:ICMP-TYPE

       TCP Flags:基于标记的TCP包匹配经常被用于过滤试图打开新连接的TCP数据包,共有六个标志位,UDP没有

①、URG

如为1,则表示本数据包中含有紧急数据

②、ACK

确认标志们

③、PSH

           PUSH操作,所谓PUSH操作就是批数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队

④、RST

表示连接复位请求,用来复位那些产生错误的连接;当PST=1时,表示出现严重错误,必须释放连接,然后再重新建立

⑤、SYN

表示同步序号,用来建立连接。

           SYN=1,ACK=0 表示连接请求

           SYN=1,ACK=1 表示连接请求被响应

⑥、FIN

表示数据已经发送完毕,希望释放连接

   2)处理机制、动作     -j target

       ACCEPT:将包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链

       DENY:拒绝,委婉式的拒绝

       DROP:丢弃数据包,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序

       REJECT:阻拦该数据包,并通知对方(ICMP消息)

       SNAT:改定数据包源IP

       DNAT:改定数据包目标IP

       RETURN:结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

       REDIRECT:将数据包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则

       LOG:记录日志

五、iptables语法

  1)创建一条自定义的规则链

iptables [-t table] -N chain

  2)删除一条自定义的规则链,必须为空链

iptables [-t table] -X [chain]

3)修改自定义链名

iptables [-t table] -E old-chain-name  new-chain-name

4)为链指定默认策略,指定默认规则

iptables [-t table] -P chain target

5)iptables [-t talbe] {-F|-L|-Z} [chain[rulenum]][options...]

   -F:flush,清空链中的规则,不指链则清空表中的所有规则,规则有编号,自上而下从1开始

   -L:list,列出表中的所有规则

       -n:只和-L一块用,数字格式显示IP和PORT

       -v:verbose,以详细格式显示

-vvv

       -x:exactly,精确值,不执行单位换算

       --line-numbers:显示各规则的行号

   -Z:zero,清零,把规则的计数器清零

   6)iptables [-t table] {-A|-D} chain rule-specification

   -A:append,附加一条规则,添加到现在规则链的最下面(-I:默认添加到最前面)    
rule-specification

匹配条件 -j 处理机制

(1)通用匹配:

           -s:source,匹配源地址,可以是IP,也可以是网络地址;可以使用!操作符取反

           -d:匹配目标地址,可以是IP,也可以是网络地址;可以使用!操作符取反

           -p:匹配协议,通常只使用{TCP|UDP|ICMP}三者之一

           -i:数据报文流入接口;通常只用于INPUT、FORWARD和PREROUTING

           -o:数据报文流出接口;通常只用于OUTPUT、FORWARD和POSTROUTING

(2)扩展匹配:

①隐含扩展:使用-p{tcp|udp|icmp}指定某特定服务后,自动能够对协议进行扩展

           -p tcp

               --dport m[-n]:匹配的目标端口,可以是连续的多个端口

               --sport m[-n]:匹配的源端口,可以是连续的多个端口

               --tcpflags           (6个标志们:URG、PSH、RST、SYN、ACK、FIN)

                   --tcp-flags rst,syn,ack,fin syn = --syn

                   ALL,NONE

           -p udp     udp没有标志位,所以只有源端口和目标端口可选

               --dport

               --sport

           -p icmp

               --icmp-type

                 8:ping 请求

                 0:ping响应

②显示扩展:必须要明确指定的扩展模块

           -m 扩展模块名称 --专用选项1 --专用选项2

           multiport:多端口匹配,一次指定多个(15个以内)离散端口

               --source-ports, --sports

               --destination-ports,  --dports

               --ports

           iprange:ip地址范围

               [!] --src-range from[-to]

               [!] --dst-range from[-to]

           time:指定时间范围

               datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

               datestop

               timestart hh:mm[:ss]

               timestop hh:mm[:ss]

               [!]--weekdays day[,day...]

           string:字符串匹配

               --algo{bm|kmp}:字符匹配查找时使用算法

               --string "STRING":要查找的字符串

               --hex-string "HEX-STRING":要查找的字符,先编码成16进制格式

           connlimit:第IP对指定服务的最大并发连接数

               [!]--connlimit-above [n]

           limit:报文速率控制

               --limit #[/second|/minute|/hour|/day]

               --limit-burst #

           state:状态匹配

               ip_conntrack,nf_conntrack

               --state

                   NEW

                   ESTABLISHED

                   RELATED

                   INVALID

  -D 删除规则

iptables [-t table] -D chain rulenum

  -I 插入规则

iptables [-t table] -I chain [rulenum] rule-specification

-R 替换指定规则

iptables [-t table] -Rchain rulenum rule-specification

-S 只显示指定链上的规则添加命令

iptables [-t table] -S [chain [rulenum]]

六、保存规则

写好规则后,别忘了保存到配置文件哈,否则一重启就啥也没了,切记切记!