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

详解iptables

时间:2015-01-07 19:08:12      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:防火墙   iptables   代理服务器   

Firewalls(防火墙):        

     工作在网络边缘(主机边缘),对进出网络数据包基于一定的规则检查,并在匹配某规则时由规则定义的处理进行处理的一组功能的组件。

  防火墙类型:根据工作的层次的不同来划分,常见的防火墙工作在OSI第三层,即网络层防火墙,工作在OSI第七层的称为应用层防火墙,或者代理服务器(代理网关)。

  网络层防火墙又称包过滤防火墙,在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,来确定是否允许该数据包通过。

防火墙处理数据包的四种方式:

ACCEPT:  允许数据包通过
DROP :    直接丢弃数据包,不给任何回应信息
REJECT       拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG:   在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

iptables简介:                

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,实现封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables可以将规则组成一个列表,实现绝对详细的访问控制功能,工作在用户空间,定义规则的工具,本身并不是防火墙,定义的规则可以让在内核空间当中的netfilter来读取,并且实现防火墙的功能

netfilter工作内核的特定位置----TCP/IP协议栈上,可以实现读取规则。从而真正实现详细的访问控制功能

iptables传输数据包的过程

(1) 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。 
(2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

(3) 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。


技术分享

iptables的规则表和链:

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

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

表和链的对应关系:

1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

规则链:5个钩子:生成5个内置链
1.INPUT--进来的数据包应用此规则链中的策略
2.OUTPUT--外出的数据包应用此规则链中的策略
3.FORWARD--转发数据包时应用此规则链中的策略
4.PREROUTING--对数据包作路由选择前应用此链中的规则;所有的数据包进来的时侯都先由这个链处理
5.POSTROUTING--对数据包作路由选择后应用此链中的规则;所有的数据包出来的时侯都先由这个链处理

规则表之间的优先顺序:

Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向
    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向
     防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

规则的写法:                 

格式:iptables [-t TABLE] [COMMAND] CHAIN  CRETIRIA -j TARGET
       -t TABLE: nat, mangle, raw, filter;默认为filter
       COMMAND:定义如何对规则进行管理;
       chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,可以省略;
       CRETIRIA:指定匹配标准;
       -j TARGET :指定如何进行处理;

COMMAND说明:

1.链管理命令(都是立即生效的)

-P :设置默认策略(对于filter表来讲,默认规则为ACCEPT和DROP)
-Z :zero,计数器归零
      -X :delete,删除一条自定义的链
      -F :flush,清空规则链
-E :重命名自定义链
-N :new,自检一条链

1.1自定义的链:

 1、创建自定义且0引用的空链:      
      iptables [-t table] -N chain
 2、删除自定义且0引用的空链:
       iptables [-t table] -X chain
 3、重命名自定义的链:
       iptables [-t table] -E  old_name new_name

2.链规则管理命令

    -A:追加,在当前链的最后新增一个规则    -I#:插入,把当前规则插入为第#条。
       例如:iptables -I 3 :插入为第三条
    -R #:Replays替换/修改第#条规则
      例如:格式:iptables -R 3 …………
    -D #:删除,明确指定删除第几条规则 
    
具体语法格式:
  删除规则:
    iptables [-t table] -D chain rulenum
  设置策略:
    iptables [-t table] -P chain target
  修改规则:
    iptables [-t table] -R chain rulenum rule-specification
  插入规则:
    iptables [-t table] -I chain [rulenum] rule-specification

3.查看管理命令 “-L”

附加子命令:
-n:数字格式显示主机地址和端口(例如:ip如果不加-n,则会将ip反向解析成主机名)
-v:显示详细信息;-vv;-vvv:越多越详细
-x:exactly,不要对计数器的计算结果做单位换算,而显示其精确值 
--line-numbers : 显示规则的编号

匹配标准说明:

基本语法:iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标

1. 通用匹配:源地址目标地址的匹配

-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;相当于--src, --source;可
使用!取反;
-d 地址:指定报文目标IP地址匹配的范围;相当于--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING

2.扩展匹配(隐式扩展、显示扩展)

2.1隐式扩展:

当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;     
 -p tcp :TCP协议的扩展,一般有三种扩展
      --dport :指定目标端口,不能指定多个非连续端口,只能指定单个端口,指定多个端口,端口之
间需要用逗号隔开。
      --sport:指定源端口
      --tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
         对于它,一般要跟两个参数:1.检查的标志位;2.必须为1的标志位;
             -tcpflags syn,ack,fin,rst syn ;
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一
次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
      -p udp:UDP协议的扩展
          --dport
          --sport
      -p icmp:icmp数据报文的扩展
          --icmp-type:
               0:echo-reply,ping响应
               8:echo-request,ping请求

2.2显式扩展(-m)

-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码 
multiport: 多端口匹配:可用于匹配非连续或连续端口;最多指定15个端口;
  专用选项:
--source-ports, --sports port[,port,port:port]
--destination-ports, --dports
--ports 
  例子:
# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT 
iprange: 匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;
   专用选项:
     [!] --src-ragne IP[-IP]
     [!] --dst-range
# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

string: 字符串匹配,能够检测报文应用层中的字符串

字符匹配检查高效算法:kmp, bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

time: 基于时间做访问控制

专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop 
--timestart hh:mm[:ss]
--timestop hh:mm[:ss] 
--weekdays day[,day]
例如:
# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT

connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:
[!] --connlimit-above [n] 
例子:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2
 -j DROP

limit: 速率限制

专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:
# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

state: 状态检查专用选项:

--state 连接追踪中的状态:    
     NEW:新建立一个会话
     ESTABLISHED:已建立的连接
     RELATED: 有关联关系的连接
     INVALID: 无法识别的连接
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接:
/proc/net/nf_conntrack 
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
        模块:nf_conntrack_ftp
2、放行请求报文:
(1)放行NEW状态对21端口请求的报文;
 (2) 放行ESTABLISHED以及RELATED状态的报文
3、旅行响应报文:
 (1) 放行ESTABLISHED以及RELATED状态的报文

-j TARGET说明:

常用的TARGET:
   DROP:悄悄丢弃一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
   REJECT:明示拒绝
   ACCEPT:接受
   DNAT:目标地址转换
   SNAT:源地址转换
      PNAT:端口转换
      FULL NAT:全地址转换
   MASQUERADE:源地址伪装
   RETURN:在自定义链中无法匹配报文时,将其返回主链。

SNAT和DNAT的实现:

1.SNAT基于原地址的转换

  基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。

源地址转换的格式:

     例如:我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.249.124这个假设出来的外网地址:

    #iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.249.124

这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.249.124这个IP.但是有时候我们的上网往往是拨号上网,IP地址是不固定的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址.

动态伪装的格式:

   # iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

2.DNAT目标地址转换

  对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

目标地址转换的格式:

#iptables -t nat -A PREROUTING -d 192.168.10.2 -p tcp --dport 80 -j DNAT --todestination 172.16.100.7

iptables的保存于开机自动启动:

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

1.service iptables save 命令

  它会保存在/etc/sysconfig/iptables这个文件中

2.iptables-save 命令

  iptables-save > /etc/sysconfig/iptables

3.iptables-restore 命令

  开机的时候,它会自动加载/etc/sysconfig/iptabels;如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:iptables-restore < /etc/sysconfig/iptables.2;则完成了将iptables中定义的规则手动生效。


本文出自 “小二哥Linux” 博客,请务必保留此出处http://9612520.blog.51cto.com/9602520/1600273

详解iptables

标签:防火墙   iptables   代理服务器   

原文地址:http://9612520.blog.51cto.com/9602520/1600273

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