iptables是与最新的 2.6.x 版本Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。iptables 的一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。另外,iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案,并且其性能不输于一些专业的硬件防火墙。

iptables的管理命令介绍:
1、iptables中含有五个钩子函数:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

2、iptables中的表:
filter:过滤,可以有的链:INPUT、OUTPUT、FORWARD
nat:转换,可以有的链:OUTPUT、PREROUTING、POSTROUTING
mangle:拆开,可以有的链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
raw:可以有的链:OUTPUT、PREROUTING
表的优先级:先mangle后filter,先mangle后nat最后filter,其中raw的优先级最高


3、iptables命令的操作对象包括:
规则表(table):由规则链的集合组成,不同的规则表用于实现不同的功能
规则链(chain):由规则的集合组成,保存在规则表中;不同规则链代表了不同的数据包流向。
规则(rule):用于对防火墙策略进行设置,流经某个数据链的数据将按照先后顺序进行过滤。


一条完整的iptables命令由以下几个部分组成:

iptables [-t 表名] <命令> [链名] [规则号] [规则] [-j 目标]

-t选项用于指定所使用的表,iptables防火墙默认有filter、nat和mangle这3张表,也可以是用户自定义的表。表中包含了分布在各个位置的链,iptables命令所管理的规则就是存在于各种链中的。该选项不是必需的,如果未指定一个具体的表,则默认使用的是filter表。命令选项是必须要有的,它告诉iptables要做什么事情,是添加规则、修改规则还是删除规则。有些命令选项后面要指定具体的链名称,而有些可以省略,此时,是对所有的链进行操作。还有一些命令要指定规则号。具体的命令选项名称及其与后续选项的搭配形式如下所示。

针对规则链<命令>的操作有:
-L 列出链中所有的规则
-F 清除链中的所有规则
-P 设置链的默认动作(ACCEPT/REJECT/DROP)
-Z 计数器清零每一条规则都有两个计数器,一个用于记录被本条规则所匹配到的包的个数,另一个用于记录所有匹配到包的体积之和)
-N 定义一个新的规则链
-X 删除定义的规则链
-E 重命名一条链

针对规则<命令>的操作有:
-A 追加一个规则
-I 插入一个规矩
-D 删除一个规则
-R 在指定的链中用新的规则置换掉某一规则号的旧规则

针对视图<命令>的操作有:
-L 列出显示出来
   查看时的子命令和专用选项
       -n 加速,不反向解析,类似route -n
       -v 详细信息[也可-vv,-vvv]
       -x 显示精确值,不做单位换算
       --line-numbers 显示行号    

  1. #iptables -t filter -L                                 显示filter表的规则 
  2. #iptables -t filter -L INPUT                        显示filter表中的INPUT链的规则 
  3. #iptables -t filter -L INPUT -v                        显示filter表中的INPUT链的规则详细信息 
  4. #iptables -t filter -L INPUT -v -x                显示filter表中的INPUT链的规则详细信息并且不做单位换算 


针对目标<命令>的操作有:
-j ACCEPT
    ACCEPT:允许
    DROP:拒绝
    RELATED:有关联的,有联系的(用于FTP协议)
    INVALID:无法识别的状态

针对规则<命令>的操作有:

通用匹配:源地址,端口,协议
    -s ! IP/NETWORK:指定源地址或ip地址,可取反
    -d ! IP/NETWORK:指定目标地址
    -p {四层协议:tcp|udp|icmp}:定义匹配的协议
    -i (input interface):网络接口,一般不用在output和postrouting
    -o (output interface):不能用到INPUT和prerouting

  1. #iptables -A INPUT -s !172.16.4.0/16 -d 172.16.4.1 -p tcp --dport 80 -j DROP                 
  2. 在INPUT链上插入一条拒绝非172.16.4.0/16网络内的主机访问172.16.4.1主机上的监听在tcp协议的80端口的服务的规则 


扩展匹配:
隐式扩展一般指对-p选项中指定的协议进行的扩展
    -p tcp
        --sport 源端口
        --dport 目标端口
        --tcpflags 要检查的标记,必须为1 的标记(剩余的位必须为0)
                  用法:--tcpflags SYN,ACK,RST,FIN (检查4个,只SYN为1)
        --syn 同--tcpflags一样,在TCP三次握手中的标志位:syn=1;ack=syn=1;ack=1
    -p udp
        --sport
        --dport(可跟连续端口如80-90)
    -p icmp
        --icmp-type
            常用类型:echo-reply:0响应
                  echo-request:8请求

  1. #iptables -A -I INPUT 1 -s 172.16.0.0/16 -d 172.16.4.1 -p icmp --icmp-type 8 -j ACCEPT         
  2. 在INPUT链上插入位置为1的一条规则:允许来自于172.16.0.0/16网络内的主机对172.16.4.1主机发起ping请求。 


显示扩展:一般指必须适应-m选项明确指定要加载扩展
-m state
    --state
        NEW:新发起的请求
        ESTABLISHED:表示所有已经建立的连接

  1. #iptables -A OUTPUT -o eth1 -m state --state NEW -j DROP         
  2. 拒绝从eth1网卡出的所有新的网络请求 
  3. #iptables -P OUTPUT DROP                修改OUTPUT链默认规则为DROP 
  4. #iptables -A OUTPUT -s 172.16.100.1 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT                         
  5. 仅允许来自于172.16.100.1发起的tcp协议80端口已经建立的网络连接     

         
-m(mport|multiport)  不连续的多端口的匹配,可以使用!取反
    --source-ports  源端口
    --destination-ports  目的端口
    --ports  即指源也指目的

  1. #iptables -A OUTPUT -s 172.16.100.1 -p tcp -m multiport --destination 80,22,23,110,143 -j ACCEPT                 
  2. 允许来自于172.16.100.1发起的在TCP协议的80,22,23,110,143的连接 


-m iprange  IP地址范围的扩展,可以使用!取反
    --src-range ip-ip
    --dst-range ip-ip

  1. #iptables -A INPUT -d 172.16.100.1 -m iprange --src-range 192.168.1.10-192.168.1.200 -p tcp -m state --state NEW ESTABLISHED -j ACCEPT 
  2. 允许来自于源地址是192.168.1.10--192.168.1.200范围内的主机对172.16.100.1主机的TCP协议的新的建立请求和已经建立的请求 


-m connlimit  --connlimit-above <n>用于限制客户端到一台主机的TCP并发连接总数,n是一个数值。限制某个地址上并发连接的请求的个数
    --connlimit-above n 超过n个并发请求,一般取反使用

-m limit   limit  做数据包的发送速率限制,流控:令牌桶过滤器
    --limit rate  1/sec   /minute /hour /day
    --limit-burst number    峰值,一次性处理的上限

  1. #iptables -A INPUT -d 172.16.100.1 -p tcp -dport 80 -m limit --limit 1/sec --limit-burst 3 -j ACCEPT 
  2. 允许172.16.100.1主机上的TCP协议80端口上的访问每秒只能1个请求,最大同时处理3个请求 


-m time    指定某个时间段生效的审计
    --timestart value
    --timestop value
    --days Mon,Tue,Wed....
    --datestart date
    --datestop date    YY:MM:DD:HH:MM:SS

  1. #iptables -A INPUT -d 172.16.4.1 -p tcp -dport 22 -m time --timestart 09:00 --timestop 18:00 ! -days sat,sun -j ACCEPT                 
  2. 允许每周的周1到周5的09:00-18:00到172.16.4.1主机的TCP协议的22号端口发起请求 


-m string 做字符串的匹配,一起使用
    --algo bm|kmp   编码算法
    --string pattern


由于iptables其实是内核中的一个模块,因此其生效时间是立即生效,而当关机后,定义的所有规则就不存在了。
因此我们可以将其保存起来:
#service iptables save  将定义的规则保存起来,默认保存至/etc/sysconfig/iptables文件
也可自定义保存的位置:
#iptbales-save > /etc/sysconfig/iptables-test1
导出保存的iptables规则
#iptbales-restore < /etc/sysconfig/iptables-test1