iptables基本用法

iptables位置和作用

如下图所示,iptables其实是linux(netfilter)在用户空间的mmi(用户界面)。
linux的tcpip协议栈或者netfilter运行在内核空间,而iptables就是将netfilter的功能封装成一些命令,提供给用户空间的程序使用。
iptables在linux中的位置

如下图所以,iptables的各个chain分别处于tcp/ip协议栈中的若干关键位置。
iptables的chains

  • PREROUTING: 从网卡进入尚未判断路由走向的数据包
  • FORWARD: 经过路由判决后,需要转发出去的数据包
  • POSTROUTING: 路由判决后,准备发送给网卡的数据包
  • INPUT: 发送给本机的数据包
  • OUTPUT: 从本机发出的数据包。

结构

iptables有三层结构,table->chain->rule
可以理解成table是chain的容器、chain是rule的容器。

正如上面章节描述,iptables中包含5条默认的chain,从另外一个层面iptables包含4张table,相互之间的关系如下:
iptables的tables和chains
另外,从数据包的走向来看,要分成以下几种情况:

  • 从外部网络发送给主机的
  • 从主机发送给外部网络的
  • 外部主机发送给外部主机的,本机作为路由转发的

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等。