iptables学习概要总结

/*****************************
* Author : Samson
* Date : 12/06/2015
* Test platform:
* gcc 4.8.4
* GNU bash, 4.3.30
* Debian GNU/Linux 8
* ***************************/

数据包的流程:

1,以本地为目标的包:
步骤:
1)、在线路上传输;
2)、进入本地网络接口;
3)、mangle表的PREROUTING链,修改数据包的一些属性,如改变TOS等;
4)、nat表的PREROUTING链,主要用来修改DNAT。
5)、路由判断,判断包是发往本地的还是需要转发的。
6)、在路由后,被送往本地程序之前,经过mangle表的INPUT链。
7)、经过filter表的INPUT链,所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。
8)、到达本地程序;

2、以本地为源的包
1)、本地程序;
2)、路由判断,要使用源地址,外出接口,还有其他信息;
3)、通过mangle表的OUTPUT链;
4)、通过nat表的OUTPUT链,此链对防火墙本身发出的包进行DNAT操作;
5)、通过mangle表的POSTROUTING链,这条链主要在包DNAT之后,离开本地前,对包mangle。有两种包会经过这里,防火墙所在机器本身产生的包,还有被转发的包。
6)、经过nat表的POSTROUTING链,在这里做SNAT。
7)、离开本地网络接口。
8)、在线路上传输。

3、被转发的包:
1)、在线路上传输。
2)、进入本地网络接口。
3)、通过mangle表的PREROUTING链,进行修改包的属性。
4)、通过nat表的PREROUTING链,这个链主要用来做DNAT。
5)、路由判断,判断是发往本地的还是要转发的。
6)、通过mangle表的FORWARD链,包继续被发送至mangle表的FORWARD链,这是非常特殊的情况下才会用到的。
7)、通过filter表的FORWARD链,只有需要转发的包才会走到这里,且针对这些包的所有过滤也在这里进行。所有需要转发的包都经过这里,不管是外网到内网的还是内网到外网的。
8)、通过mangle表的POSTROUTING链,这个链也是针对一些特殊类型的包。这一步是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。
9)、通过nat表的POSTROUTING链,此链是用来做SNAT的,当然也包括Masquerade(伪装)。

值得注意的是,在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由前,所以在地址被改变之后,才能对包进行路由。若把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。

### mangle表:
 
主要是用来改变包的TOS等特性。
以下是mangle表中仅有的几种操作:
TOS:用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。
TTL:用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的TTL。它的存在是一个很好的理由,那就是我们可以欺骗一些ISP。因为他们不愿意让我们共享一个连接。
MARK:用来给包设置特殊的标记。iproute2能识别这些标记,并根据不同的标记决定不同的路由。用这些标记可以做带宽限制和基于请求的分类。

### nat表:  

此表仅用于NAT,转换包的源或目标地址。只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理。实际的操作分为以下几类:
    DNAT
    SNAT
    MASQUERADE
    
DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。

SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个 很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就 能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似 192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为 私有的,只能用于LAN内部。

MASQUERADE的作用和MASQUERADE完全一样,只是计算机 的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而 不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。

### Filter 表  

filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。 我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这 个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。


### 状态机制:  

状态机制是iptables中特殊的一部分,其实它不应该叫状态机制,因为它只是一种连接跟踪机制。
在iptables里,包是和被跟踪连接的四种不同状态有关的。它们是NEW,ESTABLISHED,RELATED和INVALID。使用--state匹配操作,我们能很容易地控制 “谁或什么能发起新的会话”。
除了本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链里进行处理的,意思就是, iptables会在PREROUTING链里从新计算所有的状态。如果我们发送一个流的初始化包,状态就会在OUTPUT链 里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状 态。综上,所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的

/proc/net/ip_conntrack里的conntrack记录


数据包在用户空间的状态

就象前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。

State(状态)     Explanation(注释)
NEW     NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。
ESTABLISHED     ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。
RELATED     RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID     INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。

ICMP也是一种无状态协议,它只是用来控制而不是建立连接。ICMP包有很多类型,但只有四种类型有应 答包,它们是回显请求和应答(Echo request and reply),时间戳请求和应答(Timestamp request and reply),信息请求和应答(Information request and reply),还有地址掩码请求和应答(Address mask request and reply),这些包有两种状态,NEW和ESTABLISHED 。

当防火墙看到一个请求包时,就认为连接处于NEW状态,当有应答 时,就是ESTABLISHED状态。

规则的语法:
iptables [-t table] command [match] [target/jump]


matche,我把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思 义,这只能用于TCP包;第三类是UDP matches, 当然它只能用在UDP包上了;第四类是ICMP matches ,针对ICMP包的;第五类比较特殊,针对的是状态(state),所有 者(owner)和访问的频率限制(limit)等

这种匹配操作是自动地或隐含地装载入内核的。例如我们使用--protocol tcp 时,不需再装入任何东西就可以匹配只有IP包才有的一些特点。现在有三种隐含的匹配针对三种不同的协 议,即TCP matches,UDP matches和 ICMP matches。它们分别包括一套只适用于相应协议的判别标准。相对于隐含匹配的是显式匹配,它们 必须使用-m或--match被明确地装载,而不能是自动地或隐 含地。

REF:
http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html


2239

你可能感兴趣的:(iptables学习概要总结)