what(什么是iptbales)?
iptables 是建立在 netfilter 架构基础上的一个包过滤管理工具,最主要的作用是用来做防火墙或透明代理。Iptables 从 ipchains 发展而来,它的功能更为强大。iptables 提供以下三种功能:包过滤、NAT(网络地址转换)和通用的 pre-route packet mangling。

HOW(iptables怎么运行)?
运行机制简单概括为:tables(表)===>chains(链)===>rule(规则),简称为四表五链多规则:

四表:filter表、nat表、mangle表、raw。默认使用的是filter表,现在用的比较多的表是前两个,filter用于过滤,nat 用于地址转换;mangle 修改数据包;raw 一般是为了不再让iptables做数据包的链接跟踪处理,跳过其他表,提高性能。

1.filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:
INPUT链:INPUT针对那些目的地是本地的包
FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
OUTPUT链:OUTPUT是用来过滤所有本地生成的包

2.nat表:主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个规则链:
PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址
OUTPUT链:改变本地产生的包的目的地址
POSTROUTING链:在包就要离开防火墙之前改变其源地址

3.mangle表:
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

4.raw表:
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING。

五链:
1.INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
2.OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
3.FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
4.PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
5.POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。

四表五链对应关系:
链            表

FORWARD        filter、mangle
 INPUT          filter、mangle
 OUTPUT         filter、mangle、nat
 PREROUTING     mangle、nat
 POSTROUTING    mangle、nat



规则:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT:源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
DNAT:目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

WAY(iptables的使用方法)?
好了,科普到此结束,其实最重要还是实际的应用操作。
基本语法:
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :如果没有-t默认是filter表
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :规则的定义

***********************************************************************************
COMMAND (链的操作):
-A 或 -append 在所选链尾加入一条或多条规则
-D 或 -delete 在所选链尾部删除一条或者多条规则
-R 或 -replace 在所选链中替换一条匹配规则
-I 或 -insert 以给出的规则号在所选链中插入一条或者多条规则. 如果规则号为1,即在链头部.
-L 或 -list 列出指定链中的所有规则,如果没有指定链,将列出链中的所有规则.
-F 或 -flush 清除指定链和表中的所由规则, 假如不指定链,那么所有链都将被清空.
-N 或 -new-chain 以指定名创建一条新的用户自定义链,不能与已有链名相同.
-X 或 -delete-chain 删除指定的用户定义帘,必需保证链中的规则都不在使用时才能删除,若没有指定链,则删除所有用户链.
-P 或 -policy 为永久帘指定默认规则(内置链策略),用户定义帘没有缺省规则,缺省规则也使规则链中的最后一条规则,用-L显示时它在第一行显示.
-C 或 -check 检查给定的包是否与指定链的规则相匹配.
-Z 或 -zero 将指定帘中所由的规则包字节(BYTE)计数器清零.
-h 显示帮助信息.
***********************************************************************************


***********************************************************************************
CRETIRIA(指定匹配标准):
-p指出要匹配的协议,可以是tcp, udp, icmp, all, 前缀!为逻辑非,表示除该协议外的所有协议.
-s指定源地址或者地址范围.
-sport指定源端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名子.
-d指定目的地址或者地址范围.
-dport指定目的端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名子.
-i指定匹配规则的ICMP信息类型(可以使用 iptables -p icmp -h 查看有效的ICMP类型名)
-o匹配规则的对外网络接口,该选项只针对于OUTPUT,FORWARD,POSTROUTING链是合法的.
***********************************************************************************


开始准备阶段:
***********************************************************************************
①查看iptables具体情况
iptables -L -n
(列出表/链中的所有规则,包过滤防火墙默认使用的是filter表,因此使用此命令将列出filter表中所有内容,-n参数可加快显示速度,也可不加-n参数。)
②清除内置规则,初始化状态
iptables -F
(清除预设表filter中所有规则链中的规则)
iptables -X
(清除预设表filter中使用者自定义链中的规则)
iptables -Z
(将指定链规则中的所有包字节计数器清零)
③设置链的默认策略,默认允许所有,或者丢弃所有,根据自身系统情况来决定:

iptables -P INPUT DROP
 iptables -P OUTPUT DROP
 iptables -P FORWARD DROP


(以上我们在不同方向设置默认允许策略,若开放则应是ACCEPT)
以上是比较好的一个初始化方案
***********************************************************************************

自定义设置阶段:
***********************************************************************************
向链中添加规则,下面的例子是开放指定网络接口(信任接口时比较实用):

iptables -A INPUT -i eth+ -j ACCEPT
 iptables -A OUTPUT -o eth+ -j ACCEPT
 iptables -A FORWARD -i eth+ -j ACCEPT
 iptables -A FORWARD -o eth+ -j ACCEPT


(eth+是指所有的网卡名称,主机之间通讯,必须输入INPUT,输出OUTPUT,都要开启)

iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT

(开放eth0网卡中192.168.100.1对192.168.100.250的22端口)

iptables -A INPUT -p tcp -m multiport –dport 21:25,135:139 -jACCEPT
(添加不连续的多个端口)
-A INPUT -p tcp –dport 21:25 -j ACCEPT
(如果不使用multiport参数,只能是添加连续的端口,而不能写成21:25,135:139)

使用用户自定义链:
iptables -N zhoutimo
(创建一个用户自定义名叫zhoutimo的链)
iptables -A zhoutimo -s 0/0 -d 0/0 -p icmp -j DROP
(在zhoutimo链中设置了一条规则)


补充:理解一下关于标准中的s,d,sport,dport。如果是INPUT,s参数对应是来自源地址的请求(source),dport就会作为源地址访问的目的端口,如果是OUTPUT,d参数对应是目的地址(destination),sport就是作为源端口,让目的地址访问。
***********************************************************************************


保存阶段:
***********************************************************************************
默认保存iptables规则:

/etc/init.d/iptables save
 service iptables save


默认保存位置:在/etc/sysconfig/iptables文件内:

自定义指定规则保存位置:
iptables-save > /etc/sysconfig/iptables/iptables.201600812
生效自定义的规则
iptables-restore < /etc/sysconfig/iptables/iptables.201600812

备注
避免在远程连接写规则的时候一不小心自己被防火墙拒之门外,可以写一个小脚本:

#!/bin/bash
 iptables -F
 iptables -P  INPUT   ACCEPT
 iptables -P  OUTPUT  ACCEPT
 at now+10min


测试完成之后停掉脚本就可以了。
***********************************************************************************