netfilter & iptables 概述

来源:互联网 发布:小程序 源码 编辑:程序博客网 时间:2024/04/28 03:35

      最近(其实是半个月前吐舌头)听了小组一位同学关于iptables的讲座,觉得很有意思,所以又结合观看了两节iptables的公开课的心得,写下这篇笔记。


一.什么是netfilter ,什么是iptables,?

Linux内核中有关网络控制的功能,就是通过netfilter(网络过滤)模块实现的,常见的访问控制包括:哪些ip可以访问服务器、可以使用哪些协议、哪些接口,以及对数据包的处理等等,简单的说,网络访问控制,就是实现了类似防火墙的功能。在用户层,我们则使用iptables对netfilter进行控制管理。netfilter与iptables结合起来,共同完成了linux系统中防火墙的功能。


二.netfilter的基本概念

netfilter定义了两个基本概念:链(chain)表(table)其中,netfilter总共定义(或者可以说划分)了5个链:

INPUT:输入到本机的数据;

FORWARD:数据包经过本机转发的数据;

OUTPUT:从本机输出的数据;

PREROUTING:路由前的数据(到本机);

POSTROUTING:路由后的数据(从本机发出)。

netfilter也定义了4个功能不同的表:

filter:对数据包进行过滤;

nat:对数据包的源、目标ip进行修改;

mangle对数据包进行修改或给数据包附上一些外带数据;

raw:raw表处理完后,将跳过其他表的处理,用来加快数据包的传输速度,以提高性能。

优先级排序:raw>mangle>nat>filter


所以当我们想创建一条规则的时候,我们首先要明确我们需要在哪条链上执行动作,根据不同的功能选择合适的链,同样,我们也需要通过不同的功能选择不同的表。下图就是iptables中链和表的对应关系:


                                      



三、数据包的流向



                                     

1.数据包传入,进入raw表的PREROUTING链,这里可以在连接跟踪前处理数据包,即可设置一条连接不被连接跟踪处理;

2.(设置了连接跟踪后)进入了mangle表的PREROUTING链,可以进行数据包的修改或附加等工作;

3.进入nat表的PREROUTING链,可以进行目标地址转换(dnat);

4.决定路由,看数据包是直接传给本机还是转发给其他主机。


如果是直接传入本机:

5.进入mangle表的INPUT链,这里是在路由之后,交给主机之前,我们可以修改数据包;

6.进入filter表的INPUT链,可以对传入的数据包进行过滤(所有收到且目的地址为本机的包都会经过这个链);

7.进入本机;

8.决定路由,看该往哪里发出(用哪个地址以及哪个接口发出);

9.进入raw表的OUTPUT链,看是否需要在连接跟踪前处理数据包;

10.(设置了连接跟踪后)进入mangle表的OUTPUT链,可以在这里对数据包进行修改或附加;

11.进入nat表的OUTPUT链,可以在这里对防火墙自己发出的数据做dnat;

12.进入filter表的OUTPUT链,可以对从本地出去的数据包进行过滤;

13.再次进行路由决定(前面的mangle和nat表可能修改了数据包的路由信息);

14.进入mangle表的POSTROUTING链,这时数据包仍然在本地主机,但是已经做完了所有的路由决定;

15.进入nat表的POSTROUTING链,可以进行snat;

16.数据包输出。


如果是转发给其他主机:

5.进入mangle表的FORWARD链,,这是在第一次路由决定之后,进入最后的路由决定之前,可以对数据包进行修改;

6.进入filter表的FORWARD链,可以对数据包进行过滤(这里的数据包是转发的,是双向的);

7.同上一种情况的13.14.15.16步。


明白了上述流程之后,再看下面这张链与表的关系图就清楚很多了:





四.iptables的基本规则


iptables的规则是按顺序排列,逐条进行匹配,若没有匹配规则的话,则使用默认规则,每个链都有默认规则。


-表:规定使用的表(filter,nat,mangle)

-链:规定过滤点

-匹配属性:规定匹配数据包的特性

-匹配后的动作:允许,丢弃,记录


基本操作:

列出现有规则: iptables -L

删除所有规则: iptables -F

插入一个规则: iptables -I   INPUT  3  -p tcp --dport 22 -j ACCEPT

删除一个规则: iptables -D INPUT  3  


匹配参数:

1.基于ip地址: -s 192.168.1.1(源地址)

                            -d 10.1.1.0(目标地址)

2.基于接口:  -i  eth0(从哪个接口接收的数据)

                         -o eth1(从哪个接口发出的数据)

3.基于协议及端口:-p  tcp --dport 22

                                   -p icmp

4.排除参数:可以在任何参数后面加一个单引号括起来的感叹号,表示取反操作:  -s  '!'  192.168.1.1  



例子:

1.  iptables  -A INPUT -s 192.168.1.100  -j  DROP

   向INPUT链中插入一条规则,把所有来自192.168.1.100这个ip的数据包全部丢弃。

2. iptables -A INPUT -t  tcp --dport 80 -j DROP

   向INPUT链中插入一条规则,把所有访问tcp 80端口(网页服务)的数据包全部丢弃。

3. iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP

    向INPUT链中插入一条规则,把所有来自192.168.1.0这个网络的,到本机的tcp的22端口(ssh协议)的数据包全部丢弃。

4. iptables -A INPUT -i eth0 -j ACCEPT

     向INPUT链中插入一条规则,把所有来自eth0这个接口数据包全部接收。

5. iptables -A FORWARD -s 192.168.1.0/24  -d  10.1.1.0/24 -j DROP

     向FORWARD链中插入一条规则,把所有源ip是192.168.1.0,目标地址是10.1.1.10的数据包全部丢弃。

6. iptables -t nat -A PREROUTING  -p tcp --dport 80 -j DNAT --to--dest 192.168.1.10

      向nat表中的PREROUTING链中插入一条规则,把所有访问tcp到80端口(网页服务)的数据包的目标地址修改为192.168.1.10。

7. iptables -t nat -A POSTROUTING  -o eth0 -j MASQUERADE

      向nat表中的POSTROUTING链中插入一条规则,把所有从本机发送出去的数据包的源ip地址伪装成eth0的ip地址。

8. iptables -t nat -A POSTROUTING  -j SNAT --to--source 1.2.3.4

      向nat表中的POSTROUTING链中插入一条规则,把所有从本机发送出去的数据包的源ip地址修改为1.2.3.4。


配置保存:

若想永久保存配置规则,则需要将规则保存在/etc/sysconfig/iptables配置文件中。

可以通过service iptables  save命令将iptables规则写入配置文件。










若有任何错误,欢迎指正。


0 0
原创粉丝点击