码迷,mamicode.com
首页 > 其他好文 > 详细

iptables

时间:2016-07-06 18:32:21      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:防火墙   internet   安全防护   计算机硬件   安全性   

iptables:

一、防火墙简介

所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障。是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关,从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。当然需要注意的是世界上没有绝对的安全,防火墙也只是能够启到一定的安全防护,大多数的安全风险还是在内网之中。

二、防火墙分类

1、从特点上分类

1)软件防火墙,软件防火墙运行于特定的计算机上,它需要客户预先安装好的计算机操作系统的支持,一般来说这台计算机就是整个网络的网关。俗称“个人防火墙”。软件防火墙就像其它的软件产品一样需要先在计算机上安装并做好配置才可以使用。

(2)硬件防火墙,硬件防火墙其实就是一个普通PC机的架构,然后上面跑有专门的操作系统。

(3)芯片级防火墙,这种防火墙基于专门的硬件平台,没有操作系统,专有的ASIC芯片使它们比其他类的防火墙速度更快,处理能力极强,性能更高,但是价格也极其昂贵。

2、从技术上分类

(1)包过滤型防火墙,这类的防火墙主要是工作在网络层,根据事先设定好的规则进行检查,检查结果根据事先设定好的处理机制进行处理。

(2)应用层防火墙,它是工作在TCP/IP模型中的最高层应用层,相比较来说速度要慢一点。

(3)状态监视器,状态监视作为防火墙其安全性为最佳,但配置比较复杂,且网络速度较慢。

、iptables的原理详解

1、netfilter与iptables

   Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)

  • 数据包内容修改

  • 数据包过滤防火墙功能


链(chains)

   Netfilter 平台中制定了数据包的五个链,分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。


规则(rules)

   规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。


表(tables)

   表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

技术分享


2、filter、nat、mangle、raw

filter表

   主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链: 

  • INPUT链:INPUT针对那些目的地是本地的包;

  • FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包; 

  • OUTPUT链:OUTPUT是用来过滤所有本地生成的包; 

nat表

   主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包 的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链: 

  • PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址;

  • OUTPUT链:改变本地产生的包的目的地址;

  • POSTROUTING链:在包就要离开防火墙之前改变其源地址;

mangle表

   主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

raw表

   是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING


3、INPUT、FORWARD等规则链和规则

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。

OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。

PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。

POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。

技术分享


 其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

防火墙处理数据包的方式(规则):

ACCEPT:允许数据包通过

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

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

SNAT - Source Network Address Translation源网络地址转换。这是一种改变数据包源ip地址的技术, 经常用来使多台计算机分享一个Internet地址。这只在IPv4中使用,因为IPv4的地址已快用完了,IPv6将解 决这个问题。

DNAT - Destination Network Address Translation 目的网络地址转换。 DNAT是一种改变数据包目的 ip地址的技术,经常和SNAT联用,以使多台服务器能共享一个ip地址连入Internet,并且继续服务。通过对 同一个ip地址分配不同的端口,来决定数据的流向。

MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上。

REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。

RETURN:返回

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。

注意:除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

4、 Linux数据包路由原理

   网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。是时候看这张图了:

技术分享


从上图中,我们可以总结出以下规律:

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

如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它

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

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

我们在写Iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则。

四、iptables的几个状态

iptables的状态跟踪连接有4种,分别是:NEW、ESTABLISHED、RELATED、INVALID,除了从本机出去的数据包有NAT表的OUTPUT链处理外,其它所有的状态跟踪都在NAT表中的PREROUTING链中处理,具体状态信息如下:

1、NEW状态:说明这个数据包是收到的第一个数据表。

2、ESTABLISHED状态:只要发送并接到应答,一个数据表的状态就从NEW变为ESTABLISHED,并且该状态会继续匹配这个连接后继数据包。

3、RELATED状态:当一个数据包的状态处于ESTABLISHED状态的连接有关系的时候,就会被认为是RELATED,也就是说一个连接想要是RELATED状态,首先要有一个ESTABLISHED的连接。

4、INVALID状态:不能被识别属于哪个连接状态或没有任何关系的状态,一般这种数据包都是被拒绝的。

五、iptables的命令使用

1、查看链表,创建链表类命令

(1)、创建自定义链
iptables [-t table] -N chain :创建一条自定义规则的链 
# iptables -t filter -N clean_in  #自定义链在没有引用之前是不起作用的
(2)、删除自定义链
iptables [-t filter] -X [chain] : 删除一个自定义链
# iptables -t filter -X clean_in
(3)、修改自定义链名字
iptables [-t table] -E old-chain-name new-chain-name : 为一个自定义链修改名字

2、查看修改规则命令组

-F:清空链中的规则,规则具有编号,从上到下,从1开始 
-L:list,列出表中的所有规则 
    -n: 数字格式显示IP和Port 
    -v: 详细格式显示 
     pkts  bytes  target  prot  opt  in  out  source  destination        
    每个字段的含义: 
    pkts: packets, 被本规则所匹配到的报文的个数;
    bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;
    target: 目标,即处理机制;
    prot: 协议,一般为{TCP|UDP|ICMP}; 
    opt: 可选项
    in: 数据包的流入接口;
    out: 数据包的流出接口;
    source: 源地址;
    destination: 目标地址;
-X:exactly, 精确值,不执行单位换算
    --line-number: 显示各规则的行号 
-Z:匹配数量清零

3、添加和编辑规则

-A: append, 附加一条规则
-D chain [rulenum] rule-specification: 删除一条规则
-I chain [rulenum] rule-specification : 修改规则
-R chain [rulenum] rule-specification:替换指定规则
-S chain [rulenum] 只显示链上的规则添加
    
rule-specification格式 :
  匹配条件 -j 处理机制 
     
  通用匹配条件:
  -s: 匹配原地址,可以IP,也可以是网络地址,可以使用操作符取反!192.168.0.0/16;-s相当于--src或--source 
  -d: 匹配目标地址 
  -p: 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一; 
  -i:数据报文流入的接口:通常用于INPUT, FORWARD, PREROUTING
  -o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING
  -j target 
    RETURN:返回调用链
    ACCEPT: 放行 
举例:
1、为了不断开主机,先开放本机的22号端口
# iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.130.251 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.130.251 -d 192.168.0.0/16 -p tcp --sport 22 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source             destination         
  253 21356 ACCEPT     tcp  --  *      *    192.168.0.0/16     192.168.130.251     tcp dpt:22 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source             destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source             destination         
   62  6640 ACCEPT     tcp  --  *      *    192.168.130.251    192.168.0.0/16      tcp spt:22 
2. 允许192.168.0.0/24网段ping通,当前192.168.120.251主机
# ping -w 2 -c 2 192.168.130.251   #先ping一下测试
PING 192.168.130.251 (192.168.130.251) 56(84) bytes of data.

--- 192.168.130.251 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms    #不通
# iptables -A INPUT -s 192.168.0.0/16 -d 192.168.130.251 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -s 192.168.130.251 -d 192.168.0.0/16 -p icmp --icmp-type 0 -j ACCEPT   
# ping -w 2 -c 2 192.168.130.251    #另一台机器ping测试
PING 192.168.130.251 (192.168.130.251) 56(84) bytes of data.
64 bytes from 192.168.130.251: icmp_seq=1 ttl=64 time=0.350 ms
64 bytes from 192.168.130.251: icmp_seq=2 ttl=64 time=0.412 ms

--- 192.168.130.251 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.350/0.381/0.412/0.031 ms  
# iptables -L -n -v   #查看本机报文匹配
Chain INPUT (policy DROP 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out  source             destination         
  872 72532 ACCEPT     tcp  --  *      *    192.168.0.0/16     192.168.130.251     tcp dpt:22 
    2   168 ACCEPT     icmp --  *      *    192.168.0.0/16     192.168.130.251     icmp type 8 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source               destination         
  440 46340 ACCEPT     tcp  --  *      *    192.168.130.251    192.168.0.0/16      tcp spt:22 
    2   168 ACCEPT     icmp --  *      *    192.168.130.251    192.168.0.0/16      icmp type 0









































本文出自 “把酒问苍天” 博客,请务必保留此出处http://79076431.blog.51cto.com/8977042/1811282

iptables

标签:防火墙   internet   安全防护   计算机硬件   安全性   

原文地址:http://79076431.blog.51cto.com/8977042/1811282

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!