iptables位置和作用
如下图所示,iptables其实是linux(netfilter)在用户空间的mmi(用户界面)。
linux的tcpip协议栈或者netfilter运行在内核空间,而iptables就是将netfilter的功能封装成一些命令,提供给用户空间的程序使用。
如下图所以,iptables的各个chain分别处于tcp/ip协议栈中的若干关键位置。
- PREROUTING: 从网卡进入尚未判断路由走向的数据包
- FORWARD: 经过路由判决后,需要转发出去的数据包
- POSTROUTING: 路由判决后,准备发送给网卡的数据包
- INPUT: 发送给本机的数据包
- OUTPUT: 从本机发出的数据包。
结构
iptables有三层结构,table->chain->rule
可以理解成table是chain的容器、chain是rule的容器。
正如上面章节描述,iptables中包含5条默认的chain,从另外一个层面iptables包含4张table,相互之间的关系如下:
另外,从数据包的走向来看,要分成以下几种情况:
- 从外部网络发送给主机的
- 从主机发送给外部网络的
- 外部主机发送给外部主机的,本机作为路由转发的
table
iptables总共有四张table:filter, nat, mangle, raw
chain
iptables的table都由chain组成,其中包括系统默认的chain和自定义chain。
系统的chain可以理解为tcpip协议栈的hook。
自定义chain,则可以理解为其它chain中的hook。
rule
iptables的rule以及chain的默认action构成了chain
一条rule主要分成两部分:匹配条件和匹中后的动作。
action
action可以理解成为:当一个数据包满足一定条件时,执行指定的动作。
我们分别来看条件和动作。
基本用法中的条件主要包括:数据包本身的一些特性,扩展模块中还引入了数据包历史状态作为条件。
动作主要包括:DROP, ACCEPT, REJECT, RETURN, MARK,SNAT, DNAT, MASQUERADE , REDIRECT, LOG, 修改数据包的特殊字段或者进入指定的chain继续判断。
action的条件
从物理层、链路层、网络层、传输层、甚至是应用层,都有相关字段可以作为action的条件。
物理层,数据包的来源可以作为条件,包括:-i interface, -o interface
链路层,数据包的mac地址可以作为条件,包括:-m mac –source xx:xx:xx:xx:xx:xx
网络层,主要是指ip数据报头,相对比较复杂,可以作为条件的字段比较多,包括:
- TOS
- TTL
- Proto
- src、dst IP
传输层,主要包括tcp、udp、以及icmp。
udp比较简单,可以作为条件的包括:dport、sport以及扩展模块state的状态。
tcp相对比较复杂,可以作为条件的包括:dport、sport、tcp-flags、tcp-option、以及扩展模块state的状态。
icmp可以作为条件的就是icmp的type。
应用层,相对于网络层的单一、传输层的有限的协议,应用层千差万别,所以用传统的字段判断并不好用,所以应用于应用层的action主要使用了扩展模块,比如:string、l7-proto等。