type Action uint32
const (
// ActionBlock blocks a packet or session.
ActionBlock Action = 0x1001
// ActionPermit permits a packet or session.
ActionPermit Action = 0x1002
// ActionCalloutTerminating invokes a callout that must return a
应用程序可以通过系统库提供的API访问WFP。Microsoft有广泛的参考文档,因此我将通过fwpuclnt.dllinet.af/wf
的视角提供一个简介,这是我们开发的一个用于从Go与WFP交互的包。
要与WFP交互,您首先需要创建一个会话,通过该会话您将发送进一步的指令:
session, err := wf.New(&wf.SessionOptions{
Name: "my WFP session",
Dynamic: true,
})
WFP会话有几个选项,但最有趣的是会话是否应该是动态的。在动态会话中创建的过滤规则在创建会话的进程退出时会自动删除。如果您只想让规则在服务运行时存在,这非常方便。另一种选择是静态会话,允许您创建长期存在的规则,甚至可以在重新启动后无需进一步干预而保持存在。随着会话的打开,我们可以列出和创建防火墙规则。但在这之前,我们应该多看看包过滤框架是如何组织的。WFP通过一组层插入到Windows网络堆栈中。层是数据包处理流程中的检查点,是WFP可以查看数据包并对其作出判断的地方。每一层都有不同的信息提供,因此过滤规则需要根据特定层中的信息进行调整。例如,来自网络的 IPv4 UDP 数据包经过以下层:INBOUND_IPPACKET_V4
仅具有 IP 级信息(大致上包括 OSI 层 3),主要是源/目标地址和到达