欢迎来到学术参考网

Linux下基于iptables 防火墙的设计实现

发布时间:2015-06-23 09:25

  1 引言

  随着网络技术的发展, 人们的生活已经和网络密不可分, 网络的安全问题也就自然成为人们关注的焦点, 防火墙作为一种最为有效地网络安全产品得到了广泛的应用。Linux 操作系统性能优异、功能强大, 现在已经拥有大量的用户。

  2 防火墙的结构与功能分析

  防火墙系统网络结构,防火墙就是内部网络与外部网络之间的一道安全防护系统。 通过对经过的网络数据包的扫描与分析, 过滤掉一些网络攻击并阻止非授权用户访问内部网络。 从而大大提高内部网络的安全(见图1)。

  (图1) 中的防火墙就是采用了Netfilter iptables机制的Linux服务器, 服务器配置有两块网卡, 其中一块连接到外网, 另一块与交换机(集线器)相连。这样内部的多台主机就可以通过交换机(集线器)访问外网。

  3 防火墙系统实现

  3.1 Netfilter架构原理

  Netfilter通过5个钩子函数,就可以实现内核防火墙的基本框架了,NF_ IP_PRE_ROUTI NG表示从网卡进入系统的数据包首先到达的挂载点。此时数据包需要进行完版本号,校验和等检测。之后他们会进入一个路由模块,路由模块决定此数据包是要被转发给另一块网卡接口还是要被发给本机用户进程。NF_ IP_LOCAL_ I N表示如果数据包的目的地是本机,那么它将被注册了的钩子函数处理以后再传给上层协议,对于所有进入本机的数据包 (包括使用网络套接字的IPC),都是在此挂载点完成的过滤工作之后再被交给上层用户进程。挂载点 NF_ IP_FORWARD表示所有经过本机转发的数据包的途经地,针对转发数据包的过滤工作可以在此进行。挂载点NF_ IP_POST_ROUTI NG表示数据包通过本机网卡接口发送到网络上之前的最后一个挂载点。挂载点表示NF_ IP_LOCAL_OUT是所有本机进程发出的数据包的必经之路。在图中可看到数据包通过此挂载点之后会进入一个路由模块以决定它是被发往外部网络还是发给本机其他进程。

  IP层在数据包处理过程中,会检查相应的钩子函数在链表中是否有钩子函数注册,如果注册了该钩子函数则监听 IP数据包,调用该钩子函数,并根据钩子函数返回的结果决定下一步的动作。

  3.2 Netfilter的实现模拟仿真

  下面是构建模拟内核防火墙仿真环境平台 ,目前在操作系统 Fedora Core release 4

  #ifndef _KERNEL_

  #define _KERNEL_

  #endif

  #ifndefMODULE

  #defineMODULE

  #endif

  #include < linux/module . h >

  #include < linux/ sched . h >

  #include < linux/kernel . h >

  #include < linux/netdevice . h >

  #include < linux/ i p. h >

  #include < linux/ tcp. h >

  #include < linux/ skbuff . h >

  #include < linux/p r oc_fs . h >

  #include < linux/ if . h >

  #include < linux/ in . h >

  #include < linux/netfilter_ipv4. h >

  /*定义钩子函数*/

  static unsigned int kill_port (unsigned int hooknum, struct sk_buff * skb, const struct net_device * in, const struct net_device 3 out, int (* okfn) ( struct sk_buff * ) )

  {

  struct tcphdr * tcph;

  struct iphdr * iph;

  iph=(*skb) -> ;

  /*解析 ip和 tcp协议栈*/

  if ( iph->protocol == IPPROTO_TCP)

  {

  tcph=(* skb) -> ;

  if (ntohs( tcph->source)==23)

  {

  printk ("" nftp service refused"" ) ;

  return NF_DROP;

  }

  }

  return NF_ACCEPT;

  }

  /*该结构完整定义在 include / linux/netfilter . h里面* /

  Struct nf_hook_op skill = {

  . hook = kill_port,

  . owner = TH IS_MODULE,

  . pf = PF_ I NET,

  . hooknum = NF_ IP_LOCAL_OUT,

  . priority = NF_ IP_PR I_FI LTER,

  };

  /*模块的初始化*/

  int init_module () {

  /*Hook钩子函数的注册函数*/

  nf_register_hook (&kill) ;

  return 0;

  }

  /*模块的清除*/

  void cleanup_module () {

  /*销毁钩子函数* /

  nf_unregister_hook (&kill) ;

  }

  编写 Makefile文件:

  obj - m + = netf . o

  编译模块:

  make2 C /usr / src /kernels/2.6.112 1.1369 _ FC42i686 / S UBD I RS =MY MPWD modules

  编译的时候一定是以 root身份进行编译。

  测试模块:

  首先以 root用执行命令: ins mod . /动态加载该模块 ,假设 Linux系统的 IP地址是 192.168.0.191。telnet 192.168.0.191则会出现“正在连接到 192.168.0.191 . . . 不能打开到主机的连接 , 在端口23: 连接失败”的提示 ,如果利用rmmod 命令就删除该内核 ,则就可以从本地 telnet到Linux系统上。另外 ,可以利用命令 lsmod查看该模块是否加载到内核里面去,同时可以执行命令dmesg tail查看该模块加载的信息。

  4结束语

  利用Linux操作系统下的iptables编写功能强大的防火墙,iptables全新的Netfilter架构采用可加载的模块化结构,可以动态扩展系统功能。同时iptables提供动态NAT、基于MAC以及用户的过滤和状态过滤等全新的包过滤方法。iptables是Linux系统下面功能非常全面和强大的防火墙。

  参考文献:

  [1] 阎慧,防火墙原理与技术[M ]。北京:机械工业出版社, 2004。

  [2] 王则林, 王彬, 陆建德。 基于Linux内核的防火墙技术分析与进一步开发[J]。科技信息, 2006 (10) : 17219 。

上一篇:Java的发展前景与就业方向探讨

下一篇:LTE室内局部覆盖技术