防火墙实现基础:Netfilter机制
Netfilter
机制的核心是一个开放式的IP数据包处理框架,对外提供了处理IP数据包的统一接口,编程人员可以利用该接口实现对IP数据包的控制和其他新的处理方式
1.Netfilter机制的运行原理
核心思想:在网络IP协议层的IP数据包处理流程中,总结出几个关键点(即钩子点),提供了多种可能的IP数据包处理方式和开放接口。安全管理员不仅可以配置Netfilter以不同的处理方式处理IP数据包,也可以利用Netfilter所提供的开放接口在IP数据包的协议处理流程中实现新的IP数据包处理方式
在Netfilter机制中有五个钩子点:
IP_PRE_ROUTING
:ip数据包刚刚从网络接口接收到IP_FORWARD
:ip数据包已经进行了路由处理,需要转发到下一跳但还没有进行转发IP_LOCAL_IN
:从网络接收的需要发往本机的数据包IP_LOCAL_OUT
:刚刚从本机发出还未进行路由处理的ip数据包IP_POST_ROUTING
:ip数据包将要离开本机发往下一跳之前
2.Netfilter功能种类
Netfilter在这些钩子点上所支持的不同报文处理方式可以分为两种:
1.内嵌处理方式:不用自己编写程序,通过配置Netfilter就可以实现相应的报文处理方式
- 报文过滤方式
- 报文重定向
2.开放处理方式:在Netfilter基础上自己开发新的报文处理,Netfilter将数据包的处理权交给新开发的报文处理 - 钩子函数方式:在流过某钩子点时,注册在该钩子点的钩子函数将会被调用
- 内核模块可以在这些钩子点上注册钩子函数,将自定义的IP数据包处理函数挂接在相应的钩子上。
- 当数据包经过Netfilter框架的某个钩子点时,内核会检测是否有内核模块对该钩子点进行了钩子函数注册。如果有注册,就调用相应的钩子函数,从而有机会检查和修改数据包,并返回处理结果给Netfilter框架。
- Netfilter根据钩子函数的返回结果来处理IP数据包,如丢弃数据包或按常规处理数据包。
- 多个内核模块可以在同一个钩子点注册它们的钩子函数,Netfilter会按照优先级调用这些钩子函数。
- 队列输出方式:钩子函数方式需要进行复杂的Linux内核编程,对于安全管理员来说具有挑战性。
- Netfilter提供了队列输出功能,使得经过的IP数据包可以直接交给应用层处理。
- 安全管理员可以在应用层开发应用软件,对数据包进行自主处理,如丢弃或修改。
- 处理后的数据包可以再通过Netfilter的队列输出功能发送给IP协议层进行后续协议处理。