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

28_1_iptables系列之基础原理

时间:2015-10-17 00:34:18      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

iptables/netfilter:工作在linux内核中的网络防火墙,是一组工具。
    netfilter:正真起作用的是netfilter,它是一个框架;
    iptanles:是生成防火墙规则,并且将其附加在netfilter上真正实现数据报文过滤、nat、mangle等规则生成的工具。

1、一些网络知识:
   ip报文首部,Tcp报文首部
   事实上,网络防火墙的主要功能是根据报文首部实现的。
(1)ip报文首部:
   0:版本号(4),IP首部大小[结果*4](4),服务类型(8),总长度=IP首部+数据[tcp首部](16)   
   4:段标识[用于分段标识](16),R(1),DF:不允许分片(1),MF:更多分片(1),段偏移量:分片拼接(13)
   8:TTL:每经过一个路由-1,为0还没有到达目的地就抛弃(8),协议:TCP,UDP,TCMP等(8),首部校验码(16)
   12:源IP
   16:目的IP
   20:options,可变长度的可选数据
   24:数据

   ICMP:互联网控制消息协议
        是三层半协议,根据IP报文实现数据报文的发送,但不是能实现报文控制的协议
    是传输网路控制的协议。

  IP报文实现了将一个数据报文发往目标主机,但是真正通信的是两个主机上的进程是哪两个进程呢?
   对于TCP,UDP协议可以根据端口号标记
   端口号:[0-65535],一般在linux主机上0-1023管理员使用
                     在BSD上>5000的端口才允许用户使用
   对linux来说一切皆文件,每打开一个端口就称打开一个套接字文件
   所以众多的应用协议都是基于TCP,UDP协议,来完成再次封装,以标记两个进程的


(2)TCP报文首部:
   0:源端口(16),目标端口(16)
   4:序列号[sequence Number](32)
      TCP是有状态的协议,需要三次握手,四次断开,每一次报文的传输都需要对方确认
      发送方告诉接收方所发送陪的编号,第一次的随机的,以后每一次都加1。
   8:确认号[Acknowledgement Number](32)
      把对方的序列号加1,并回送给对方。
      一次传一批,依次确认,一次发多少个呢?
      滑动窗口的窗口大小是双方用来协商发送缓冲和接收缓冲的大小的。
   12:首部长度(4),保留:现在有两个已经使用(6),下面6个:是否有效[1为有效]:
       URG紧急指针(1),ACK确认号(1),PSH推送[立即送给内核](1),RST重置(1),SYN同步请求(1),FIN断开链接(1)
       窗口大小(16)
   16:TCP校检和(16),紧急指针(16)
   20:options,可变长度的可选数据
   24:数据

 例如一个http报文:
   要发送一个http报文,有很多的开销:帧首部,IP首部,TCP首部,http首部,数据
   这些数据都要转换为能够通过网络发送的数据格式:文本,二进制,最后都是转换成0和1

   TCP:有限状态机
(3)TCP的三次连接:
   A(client)----> B(server) 发出请求:
              初始状态    1次               2次         3次
    A(client):closed  主动打开          SYN_SEND  ESTABLISHED
    B(sever) :closed  被动打开(Listen)  SYN_RCVD  ESTABLISHED

(4)TCP四次断开
               初始状态                             
  A(主动关闭):ESTABLISHED  FIN_TIME1   FIN_TIME2   TIME_WAIT(等待MSL*2) COLSED
  B(被动关闭):ESTABLISHED  CLOSE_WAIT  LAST_ACK                         CLOSED

  MSL:报文段的最大生存时间,一般120秒


2、iptables基础原理
(1)网络防火墙(主机防火墙):
   工作在主机or网络边缘,对于数据报文进行检查,监控,并根据事先规定的规则进行处理。
   是一个组件,可能是硬件,也可以是软件。
   规则:真正实现防火功能的是规则,由匹配标准和处理办法组成
        默认规则:一般采用关闭(通),另一种为开放(堵)。
   简单说,防火墙就是数据报文过滤。

Linux内核实现了网络功能,但是防火墙规则应该写到内核,但又不能直接和内核打交道,那该怎么办呢?
   于是,就有人在TCP/IP协议栈上(就是实现TCP/IP模块上) ,选择几个开放的位置,只开放给用户空间的一个命令
   实现了,用户空间的命令操作内核(特殊的系统调用)。
   早期linux上没有防火墙的,是参考OpenBSD移植过来的。
    Linux2.0:ipfw/firewall
    Linux2.2:ipchain/firewall
    Linux2.4:iptables/netfilter


技术分享
(2)5个钩子函数,四个表,五个链
  数据报文到达网卡时将其拆分,根据ip判断是发往自己的还是发往其他主机的。
     如果发往自己就发到自己的用户空间所谓某个进程
     如果是发往其他主机的,查看/proc/sys/net/ipv4/ip_forward是否为1,为1是可以转发。

  那是谁来判断决策数据报文的流向呢?
      根据分析目标IP和路由表来完成路由决策
      路由决策发生在,一个数据报文被网卡接收以后,送到TCP/IP协议栈上的那一刻。

  数据报文有三种流向:
     1.从外面进来的:流向主机内部       #input函数  ,图中1号
     2.从里面出去的:从主机内部流出     #output函数, 图中2号
     3.转发的:A-->B经过,B-->A经过     #forward函数,图中3号
  这3个位置:是netfilter的设计者补充在TCP/IP协议栈上的3个钩子函数(hook function)
     任何一个报文经过的时候把报文勾起来进程查看收否符合规则。

  还有2个位置:两个特殊的钩子函数      
  做地址转换(NAT):私有的IP不可以上网,公网IP才可以上网
                  公网地址有限,可以申请一个公网地址供多个私有IP主机上网
              把私有IP主机的网关指向这个公网地址,然后通过转换地址就可以上网
                  做nat的主机有一个nat会话表,记录转化过程
  有两种转换类型:   
     目标地址转换:PREROUTING函数,  图中4号
     源地址转换:  POSTROUTING函数, 图中5号

**********************************************************
  5个钩子函数:prerouting,input,output,foreard,postrouting
  5个规则链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
  4个表:
     filter[过滤]:INPUT,OUTPUT,FORWARD
     NAT[地址转换]:PREROUTING,POSTROUTING,OUTPUT
     mangle[拆开,修改,封装]:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
     raw[不改变原状]:PREROUNTING,OUTPUT
  优先级:
     PREROUTING:raw,mangle,nat
     IUPUT:mangle,filter
     OUTPUT:raw,mangle,nat,filter
     FORWARD:mangle,filter
     POSTROUTING:mangle,nat
**********************************************************

  能否使用自定义链?
     可以使用自定义链,但只在被调用时才能发挥作用,
     且如果没有定义链中的任何规则匹配,还应该有返回机制。
     用户可以删除自定义的空链
     默认链无法删除


3.规则:匹配标准 + 处理办法
(1)原则:
     从上到下匹配,匹配到就停止。
     规则越少越好,效率高。
     当规则有联系的时候,小范围的在上面
     当规则没有联系的时候,大范围的在上面
     同一链,不同功能不可以交叉存放规则,必须按类存放

(2) 计数器:每个规则都有两个内置的计数器:
          1.被匹配的报文个数
      2.被匹配的报文大小之和

(3)匹配标准:
   IP:SIP(源IP),DIP(目标IP)
   TCP:SPORT(源端口),DPORT(目标端口),还可可以根据标志位匹配:
       如:tcp第一次握手:SYN=1,FIN=0,RST=0,ACK=0
           tcp第二次握手:SYN=1,FIN=0,RST=0,ACK=1
           tcp第三次握手:SYN=0,FIN=0,RST=0,ACK=1(ESTABLISHED)
   UCP:SPORT(源端口),DPORT(目标端口)
   ICMP:icmp-type(ICMP报文类型)
         使用报文来标记,有多种控制消息报文,每种报文的格式不一样
     如:ping的时候,网关不可达,请求超时,主机不在线,主机名称不可解析等,报文类型的区别

  匹配标准分类:
     通用匹配:自身能完成的匹配
     扩展匹配:需要依赖模块完成的匹配
         隐式扩展:不用特别指明由哪个模块进行的扩展,此时使用-p{tcp|udp|icmp}
     显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-n选项可完成此功能

(4)处理办法
   ACCEPT:放行
   DROP:  丢弃
   REJECT:拒绝
   DNAT:  目标地址转换
   SNAT:  源地址转换
   REDIRECT:
   MASQUERADE:
   MASK:  打标记

28_1_iptables系列之基础原理

标签:

原文地址:http://www.cnblogs.com/wangjiaxing/p/4886686.html

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