当前位置:首页 > 系统教程 > 正文

Linux之netfilter基础介绍

欢迎来到Linux网络核心组件——netfilter的世界。对于初学者来说,netfilter是Linux内核中一个强大的数据包处理框架,它允许我们在内核协议栈的不同位置注册钩子函数,从而对网络数据包进行检查、修改、过滤或丢弃。简单来说,它就是Linux防火墙(如iptables)的底层基石。

在本文中,我们将介绍netfilter的基本概念、钩子点位置以及数据包的流向,帮助小白快速入门。这里会涉及几个核心关键词:netfilteriptables钩子函数数据包过滤,它们将贯穿整个教程。

Linux之netfilter基础介绍 netfilter  iptables 钩子函数 数据包过滤 第1张

1. 什么是netfilter?

netfilter是Linux内核2.4.x之后引入的一个通用框架,它提供了一套钩子(hooks)机制,允许内核模块在网络协议栈的关键路径上注册回调函数。每当数据包经过这些钩子点时,内核就会调用已注册的函数,从而实现数据包的过滤、网络地址转换(NAT)等功能。iptables正是基于netfilter实现的一个用户空间工具,用来配置netfilter规则。

2. netfilter的五大钩子点

在IPv4协议栈中,netfilter定义了五个关键的钩子点,它们分别对应数据包流经的不同阶段:

  • NF_IP_PRE_ROUTING:数据包进入网络层后,在路由决策之前触发。
  • NF_IP_LOCAL_IN:路由决策后,如果数据包是发往本机的,则在此触发。
  • NF_IP_FORWARD:路由决策后,如果数据包需要转发,则在此触发。
  • NF_IP_LOCAL_OUT:本机进程发出的数据包,在路由之前触发。
  • NF_IP_POST_ROUTING:数据包即将离开本机(无论是转发还是本地发出)之前触发。

这些钩子点就像数据包旅途中的检查站,注册在这里的钩子函数可以对数据包进行裁决,比如接受(ACCEPT)、丢弃(DROP)、修改(MANGLE)等。

3. 数据包流向示例

为了帮助理解,我们来看一个简单的场景:当外网数据包访问本机时,它会依次经过PRE_ROUTING钩子点(可能做DNAT)、路由决策(发现是发往本机),然后到达LOCAL_IN钩子点(这里可以进行数据包过滤)。如果本机作为路由器转发数据包,则经过PRE_ROUTING、路由决策、FORWARD钩子点、最后POST_ROUTING(可能做SNAT)发出。

4. netfilter与iptables的关系

很多朋友会混淆netfilteriptables。简单来说,netfilter是内核中的框架,而iptables是用户态的配置工具。iptables通过netlink socket与内核中的netfilter通信,将规则注入到各个钩子点。因此,学习netfilter是理解Linux防火墙底层原理的必经之路。

本文是netfilter系列的第一篇,后续我们将深入探讨如何编写内核模块注册钩子函数,以及如何与iptables交互。希望本文能帮助你建立对netfilter的基本认识。