LOnils风迷 's Blog

hacking for fun

Copyright © LOnils/Hlly_M风迷's Blog

iptables follow me

这是在学习iptables过程中的总结,分享出来希望对各位有用=。=

发到lofter格式有点废╮(╯_╰)╭。。文章已输出pdf:http://pan.baidu.com/s/1o6xBNKY

=============

Table of contents

0x01:包过滤技术

0x02:NAT

0x03:iptables/netfilter

0x04:iptables表、链、规则

0x05:iptables命令

0x06:配置实验

============

    在谈iptables之前,我们先来讲讲防火墙。这里我们不谈硬件防火墙设备(见都没见过QAQ),说说一些基本防火墙技术。


0x01包过滤技术:



    包过滤技术是在路由功能的基础上扩展的,对网络层和传输层的头部进行检查,根据制定的规则,决定是否转发该数据包。

 

    包过滤规则主要基于IP包头信息设置,包括如下内容:

1、TCP/UDP的源或目的端口号

2、协议类型:TCP、UDP、ICMP等

3、源或目的IP地址

4、数据包的入接口和出接口

 

    包过滤技术是一种简易的防火墙技术,也称为路由的ACL机制。



0x02:NAT

    然后我再来谈谈NAT(Network Address Translation),即网络地址转换,工作在网络层,是防火墙上通常实现的一种代理技术。



    如上图所示,内部主机发往外部主机的数据包,使用了私有的IP地址段作为源地址,到达NAT后,会把源IP和源端口替换成代理服务器的IP和另一指定的源端口,NAT代理将维护 地址转换成映射表,根据这个表能够能够在接收到外部网络连接的响应包时,将目的地址和目标端口转换为NAT的内网的主机地址和源端口,发送给内部中的客户端主机。

    所以我们知道,NAT对内外网的地址进行转化有SNAT(源地址转化)、DNAT(目标地址转化),后面我们会具体谈到它=。=



0x03 iptables/netfilter

    ok,扯了挺多。让我进入iptables~!

    iptables是Linux的开源防火墙,工作在应用层,那它是咋更改内核中的数据呢,就是要用到netfilter了~,netfilter是Linux内核中实现防火墙的功能模块,它实现了很多功能,数据包的过滤、NAT、数据包内容的修改等等等...而我们的iptables通过命令行来对netfilter进行各种配置防火墙过滤规则。

 

    netfilter中指定了五个数据包的挂载点(hook point)(可以把挂载点看做一个门):

 

    位置如下图所示:



1.NF_IP_PRE_ROUTING:

(检查所有到本机的数据包)

通过数据链路层解包,进入网络层的数据包通过此点,目的地址转换(DNAT)在此点进行。

 

2.NF_IP_LOCAL_IN

(检查送到应用程序的数据包)

经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行。

 

3.NF_IP_FORWARD

(转发的数据包)

要转发的包通过此检测点,FORWARD包过滤在此点进行。

 

4.NF_IP_LOCAL_OUT

(检查应用程序发送的数据包)

本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。

 

5.NF_IP_POST_ROUTING

(检查所有离开本机的数据包)

所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能,(SNAT)在此点进行。


举个例子:

    1.当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"
判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)

    2. 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会到达INPUT链。数据包到达INPUT链后,任何进程都会收到它

 

    3. 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)

 

    4. 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)



0x04:iptables表、链、规则

    那iptables是怎样一个结构呢,还记得0x01和0x02中的包过滤和NAT么, 都是对数据包进行操作,iptables把这写操作的集合叫做表。

    iptables有4个表:raw、mangle、nat、filter

 

raw:决定数据包是否被状态跟踪机制处理(几乎用不到,本文中不再说明)

mangle:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块(也是几乎不用)

nat:用于网络地址转换(IP、端口)

filter:过滤数据包

 

filter表iptables最常用的表,我们常用这个表来过滤数据包。

 

     而iptables中的链就是我们前面所说的那个5个挂载点,用来定位数据包并且操作的位置,最后的rule(规则)就是对数据包进行的操作(是丢弃或接收等),下面通过学习iptables的命令来完全理解iptables。


0x05 iptables命令

iptables基本语法格式:

 

# iptables  [-t TABLE] COMMAND [CHAIN] [CRETIRIA] -j ACTION

 

 

-t TABLE 前面我们说的表名:filter、nat、mangle、raw

用中括号表示可省略,不写的话默认filter表

 

COMMAND(命令选项):

我们可以根据对链中规则或链的操作来划分:

对链中的规则:


对链:




    其实还有很多其他的命令,大家可以-h 查看下

    命令好多,等会我们用实例来应用下吧~=。=


[CHAIN] 

就是我们指定的链(hook 点)

 

INPUT链 – 处理来自外部的数据。 

OUTPUT链 – 处理向外发送的数据。 

FORWARD链 – 将数据转发到本机的其他网卡设备上。


[CRETIRIA]

设置我们的条件匹配

基本匹配


隐式扩展


显式扩展



 -j ACTION

 

对数据包进行的操作常用的:

ACCEPT:允许数据包通过。 

DROP:直接丢弃数据包,不给出任何回应信息。 

REJECT:拒绝数据包通过,必须时会给数据发送端一个响应信息。 


0x06 配置实例

 

这里我使用的linux发行版是CentOS6.3

 

iptables

 

服务脚本(但iptables不是一个服务): /etc/rc.d/init.d/iptables

服务配置文件:/etc/sysconfig/iptables-config

规则的保存文件: /etc/sysconfig/iptables

 

对于iptables可以用下面这个命令来 开启/停止/重启/查看状态/保存

service iptables start/stop/restart/status/save

 

 

# iptables -L -n 

常用的一个命令,用来查看filter表中的规则(默认)且不做域名解析(-n)


    在filter表中我们可以发现有三个chain(链),分别定义在INPUT、FORWARD、OUTPUT上,也就意味着我们整个数据包只能在这3个hook点上进行数据包的filter(过滤)。

    其次在每个链的后面还有一个(policy ACCEPT)表示该链的默认策略(别忘了我们设置默认策略的参数-P)是ACCEPT(通过)。表示现在所有INPUT(输入)、FORWARD(转发)、OUTPUT(输出)的数据包都是通过的状态,而下面也没有任何规则。

    当然我们也可以查看其它的表


    可以发现nat表中存在着PREROUTING、POSTROUTING、OUTPUT三个链

    raw表中只存在PREROUTING和OUTPUT两个链

    mangle表中包含所有的五个链

 

    虽然nat、raw、mangle这三个表不常用,但还是了解下好~~

 

    回归正题,关注我们的fiiter表,我增加了个 -v参数


    之后我用其它主机ping了本机 发现如下变化


    所以加的-v参数就是显示计数器(显示通过的数据包及数据包总大小),我们可以使用-Z参数清除。

 

    接下来做点有趣的,利用iptables的配置使其他主机无法ping通本机

 

iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP



    我们先加个-v 看看




之后 。。。 可以看到iptables DROP了3个包,共180字节 =。=



解释下上面那条命令

-A 添加一种规则 -p 指定ICMP协议 之后是ICMP子参数8 表示是发送的ICMP包,最后做个DROP的拦截操作。

 

刚才是在INPUT上做操作,表示从外部发送到主机的数据包做拦截,我们可以试试让本机 ping不同外部的包~~

 

iptables还有许多的参数和技巧打算另外再写一篇文章~~,这次就到这里。











评论
热度(3)
  1. cohuxLOnils风迷 's Blog 转载了此文字
  2. redboyLOnils风迷 's Blog 转载了此文字