iptables简介
iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。
真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
4表5链
iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
4个表
filter:一般的过滤功能(默认表是filter,没有指定表的时候就是filter表)。
nat:用于nat功能(端口映射,地址映射等)。
mangle:用于对特定数据包的修改。
raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。
5个链
PREROUTING:数据包进入路由表之前。
INPUT:通过路由表后目的地为本机。
FORWARDING:通过路由表后,目的地不为本机。
OUTPUT:由本机产生,向外转发。
POSTROUTIONG:发送到网卡接口之前。
规则表
1.filter表
三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包
内核模块:iptables_filter
2.Nat表
三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)
内核模块:iptable_nat
3.Mangle表
五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
内核模块:iptable_mangle
4.Raw表
两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理
内核模块:iptable_raw
规则链
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
优先级
规则表之间的优先顺序:
Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
引用马哥的一张图:

语法
iptables [-t TABLE] 命令CHAIN [num] 匹配条件 -j 处理办法命令
查看类
-L:显示指定表中的规则。
-L的选项:
-n:以数字格式显示主机的地址和端口号。
-v:显示链及规则的详细信息。
-vvv:更详细的显示链和规则的信息。
-x:显示计数器的精确值。
--line-numbers:显示规则号码。
管理规则类
-A:附加一条规则,添加在链的尾部。
-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条。
-D CHAIN [num]:删除指定链中的第num条规则。
-R CHAIN [num]:替换指定链中的第num条规则。
管理链类
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则清空对应表中的所有链。
-P CHAIN:设定指定链的默认策略,一般我们会设置默认策略为DROP。
-N:自定义一个新的空链。
-X:删除一个自定义的空链。
-Z:置零指定链中所有规则的计数器。
-E:重命名自定义链。
匹配条件
通用匹配
-s,--src:指定源地址
-d,--dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE:指定数据报文流入的接口。例如:-i eth0
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE:指定数据报文流出的接口。
可用于定义标准的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配
隐含扩展
不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}。
-p tcp
--sport PORT:源端口
--dport PORT:目标端口
--tcp-flags mask comp:
只检查mask指定的标志位,是逗号分隔的标志位列表;
comp:此列表中出现的标记位必须为1;
cmp中没出现,而mask中出现的,必须为0;
例如:--tcp-flags SYN,ACK,PIN,RST SYN 意思是匹配SYN为1,其他的ACK,PIN,RST为0的包,即三次握手中第一次握手的包。
--syn:匹配三次握手中第一次握手的包。
-p udp
--sport PORT:源端口
--dport PORT:目标端口
-p icmp
--icmp-type
0:echo-reply,应答包
8:echo-request,请求包
显示扩展
必须指定由哪个模块进行的扩展,在iptables中使用-m选项可以完成此功能。
格式:
-m EXTESTION --spe-option
-m state:状态扩展
结合ip_conntrack追踪会话的状态
--state
NEW:新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接(SYN=1,FIN=1)
RELATED:相关联的(用命令激活的连接,例如:ftp)
例如:-m state --state NEW,ESTABLISHED -j ACCEPT
-m multiport:多端口扩展
--source-ports:源端口
--destination-ports:目标端口
--ports:源或者目标端口
例如:-m multiport --destination-ports 21,22,80 -j ACCEPT
-m iprange:ip地址范围
--src-range:源ip地址范围
--dst-range:目标ip地址范围
-m connlimit:连接数限制
--connlimit-above n:链接数上限,一般结合!使用,标识不能超过n个连接数。
-m limit:速率限制
--limit RATE:连接数的速率。例如:3/second意思是限制每秒钟3个连接,3/minute每分钟3个连接。
--limit-burst N:蜂拥而至的连接数上限为N。
-m string:匹配字符串
--algo {bm|kmp}:算法,二选一即可。
--string “string”:匹配的字符串。
-m time
--datestart:开始日期
--datestop:结束日期
--timestart:开始时间
--timestop:结束时间
未完待补充。。。
处理办法
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
--to-destination IP[:port]:目的地址转换
SNAT:源地址转换
--to-source IP/iprange:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
--log-level N:log级别
--log-prefix “指定log的前缀”:指定log的前缀。
--log-tcp-sequence:记录tcp序列号。
--log-tcp-options:记录tcp的选项。
--log-ip-options:记录ip的选项。
--log-uid:记录用户的ID。
MARK:打标记
持久化
Iptables重启的时候,默认会清空所有的规则。
我们需要把iptables的规则保存到文件里去。
执行service iptables save就能自动保存到/etc/sysconfig/iptables文件中,然后再重启。
也可以自定义保存到指定的文件中:iptables-save > PATH
然后从指定文件读取iptables规则:iptables-restore < PATH
例子
首先修改filter表的3条链默认策略为DROP:
不写-t 表名,即默认为filter表:

例1
开放80端口
有进来,就要考虑出去。写iptables规则的时候,一定要考虑进来和出去。

例2
允许自己ping自己。

例3
允许本机ping任何地址,但不允许别人ping自己。
Ping使用的是icmp协议;
--icmp-type 8 代表的是ping请求
--icmp-type 0 代表的是ping应答

放行ftp
ftp协议比较特殊,所以单独拿出来说。
首先需要装载两个模块:ip_conntrack_ftp,ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

然后添加两条规则:
Iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Iptables -A OUTPUT-s 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

优化
减少重复规则
Iptables规则是从上往下命中的,假如命中了第一条,后面就不会再命中了。
所以,规则是可以优化的,以至于规则不会重复和累赘。

改成以下:

多端口匹配
用1条规则,代替多条规则,也算是一种优化。

条件取反
感叹号:!
例如:
-s ! 192.168.1.12
意思是除了192.168.1.12的源地址。
recent模块抵御dos攻击
这种办法的抵御还是有限的。

iptables之Layer7
iptables默认工作在osi模型中的2/3/4层上。
我们可以通过打补丁,使得iptables支持7层。
这里引入layer7扩展。
安装layer7的步骤这里省略,网上能找到很多文档。
语法:
Iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j REJECT