科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道linux防火墙实现技术比较(3)

linux防火墙实现技术比较(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

此文着重阐述linux下的防火墙的不同实现之间的区别,以ipchains, iptables, checkpoint FW1为例。

作者:51CTO.COM 2007年11月9日

关键字: Linux 防火墙 CheckPoint iptables ipchains

  • 评论
  • 分享微博
  • 分享邮件

  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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章