一、简述
Netfilter是Linux内核中的一个软件框架,用于管理网络数据包。不仅具有网络地址转换(NAT)的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。利用运作于用户空间的应用软件,如iptables等,来控制Netfilter,系统管理者可以管理通过Linux操作系统的各种网络数据包。1990年代,Netfilter在Linux 2.3.15版时进入Linux内核,正式应用于Linux 2.4版。
现今许多市面上许多的IP分享器或无线网络路由器(Wireless router),多是嵌入式Linux平台,并利用Netfilter的数据包处理能力,提供NAT以及防火墙的功能。此外,Netfilter平台的模块化设计使得功能具可扩展性,以及Linux核心本身属于开放的源代码,能够免费获取源代码进行修改与扩展。Netfilter平台中制定了五个数据包的挂载点(Hook),分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD与POST_ROUTING。
二、原理
Linux网络内核中存在5条内置chain,针对于每条chain,Netfilter都有与之对应的hook,他们的对应关系如下所示(左为chain,右为hook):
PREROUTING
:由NF_IP_PRE_ROUTING
触发;INPUT
:由NF_IP_LOCAL_IN
触发;FORWARD
:由NF_IP_FORWARD
触发;OUTPUT
:由NF_IP_LOCAL_OUT
触发;POSTROUTING
:由NF_IP_POST_ROUTING
触发;
Netfilter通过在内核中嵌入的这五个NF_HOOK函数的位置上注册相关函数,截断数据包的流动,从而完成对数据包的过滤和转换。