iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。分为四个表和五个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。


4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

filter:一般的过滤功能,如不-t指定表,则默认filter

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

mangle:用于对特定数据包的修改

raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

PREROUTING:数据包进入路由表之前

INPUT:通过路由表后目的地为本机

FORWARDING:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTIONG:发送到网卡接口之前

用表格表示下他们之间关系

四个表/五个链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING
rew
mangle
nat
filter

用图来表示他们的过滤匹配流程

ⅰ>、入站数据流向: 来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机(如Internet用户访问防火墙主机中的Web服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。

ⅱ>、转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则处理,之后会进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再讲给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

ⅲ>、出战数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

规则链内部各条防火墙规则之间的优先顺序:

在数据包经由各条规则链的处理过程中,依次按第1条规则、第2条规则、第3条规则.....的顺序进行匹配和处理。如果找到一条能够匹配该数据包的规则,则不会继续检查后面的规则(使用LOG记录日志的规则除外,下面iptables配置说明)。如果比对完整个规则链,也找不到和数据包相匹配的规则,就按照该规则链的默认策略进行处理。


常用参数:

链中规则:

   -A 添加一条规则

   -I 根据给出的规则序号向所选链中插入一条或更多规则

   -R 从选中的链中取代一条规则

   -D 删除一条规则

链:

   -N 新建一条自定义链

   -X 删除一条自定义链

   -E 重命名一条自定义链

   -F 清空指定链,如果不指定链,则清空表中的所有链

   -P 设定链的默认策略

   -Z 把所有链的包及字节的计数器清空

查看:

   -L 查看

   -v 详细查看

   -vv 更详细查看

   -x  显示包和字节计数器的精确值,代替用K,M,G表示的约数。 这个选项仅能用于 '-L -v'命令

   -n  数字输出。IP地址和端口会以数字的形式打印

   --line-numbers 在每个列表前加上行号

服务脚本:/etc/rc.d/init.d/iptables

脚本配置文件:/etc/sysconfig/iptables-config

service iptables {status|start|stop|restart|save}

规则的保存位置/etc/sysconfig/iptables


匹配条件:

通用匹配

 -s 源地址匹配

 -d 目标地址匹配

(源地址和目标地址可以是ip地址,也可以是网络地址,网络地址需加上掩码,如:192.168.1.0/24 。如需取反则加上!,如:! 192.168.1.11,即除192.168.1.11以外的ip)

 -p 协议匹配,通常有三种协议{icmp|tcp|udp}

 -i IN_INTERFACE 流入接口,注意:通常接的链有 PREROUTING、INPUT、FORWARD

 -o OUT_INTERFACE 流出接口,注意:通常接的链有 FORWARD、OUTPUT、POSTROUTING

扩展匹配

  隐式扩展

   -p tcp

        --dport PORT

        --sport PORT 

(这里可以指定端口片,如:{22:67}指定22端口到67端口,{22: }指定22端口以上,{ :22}指定22端口以下,也可以使用!取反{! 22:67})

        --tcp-flage SYN,ACK,RST,FIN SYN 检查tcp标志位,SYN为1,其他三个为0(tcp标识位有6个,分别是SYN、ACK、URG、PSH、RST、FIN----建立连接、确认、紧急、强迫、复位、结束)

   -p udp

        --sport PORT

        --dport PORT

(这里同上tcp)

    -p icmp

        --icmp-type typename

(typename有'8'请求、'0'应答等类型,例如配置一个不让某网段ping本机:iptables -t filter -A INPUT -s 192.168.0.0/24 -p icmp --icmp-type 8 -j DROP )

  显示扩展

(netfilter 扩展模块引入的扩展,用于扩展匹配条件,通常需要额外专用选项来定义)

     -m state:用于实现连接的状态检测模块

        --state NEW(新建连接),ESTABLISHED(确认连接),RELATED(关联连接),INVALID(无效连接)

     -m multiport :多端口

        --source-port :源端口组

        --destination-ports :目标端口组

        --ports

例如:将同是tcp协议的22、80端口合并一条规则

[root@david ~ ]#iptables -L INPUT -nChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     tcp  --  0.0.0.0/0            172.31.12.4         tcp dpt:22 ACCEPT     tcp  --  0.0.0.0/0            172.31.12.4         tcp dpt:80 [root@david ~ ]#iptables -F INPUT[root@david ~ ]#iptables -I INPUT 1 -d 172.31.12.4 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

    -m limit :速率限制

        --limit 速率(如:3/second 表示每秒3个数据包)

        --limit-burst 峰值速率(如100 表示不能超过100个数据包)

例如:限制其他机子每分钟同时Ping本机eth0网卡的速率

[root@david ~ 15:52 &1]#iptables -A INPUT -i eth0 -d 172.31.12.4 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT[root@david ~ 15:56 &2]#iptables -A INPUT -i eth0 -d 172.31.12.4 -p icmp --icmp-type 8 -j DROP

    -m connlimit :连接上限

        --connlimit-above n  多于n个表示满足条件  取反要在选项前加!

    -m iprange :ip地址范围

        --src-range ip-ip

        --dst-range ip-ip 

(例如:-m iprange --src-range 172.31.12.1-172.31.12.50)

     -m mac   mac地址限制

        --mac-source 

     -m string    字符串编码特征匹配

        --algo  [bm|kmp]  匹配算法

        --string “Pattern” 要匹配的字符串

    -m recent   有点类似坏人名单

        --set   添加源地址的包到列表中

        --update  每次建立连接都更新列表

         --seconds 必须与—rcheck或—update同时使用

        --hitcount必须与—rcheck或—update同时使用

              

例: 限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个

iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT

例:限制SSH连接速率(默认策略是DROP)

iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT

iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT

例:web服务器不响应内容含有yao页面的请求

iptables –I OUTPUT 1 –s 192.168.146.3 –p tcp –-sport 80 –m string –-algo kmp --string “yao” –j DROP

例:利用recent模块抵御DOS***

iptables –I INPUT –p tcp –-dport 22 –m connlimit –-connlimit-above 3 –j DROP 单个IP最多连接3个会话,

iptables –I INPUT –p tcp –-dport 22 –m state –-state NEW –m recent –-set –-name SSH

只要是新的连接请求,就把它加入到SSH列表中

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

5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP任何服务。被限制5分钟后即可恢复访问。