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

linux防火墙实现技术比较

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

  阐述linux下的防火墙的不同实现之间的区别,以ipchains, iptables, checkpoint FW1为例。
  二 基本概念
  2.0
  在进入正题之前,我将花少许篇幅阐述一些基本概念。尽管防火墙的术语这些年基本上没有太大的变化,但是如果你以前只看过90年代初的一些文献的话,有些概念仍然会让你混淆。此处只列出一些最实用的,它们不是准确的定义,我只是尽可能的让它们便于理解而已。
  2.1 包过滤:
  防火墙的一类。80年代便有论文来描述这种系统。传统的包过滤功能在路由器上常可看到,而专门的防火墙系统一般在此之上加了功能的扩展,如状态检测等。它通过检查单个包的地址,协议,端口等信息来决定是否允许此数据包通过。
  2.2 代理:
  防火墙的一类。工作在应用层,特点是两次连接(browser与proxy之间,proxy与web server之间)。如果对原理尚有疑惑,建议用sniffer抓一下包。代理不在此文的讨论范围之内。
  2.3 状态检测:
  又称动态包过滤,是在传统包过滤上的功能扩展,最早由checkpoint提出。传统的包过滤在遇到利用动态端口的协议时会发生困难,如ftp。你事先无法知道哪些端口需要打开,而如果采用原始的静态包过滤,又希望用到的此服务的话,就需要实现将所有可能用到的端口打开,而这往往是个非常大的范围,会给安全带来不必要的隐患。 而状态检测通过检查应用程序信息(如ftp的PORT和PASS命令),来判断此端口是否允许需要临时打开,而当传输结束时,端口又马上恢复为关闭状态。
  2.4 DMZ非军事化区:
  为了配置管理方便,内部网中需要向外提供服务的服务器往往放在一个单独的网段,这个网段便是非军事化区。防火墙一般配备三块网卡,在配置时一般分别分别连接内部网,internet和DMZ。
  2.5
  由于防火墙地理位置的优越(往往处于网络的关键出口上),防火墙一般附加了NAT,地址伪装和VPN等功能,这些不在本文的讨论范围。
  三 检测点
  3.0 综述
  包过滤需要检查IP包,因此它工作在网络层,截获IP包,并与用户定义的规则做比较。
  3.1 ipchains
  摘自【3】
   
  总体来说,分为输入检测,输出检测和转发检测。但具体到代码的时候,输出检测实际分散到了几处(不同的上层协议走IP层的不同的流程):
  UDP/RAW/ICMP报文:ip_build_xmit
  TCP报文:ip_queue_xmit
  转发的包:ip_forward
  其它:ip_build_and_send_pkt
  正如ipchains项目的负责人Rusty Russell所说,在开始ipchians不久,便发现选择的检测点位置错了,最终只能暂时将错就错。一个明显的问题是转发的包在此结构中必须经过三条链的匹配。地址伪装功能与防火墙模块牵扯过于紧密,如果不详细了解其原理的话,配置规则很容易出错。
  此部分详细的分析可参见我早期的一份文章【9】。
  3.2 iptables
  
  2.4内核中的防火墙系统不是2.2的简单增强,而是一次完全的重写,在结构上发生了非常大的变化。相比2.2的内核,2.4的检测点变为了五个。
  在每个检测点上登记了需要处理的函数(通过nf_register_hook()保存在全局变量nf_hooks中),当到达此检测点的时候,实现登记的函数按照一定的优先级来执行。严格的从概念上将,netfilter便是这么一个框架,你可以在适当的位置上登记一些你需要的处理函数,正式代码中已经登记了许多处理函数(在代码中搜nf_register_hook的调用),如在NF_IP_FORWARD点上登记了装发的包过滤功能。你也可以登记自己的处理函数,具体例子可参看【8】与【10】。
  3.3 FW1
  FW1是chekpoint推出的用于2.2内核的防火墙。由于其发布的模组文件带了大量的调试信息,可以从反汇编的代码中窥探到到许多实现细节。
  FW1通过dev_add_pack的办法加载输入过滤函数,如果对这个函数不熟悉,请参看【14】。但是此处有个问题:在net_bh()中,传往网络层的skbuff是克隆的,即
  skb2=skb_clone(skb, GFP_ATOMIC);
  if(skb2)
  pt_prev->func(skb2, skb->dev, pt_prev);
  这样的话如果你想丢弃此包的话,光将其free掉是不够的,因为它只是其中的一份拷贝而已。
  FW1是怎么解决这个问题的呢?见下面的代码(从汇编代码翻译成的C程序):
  packet_type *fw_type_list=NULL;
  
  static struct packet_type fw_ip_packet_type =
  {
  __constant_htons(ETH_P_IP),
  NULL, /* All devices */
  fw_filterin,
  NULL,
  NULL, /* next */
  };
  
  fwinstallin(int isinstall )
  {
  packet_type *temp;
  
  /*安装*/
  if(isinstall==0){
  dev_add_pack(&fw_ip_packet_type);
  fw_type_list = fw_ip_packet_type->next;
  
  for(temp = fw_type_list; temp; temp=temp->temp)
  dev_remove_pack(temp);
  }
  /*卸载*/
  else {
  dev_remove_pack(&fw_ip_packet_type);
  
  for(temp = fw_ip_packet_type; temp; temp=temp->next)
  dev_add_pack(temp);
  }
  }
  不难看出,FW1把ip_packet_type歇载掉了,然后自己在自己的处理函数(fw_filterin)中调ip_recv。
  输出的挂载和lkm的手法一样,更改dev->hard_start_xmit。dev结构在2.2版本的发展过程中变了一次,为了兼容FW1对这点也做了处理(通过检查版本号来取偏移)。
  还有一款linux下的防火墙产品WebGuard(http://www.gennet.com.tw/b5/csub_webguard.html)采用的手法与FW1其非常类似。有兴趣的人可以自行研究一下。
  四 规则
  4.0 综述
  4.1 ipchains
  man ipfw可以看到这一段的详细解释。关键数据结构如下:
  规则链用ip_chain结构来表示,缺省有input,ouptput,forward三条链。在配置规则的时候,也可以添加新的链。每条链事实上就是一组相关的规则,以链表的形式存储。
  struct ip_chain
  {
  ip_chainlabel label; /* Defines the label for each block */
  struct ip_chain *next; /* Pointer to next block */
  struct ip_fwkernel *chain; /* Pointer to first rule in block */
  __u32 refcount; /* Number of refernces to block */
  int policy; /* Default rule for chain. Only *
  * used in built in chains */
  struct ip_reent reent[0]; /* Actually several of these */
  };
  每条规则用一个ip_fwkernel结构表示:
  struct ip_fwkernel
  {
  struct ip_fw ipfw;
  struct ip_fwkernel *next; /* where to go next if current
  * rule doesn't match */
  struct ip_chain *branch; /* which branch to jump to if
  * current rule matches */
  int simplebranch; /* Use this if branch == NULL */
  struct ip_counters counters[0]; /* Actually several of these */
  };
  ip_fwkernel中的一个重要部分就是ip_fw,用来表示待匹配的数据包消息:
  struct ip_fw
  {
  struct in_addr fw_src, fw_dst; /* Source and destination IP addr */
  struct in_addr fw_smsk, fw_dmsk; /* Mask for src and dest IP addr */
  __u32 fw_mark; /* ID to stamp on packet */
  __u16 fw_proto; /* Protocol, 0 = ANY */
  __u16 fw_flg; /* Flags word */
  __u16 fw_invflg; /* Inverse flags */
  __u16 fw_spts[2]; /* Source port range. */
  __u16 fw_dpts[2]; /* Destination port range. */
  __u16 fw_redirpt; /* Port to redirect to. */
  __u16 fw_outputsize; /* Max amount to output to
  NETLINK */
  char fw_vianame[IFNAMSIZ]; /* name of interface "via" */
  __u8 fw_tosand, fw_tosxor; /* Revised packet priority */
  };
  2.2内核中网络包与规则的实际匹配在ip_fw_check中进行。
  4.2 iptables
  一条规则分为三部分:
  struct ipt_entry file://主要用来匹配IP头
  struct ip_match file://额外的匹配(tcp头,mac地址等)
  struct ip_target file://除缺省的动作外(如ACCEPT,DROP),可以增加新的(如REJECT)。
  man iptable:
  >A firewall rule specifies criteria for a packet, and a
  >target. If the packet does not match, the next rule in
  >the chain is the examined; if it does match, then the next
  >rule is specified by the value of the target, which can be
  >the name of a user-defined chain, or one of the special
  >values ACCEPT, DROP, QUEUE, or RETURN.
  2.4内核中网络包与规则的实际匹配在ip_do_table中进行。这段代码的流程在
  netfilter hacking howto 4.1.3描述的非常清楚。
  
  简化代码如下:
  /* Returns one of the generic firewall policies, like NF_ACCEPT. */
  unsigned int
  ipt_do_table(struct sk_buff **pskb,
  unsigned int hook,
  const struct net_device *in,
  const struct net_device *out,
  struct ipt_table *table,
  void *userdata)
  {
  struct ipt_entry *e;
  struct ipt_entry_target *t;
  unsigned int verdict = NF_DROP;
  
  table_base = (void *)table->priva
推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Linux防火墙配置—允许转发
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
  • 问题描述:域名已经备案,我全部都有,也在后台配置了,但是手机预览,还是请求失败,PC端是可以请求 ... [详细]
  • Ansem 最新雄文:软着陆后,加密市场下阶段趋势与核心叙事
    市场最糟糕的时候已经过去,以太坊合并前不太会看到新的低点;但仍需来自关注宏观市场的不确定风险。撰文:Ansem ... [详细]
  • linux6.5 配置邮件服务,centos 6.5服务器搭建邮件服务postfix和dovecot
    centos6.5搭建邮件服务postfix和dovecot------------------------------------------------安装DNS指定邮件交换记 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
author-avatar
nlyyan_613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有