一:防火墙的介绍:

          防火墙分为两类:网络层防火墙和应用层网关防火墙.

    iptables:网络层防火墙

    netfilter 组件也称为 内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成 这些表包含内核用来控制信息包过滤处理的规则集。

    iptables 组件是一种工具,也称为 用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

二:防火墙中的实现原理: (四表五链)

    五链:  

    netfilter中有五个钩子函数,我们通常称为五个链:

    prerouting:路由前

    input到达本机内部的报文的必经之路

    forward:有本机转发的报文必经之路

    output:有本机发出的报文的必经之路

    postrouting:路由后

    

    规则功能:

      有四个表结合五个链使用:

       filter:过滤,定义是否允许通过防火墙

       nat: 地址转换,启用connection_track;包含snat,dnat,pnat,下面我们将介绍

       mangle:

       raw: 目标是关闭nat表上启用的链接追踪功能;

    表和链的对应关系:(这是特定的表通常应用到的链)

    filter   : input   forward   output

    nat      : prerouting   postrouting  forward

    mangle   : prerouting  input forward output postrouting

    raw      : prerouting  output

 三:基本语法

     iptables [-t TABLE] COMMAND CHIAN CRETIRIA -j TARGET

     -t TABLE:

         nat,mangle,raw,filter

       默认情况为filter

    COMMAND:

     链:

        -F: flush,清空规则链的时候要先修改默认策略

        -N: new,自建一条链

        -X: delete,删除一条自定义的空链

        -Z:zero,计数器归零

        -P:policy,设置默认策略,对filter表来讲默认策略为accept或drop

        -E: 重命名自定义链

  对链可以进行表首插入、删除、追加、替换操作分别对用的参数为 -I -D -A -R 查询用 -L [-n,-v,-vv] 

     -j  TARGET: 表示对前面定义的做什么操作   

   处理目标包括 drop reject  accept 自定义的链

  匹配条件:分为通用匹配和扩展匹配

  通用匹配主要包括源IP,目标IP,协议类型,报文的方向(流入和流出)

  扩展匹配包含显示扩展和隐式扩展

  扩展匹配是调用netfilter额为模块实现特殊检查机制,使用iptables -m 选定指定调用的模块。

  因为iptables与netfilter各自拥有一部分代码。‘

  隐式扩展使用 -p [tcp|udp|icmp] ,显示扩展需要用-m 指出使用的模块,在下面我们会使用各种模块。

四:iptables定义的规则匹配流程:

            自上而下匹配,匹配到后就不会向下继续进行,否则继续。都没有匹配上最后会被默认策略匹配到。

 注意:其中的自定义链没有工作在网络协议栈上因此匹配自定义链的时候我们要对其进行调用,调用后通常我们也要用return返回。

 这些规则默认的位置在/etc/sysconfig/iptables文件中我们可以使用iptables-save > /etc/sysconfig/iptables 中使其长久有效

 或者使用service iptables save保存使用中的规则。

 生效规则文件中的规则我们可以使用:iptables-restore < /etc/sysconfig/iptables 或者是用 service iptables restart

 用service 命令只在CentOS 5 和6 上有用。

五:iptables的使用:

    我们先介绍几个将要用到的显示调用的模块:

 iprange 专用选项--src-range ip[-ip], --dst-range

 string:字符匹配,能够 检测出报文应用层中的字符串,用到的算法有kmp,bm

         专用选项:--algo --string 'string' --hex-string "hex_string":16进制格式的字符串

 实例:iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

 表示不允许访问带用sex这种字符串的网页。

 time : 基于时间做访问控制

         专用选项 --datestart --datestop --timestart --timestop --weekdays day [,day]

 实例:iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays  Mon,Tue,Thu,Fri -j REJECT

 表示不允许周一,周二,周四,周五的08:20 到 18:40 通过tcp 协议 中的80 端口访问 172.16.100.7 这台主机

 limit:速率限制

       专用选项 --limit n[/second|/minute|/hour|/day]  --limit-burst n

 实例:iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

 表示 允许ping 172.16.100.7 这台主机最多每分钟20次,同时允许5个并发进程 

 state:状态检查

       专用选项:--state: 这里的状态指的是连接追踪中的状态有:NEW,ESTABLISHED,RELATED,INVALID.

     我们可以编辑/proc/sys/net/nf_conntrack_max来设置所能容纳的连接追踪的最大数目,也可以使用cat /proc/net/nf_conntrack

     查看当前追踪的所有连接。不同协议类型或连接类型追踪是的属性在 /proc/sys/net/netfilter目录目录中

注意:对于一个访问繁忙的服务器来讲,开启连接追踪是一个非常大的开销有可能会导致服务器访问故障。因此,我们默认情况下应该关闭连接追踪功能。

六:nat功能:

NAT(网络地址转换),是一项非常重要的功能,它可以把大量的私有IP地址转换为少数的甚至是一个公有IP地址。从某种程度上讲正是由于有了NAT技术的产生,节省了大量的公有IP地址。从改变IP地址的角度讲NAT可以分为两类,一类是SNAT(源NAT),即可改变数据包的源IP地址:另一类是DNAT(目的IP地址),即改变数据包的目的地址。

SNAT:当我们内网访问外网的时候在数据包发送到我们网关的时候需要做源IP地址转换,因为在互联网中数据包的发送与接收都是靠的公网IP地,否则的话 外网回应我们的请求时,就无法找到我们的内网主机。因此就需要在防火墙的postrouting设置snat转换。

DNAT:假定当我们内部有一台web服务器时,当外网访问我们的网关时,此时网关就需要设置目标地址转换,转换为内网中对应的web服务器的IP地址。

七:总结:

 使用nat功能需要谨慎,因为它需要和连接追踪结合起来一块使用,我们都知道当开启连接追踪功能后会产生额外的资源消耗,当服务器访问繁忙时,开启连接追踪可能导致服务器瘫痪。