1:Iptables/netfiter是linux下工作在网络层的防火墙,但是他支持连接追踪(状态检测).很多防火墙资料但中,都把iptables和netfiter叫做防火墙,其实netfiter是linux内核中实现的包过滤防火墙的内部结构,不以程序或文件的形式存在,属于内核态(内核空间),而iptables是管理防火墙命令的工具,是一个程序,iptables在为netfiter的管理上提供策略和规则(以下统统成为iptables).其中又分为网络防火墙和应用层防火墙(网关).
1.1:网络防火墙
数据报文到达该防火墙时,该防火墙会检测ip首部中的源地址,目标地址,TTL,tcp的源端口,目标端口TTL等,如果匹配到防火墙定义的规则,就进行相应的处理,如:通过,丢弃,许进不许出等.但是ip是很容易伪装的,所以就有了应用层防火墙
1.2:应用层防火墙(网关,代理服务器)
工作在应用层,不检测ip和tcp报文,但是会检测数据的内容,如果内容匹配到防火墙的策略,就进行相应的处理,如:丢弃或通行,许进不许出等.但是ip和tcp已经被丢弃了,没有了源ip,和源端口,所以该防火墙就把自己当成源ip源端口.
2:工作机制
2:1Iptables的钩子函数
一个数据报文进入我们的linux主机有5中流向,首先进入我们主机的内核空间,这是就是路由前(PREROUTING),内核空间的tcp/ip协议栈上的路由功能(FORWARD)对该报文进行检测,判断该报文的目标ip,如果该报文的目标ip就是我们的机器,就检查目标端口,如果该目标端口有进程在监听,那么路由就会把该报文转发到本机的用户空间中,这就是输入(INPUT).如果目标ip不是本机,就判断本机是否允许做网络间转发,如果不允许,就丢弃该包.如果允许,路由就会把该报文转发到另外一张网卡,这是路由后(POSTROUTING).还有一种情况,如果报文是通过本机出去的呢?这就是输出(OUTPUT)了,总结下来有5种情况了.路由前(PREROUTING),输入(INPUT),路由(FORWARD),输出(OUTPUT),路由后(POSTROUTING),而这5个流向也叫做钩子函数(),也就是我们需要设置的规则.
2.2iptables的处理机制
Iptables是如何防火的呢?有几种情况:过滤(Ffilter).网络地址转换(NAT),NAT又分为源地址转换(DNAT),目标地址转换(SNAT)(源地址转换为目标地址都是在路由后(请求),目标地址转换为源地址都在路由前(响应)).(私有ip是不能访问公网的,客户端经过一台公网ip的服务器访问互联网,在服务器端需要完成地址转换(NAT),该报文刚进入到服务器端的时候(路由前),还不知道该报文的目标ip,所以不能做NAT,需要在路由后做.互联网的响应发回来的时候,服务器在接受到响应报文,因为该报文就是发往本服务器的,如果经过服务器内部的路由的话,就会被服务器端的用户空间接受到该报文,但是该报文又不是服务器端的进程发送的,所以只能不经过该服务器端的路由,直接发回给最初发送请求的客户端,这叫路由前,也就是目标地址转换.简单的说,经过了路由的就叫路由后,没经过路由的就叫路由前).mangle:主要是做记录用的,他可以改变ip或tcp报文中的一些信息,相当于打个标记.raw:这个用的不多,就不做介绍了....总的来说就是:过滤(filter) ,网络地址转换(NAT),mangle,raw
2.3:规则钩子函数+处理机制就组成了规则表了
钩子函数加上处理机制就是他的处理规则了,下面看组合以及优先级
优先级:raw-->mangle-->NAT—>filter
组合四表五链,是表和链的对应关系
raw:PREROUTING,OUTPUT,-->这个用的不多
mangle:INPUT,FORWORD,OUTPUT,PREROUTING,POSTROUTING(主要做防火墙标记的)
nat: PREROUTING,POSTROUTING,OUTPUT
filter:INPUT,FORWORD,OUTPUT(这是默认表,如果执行命令的时候不指定表,默认使用此表),默认有通和堵,通:默认为堵,只对能识别的记性放行.堵:默认为通,只对能识别的就行阻截.
下面是为了另一种记法,五链四表,和上面一样的
路由前(PREROUTING):filter,mangle,raw
输入(INPUT):filter,mangle
路由(FORWARD):mangle,nat
输出(OUTPUT):filter,mangle,nat,raw
路由后(POSTROUTING):mangle,nat
如下图:
2.4:检查条件:网络层防火墙只能检查,ip首部,tcp首部,帧首部等等
IP:源IP,目标IP
TCP:源端口,目标端口,Flags(SYN,ACK,FIN)
UDP:源端口,目标端口
ICMP:ICMP-TYPE
2.5:扩展检查:对时间,对协议,对关键字,对state,
处理机制
DENY:
DROP:
REJECT:
ACCEPT:
RETURN:
3:TCP的有限状态机(这里简单说说,不熟悉的去补补吧)
第一次握手:SYN=1,ACK=0,FIN=0
第二次握手:SYN=1,ACK=1,FIN=0
第三次握手:SYN=0,ACK=1,FIN=0
3.1状态:
客户端 | 服务器 | 状态 |
Close | Listen | 初始状态 |
syn_sent | syn_rcvd | 三次握手 |
established | established | 连接状态 |
4.Iptables命令
4.1新增链
iptables -t filter -N mychain #-N:新增一条链表 iptables -t filter -L -n #查看链表 Chain INPUT (policy ACCEPT) #系统链是policy REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain mychain (0 references) #增加了一条mychain的链,自定义链名为references,为引用 target prot opt source destination
iptables -X mychain #删除mychain的链 iptables -t filter -L -n #查看链,可以看到已经不存在了 Chain INPUT (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source
4.3:修改链的默认策略
iptables [-t table] -P chain target #改变表的默认规则,就是我们前面提到的通和堵 iptables -t filter -P FORWARD DROP #改变filter表中的forward链的默认规则,可以看到意见改变了 iptables -t filter -L -n #查看链表 Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
原文:http://lidefu.blog.51cto.com/3429777/1384180