当前位置: 首页 > news >正文

Linux防火墙详解(一)

1
2
3
4
Linux防火墙详解(一)
一、Linux防火墙简介
二、iptables的表和链
三、TCP/IP和iptables

一、Linux防火墙简介
1.iptables/netfilter:
    防火墙:就是一个数据报文过滤工具
        网络防火墙
        主机防火墙
    
        工作于网络或主机的比边缘(通信报文的进出口),对于进出本网络的报文根据事先定义的检查规则作匹配检测,对于匹配到规则的作出相应处理
    防火墙:
        硬件:需要软件的结合实现,NetScreen,CheckPoint//在硬件级别就能够实现对报文流量的分析,对常见的攻击进行处理
        软件:
        
2.内核的基本功能:网络协议栈
    1.从协议角度,看数据包流程:

1.png
    2.从内核角度
        进如该主机->流入,解封
        从该主机出去->流出,封装各层
    3.外部报文流向
        1.请求进入本机://流入
        进程间通信,需要向内核注册端口,内核通过查看端口映射查找该进程,然后拆掉首部信息,交给该进程处理
            注册的目的:1.用于监听在某个端口
                        2.访问其他主机通信
        2.经过我转发
            目标地址不是我的,就不会到达我的用户空间
            要么转发,要么丢弃
        3.从本机出去的报文://流出
        
        //流入和留出都有缓冲区,缓冲区:内存中的一段空间
        //虽然网卡有全双工模式,但是流入和留出的传输速率很有可能不一致,内核有时候也很忙
        //用户空间的访问控制,仅针对于特定应用有效,流入httpd的allow from和deny from
        //内核可以针对用户空间的所有应用进行防护
    防火墙:肯定会对系统性能有所影响
数据包流向:    

1.png
报文流向:
    1.流入本机:PREROUTING-->INPUT==>用户空间流程
    2.留出本机:用户空间进程==>OUTPUT-->POSTROUTING
    3.转发:PREROUTING-->FORWARD-->POSTROUTING
    
二、iptables的表和链    
1.iptables/netfilter    
        netfilter:
            hooks function :钩子函数,真正执行工作的
        iptables:定义规则的,用户空间的命令行接口
    钩子函数:内核的功能    
    netfilter:内核级别已经支持v6
    iptables:主要用于v4
    ip6tables //实现v6的支持
2.netfilter的五个钩子函数
    PREROUTING //路由之前,进入本机前
    INPUT
    OUTPUT
    FORWARD
    POSTROUTING    //路由之后,从本机出去之前
3.iptables的表和链
表:
    filter:过滤,防火墙
    mangle:拆解报文,按需修改,重新封装
    nat:network address translation(IP层,传输层地址)
    raw:关闭在nat表启用的连接追踪机制
    
    表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
链:
iptables
    内置链:
        PREROUTING
        INPUT
        OUTPUT
        FORWARD
        POSTROUTING
    自定义链
        手动添加,需要和内置链关联,具有调用和返回机制
        主链:上有调用机制
        自定义链:上有返回主链的条目,假如都没有匹配的话,就返回主链
        
4.表和链的关系
    filter:INPUT,FORWARD,OUTPUT
    mangle:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING //随地都可以修改
    nat:PREROUTING,OUTPUT,POSTROUTING//nat和ip相关
    raw:PREROUTING,OUTPUT
    
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。
    一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。
    如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

同一链上的不同的表的规则的应用优先级(高-->低)
    raw-->mangle-->nat-->filter
        
iptables是netfilter的实现
    因为netfilter是内核的功能应该是不用启动的,默认就是随内核开启的
    但是centos6:有iptables服务启用与关闭
    
5.规则:
组成部分:根据规则的匹配条件去匹配报文,对匹配成功的报文根据队则定义的处理动作做出处理
    匹配条件:n个,与或非,默认是与
        基本匹配:
        扩展匹配:
    处理动作:
        基本处理动作:
        扩展处理动作:
        自定义处理动作:
    匹配规则:
        自上而下,逐条匹配,匹配到的话,就处理
        都未能匹配,使用最后默认规则
    
    添加规则的考量点:
        1.要实现何种功能,判断添加规则至哪个表上
        2.报文流经的位置;判断添加规则到哪条链上
        
三、TCP/IP和iptables        
1.IP首部
    s_ip,d_ip,version,Hdr Len[包头长度],
        Identification:说明是哪一个报文的分片,有的报文太大的话,需要分片
        Fragment offset:是哪个报文的第几个片段
        DF:don't fragment
        MF:报文不完整,需要等待其他分片合并以后才是完整的
        TTL:生存周期,过一个路由-1,防止环路,一般是64,最大255=2^8
            //路由器可以修改此值,防止被追踪到
        Protocl:上层协议,tcp,udp,2^8
        Header Checksum:首部校验和
        
    报文:包头长度:小于64Bytes,
    1480+20Bytes =1500
    1460+20 = 1480 //
    [20B:s_ip,D_ip,...][40B:Options][data]
IP包头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     ============================================
     version( 4 )|包头长度( 4 ) | TOS( 8 )| 总长度( 16 )    //共 32 bit= 4 bytes  || v 4 /v 6     
     =============================================
     标识( 16 )         标志( 3 )  片偏移( 13 )
     =============================================
     TTL( 8 )        协议( 8 )        首部校验和( 16 )
     ==============================================
         Sip( 32 )
     ==============================================
         DIP( 32 )
     ==============================================
         选项( 32 ) //可选
     ===============================================
         数据
     ===============================================

        
        包头长度:4(byte)*5=20bytes,带选项的4(byte)*6=24byte,不带数据
    version:ipv4或者ipv6,包头长度:该部分占4个bit位,单位为32bit(4个字节)最大2^4*4(byte)=64byte,TOS:服务类型,总长度:2^16=65536bytes,,
            //也即是说数据包的最大长度为65536bytes,常规的无选项的IP包头长度为20bytes,可以通过MTU计算出DATA数据字段的最大长度为1480bytes。
    标识:16bit的标识字段唯一的标识主机发送的每一份数据报,由主机生成具有唯一性。通常每发送一份报文该值加1。该值在数据包分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值,把该值相同的分片收集到一起重组,后面会继续讨论分片。
            标志:该字段主要用来分片和重组
            片偏移:
    TTL:该IP数据包可以经过的路由器的最大数量 //最大2^8=256
    协议:8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。
    首部校验和:一般不使用该字段,该字段的值以32bit为单位,不足时以0补充。
    
    
2.TCP首部:
2.png    

    s_port,d_port //各16bit
    Sequence Number 32bits
    Ack Number        32bits
端口是用来标记进程地址,ip用来标记主机地址    
    
3.数据包流向解析
匹配PREROUTING:
    raw.PREROUTING
    mangle.PREROUTING
    nat.PREROUTING
    //逐个匹配,假如mangle的第2条匹配到了,需要打个标记,那就直接打个标记,然后接着由nat匹配,
    
假如有数据包从Network IN要通过iptables,数据包流向如下:

3.png

=============================================================================
1.Network IN数据包到达服务器的网络接口
2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。
  进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
  进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)
3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。
4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:
路径一:
    5.进入 mangle 表的 FORWARD 链,
      进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。
    6.进入 mangle 表的 POSTROUTING 链
      进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)
    7.数据包流出网络接口,发往network out。
路径二:
    8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:    
    9.进入 mangle 表的 INPUT 链,
      进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,数据包交给本地主机的应用程序进行处理。
    10.应用程序处理完毕后发送的数据包进行路由发送决定。
    11.进入 raw 表的 OUTPUT 链。
       进入 mangle 表的 OUTPUT 链,
       进入 nat 表的 OUTPUT 链,
       进入 filter 表的 OUTPUT 链。
    12.进入 mangle 表的 POSTROUTING 链,
       进入 nat 表的 POSTROUTING 链。
    13.进入出去的网络接口,发送往network out。    
1.png











本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2046884,如需转载请自行联系原作者

相关文章:

  • Linux内核驱动基础(一)常用宏定义【转】
  • xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
  • hibernate增删改
  • maven学习:jetty插件与Tomcat插件
  • 聊下 git 多账户问题
  • Datanode Hang with High thread blocked
  • 安装heartbeat
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • 菜鸟学Linux 第065篇笔记 nfs
  • 更改INSM地址的操作
  • centos 7 yum安装kubernetes cluster 1.0
  • C++字符串string类常用操作详解(一)【初始化、遍历、连接】
  • Java设计模式圣经连载(03)-抽象工厂模式
  • Centos中文乱码问题的解决。
  • Python函数知识汇总-课堂笔记
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CentOS7简单部署NFS
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Druid 在有赞的实践
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6 学习笔记(一)let,const和解构赋值
  • git 常用命令
  • Git初体验
  • October CMS - 快速入门 9 Images And Galleries
  • TypeScript迭代器
  • Xmanager 远程桌面 CentOS 7
  • yii2中session跨域名的问题
  • 机器学习学习笔记一
  • 解决iview多表头动态更改列元素发生的错误
  • 前嗅ForeSpider采集配置界面介绍
  • 日剧·日综资源集合(建议收藏)
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用putty远程连接linux
  • 通过几道题目学习二叉搜索树
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 用element的upload组件实现多图片上传和压缩
  • 智能合约开发环境搭建及Hello World合约
  • 数据可视化之下发图实践
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​决定德拉瓦州地区版图的关键历史事件
  • #includecmath
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转) 深度模型优化性能 调参
  • **CI中自动类加载的用法总结
  • .apk文件,IIS不支持下载解决
  • .form文件_SSM框架文件上传篇
  • .mysql secret在哪_MySQL如何使用索引