热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux中IP包过滤的实现

文章标题:Linux中IP包过滤的实现。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  摘 要: 本文主要介绍在Linux内核中实现IP包过滤的基本流程,同时对IP伪装和网络地址转换(NAT)的实现作简要的介绍。
  关键词 包过滤 防火墙 网络地址转换(NAT) IP伪装
  随着因特网的迅猛发展,信息安全、网络安全已经成为人们日益关注的焦点。越来越多的企业和机关已经开始利用防火墙技术来保障网络不受外部黑客的入侵。包过滤技术是防火墙技术的技术核心,更好的理解包过滤的机制有助于我们更深刻的理解和应用防火墙来保障网络信息的安全。
  一、 Linux网络部分代码分析
  Linux网络层采用统一的缓冲区结构skbuff,一个个单独的skbuff被组织成双向链表的形式。网卡接收到数据帧后,系统内核为接收到的数据帧分配一块内存,然后将数据整理成skbuff的结构.在网络协议处理的时候,数据均以skbuff的形式在各层之间传递、处理。
  skbuff的强大功能在于它提供了众多指针,可以快速的定位协议头位置;它也同时保留了许多数据包信息(如使用的网络设备等),以便协议层根据需要灵活应用.
  在IP协议层有三个关键函数:ip_rcv( )、ip_forward( )、ip_output( ),分别处理IP层的接收、转发和发送工作。防火墙的功能函数将在此三个函数中调用。
  二、 包过滤.
  包过滤主要工作于IP层。Linux在应用层利用ipchains( )来实现对包过滤的实现。可以用该函数实现过滤规则的添加、删除、设置、更改,在对包过滤规则进行设置的同时,还可以指定对数据包进行IP伪装。在Linux 内核中有三条内置的规则链(input chain, forward chain, output chain),分别对应接收检测,转发检测和发送检测(内置链不可删除),每一条chain 包含一系列过滤规则及链的缺省策略.利用各规则链可以对输入、转发、和输出的数据包进行过滤。
  其实现过程如下:
  *在不同检测点进入相应过滤链.
  *顺序检查每一条过滤规则,找出与之匹配的规则(ACCEPT, REJECT, DENY, MASQ,REDICT,RETURN).
  *当遇到第一条匹配的规则时采取以下行动:
  a. 将规则应用于此数据包;
  b. 每条规则都包含有packet和byte数的计数器,当匹配时,此计数器加
  c. 如果设置记录功能,则记录.
  *当没有规则匹配时,采用链的缺省策略.
  具体流程结合代码来说:
  三种内置规则链分别作用于对应的三个函数ip_rcv( )、ip_forward( )和ip_output( )。
  
  1、ip_rcv()是IP层的接收函数,由它来处理网卡接收到的数据包,它首先检查:
  a.长度是否正确;
  b..版本号是否正确(是IPV4还是IPV6?);
  c.校验和是否正确.
  在确定这些信息无误后,则调用包过滤检测:
  fwres = call_in_firewall(PF_INET, dev, iph, &rport, &skb);
  call_in_firewall 会对输入的数据包进行规则检查,fwres返回的便是匹配出来的规则.如果对应的规则为不接受该数据包,则立即将此数据包丢弃:
  if (fwres   goto drop;
  如果规则允许接受则查找路由表,对输入的数据包进行路由:
  ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)
  此时路由信息已包括在了skbuff数据结构的dst 项中,紧接着调用
  skb->dst->input(skb) 继续处理 .
  对发往本地高层协议的包,则调用ip_local_deliver(),进行处理。
  对转往其他主机的包,则实际调用ip_forward()处理。
  值得注意的是,经伪装的包在回来时,其目的IP是防火墙的IP,经路由后,也送入ip_local_deliver( )处理,在ip_local_deliver( )内部先解伪装,然后再查一次路由,发往本地的直接送往高层,,否则依然调用ip_forward( )。
  
  2、ip_forward( )用来处理发往其他主机的数据包,其函数流程为:
  1)、因为ip_forward()接收的参数是一个skbuff,它首先利用skbuff的指针,把IP头找出:
  iph = skb->nh.iph
  2)、因为ip_forward()由ip_rcv()调用,而在ip_rcv()中已查过了路由,此处只需利用skbuff的指针定位路由信息即可:
  struct rtable *rt; /* Route we use */
  rt = (struct rtable*)skb->dst;
  3)、如果此IP包的生存时间(ttl)已到,则丢弃.
  if (iph->ttl <= 1)
  goto too_many_hops;
  4)、如果在选项中指定了严格的源路由功能(strict source routing) ,且此处无法达到,也丢弃:
  if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
  goto sr_failed;
  5)、如果指定的伪装功能,且上层协议是ICMP,则在此处处理一部分,且跳过后面的包过滤处理
  #ifdef CONFIG_IP_MASQUERADE
  if(!(IPCB(skb)->flags&IPSKB_MASQUERADED)) {
  if (iph->protocol == IPPROTO_ICMP) {
  
  ........
  
  fw_res = ip_fw_masq_icmp(&skb, maddr);
  if (fw_res)
  /* ICMP matched - skip firewall */
  goto skip_call_fw_firewall;
  ........
  
  }
  }
  #endif
  6)、如果上一步的前提不成立,则要经过一次包过滤.
  fw_res=call_fw_firewall(PF_INET, dev2, iph, NULL, &skb);
  7)、在当前linux版本中,包过滤与伪装功能在许多地方是紧密联系在一起的,如采用同样的配置工具ipchains,同样的配置接口setsocketopt(),其中是否启动伪装的标志也在防火墙的chains中.
  8)、因为伪装可能改变了skbuff的一些信息,此时要重新定位一下IP头及其选项:
  iph = skb->nh.iph;
  opt = &(IPCB(skb)->opt);
  9)、因为转发的数据总是要送出的,紧接着会调用call_out_firewall(),并把数据送出去.
  
  3、在ip_local_deliver()中.
  1).如果需要,首先重组IP包:
  if (sysctl_ip_always_defrag == 0 &&
  (iph->frag_off & htons(IP_MF|IP_OFFSET))) {
  skb = ip_defrag(skb);
  if (!skb)
  return 0;
  iph = skb->nh.iph;
  2).然后调用ip_fw_demasquerade解开IP伪装。
  ret = ip_fw_demasquerade(&skb);
  3)、再次调用路由查找,根据真正的IP来发送此包.
  ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, skb->dev)
  4).根据路由发往上层或是转发(略).
  在对数据包进行处理的全部过程中,分别调用了以下三个函数:
  call_in_firewall(), call_fw_firewall()和 call_out_firewall()。察看这三个函数的具体实现发现,其核心过程都在于ip_fw_check() 这个函数,它完成了数据包与规则的实际匹配.
  
  ip_fw_check()函数分析:
  防火墙的规则链由ip_chain数据结构描述,其中包含了指向链中第一条规则的指针和链的缺省策略。规则链中的每条规则由ip_fwkernel数据结构描述。ip_fw_check()所做的就是将每一个ip包与规则链中的每一条规则(实际就是ip_fw数据结构所描述的内容)按照链表的组织顺序一一比较,若匹配则并返回规则的行动项。
  
  结束语
  以上简单的介绍了linux下实现包过滤的基本方法,希望对大家起到抛砖引玉的作用。
  
推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
author-avatar
处女同乡会同乡情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有