1. 概述
ipfw是BSD系统中重要的防火墙和通信控制工具,防火墙和NAT都可以通过ipfw的相关指令来实现。
pf (包过滤Packet Filter) 是FreeBSD 系统上进行TCP/IP流量过滤和网络地址转换的软件系统。 PF 同样也能提供TCP/IP流量的整形和控制,并且提供带宽控制和数据包优先集控制。
本文不讲解pf和ipfw命令的用法,通过阅读FreeBSD内核协议栈源码,通过pf和ipfw探讨FreeBSD的防火墙实现原理
2. FreeBSD协议栈包过滤处理流程
熟悉Linux协议栈的朋友都知道,Linux的包过滤是通过Netfilter实现的,Netfilter在5个关键节点巧妙的挂在了钩子,可以改变报文行为。
FreeBSD也有Netfilter的基本机制pfil,也有比Netfilter功能更强大的NetGraph,本文主要讲解pfil,NetGraph后续会进行阐述。
FreeBSD协议栈IP报文收发包处理流程参考上图,一个数据包在几个内核变量的控制下,在协议栈的多个地方被防火墙检查。这些地方和变量如上图所示,记住包过滤的关键流程,对于理解和规划FreeBSD防火墙是很有帮助的。
在网卡注册设备时,会将ether_input和ether_input函数挂在ifnet数据结构上,网卡中断会调用ether_input函数,接下来会分别被ether_demux和ip_input处理,如果是需要转发的报文,会调用ip_tryforward、ip_output、ether_output_frame,最后调用ehter_output将报文发送至网卡。
对input方向的报文,在ether_demux和ip_input会调用pf和ipfw挂载的钩子函数,处理报文,处理的结果可以是