Skip to content

Instantly share code, notes, and snippets.

@Yuki-J1
Yuki-J1 / 类翻译.md
Created April 17, 2023 03:07
类翻译

Action

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
@Yuki-J1
Yuki-J1 / Programming the Windows firewall—官方教程翻译.md
Last active April 17, 2023 03:06
Programming the Windows firewall—官方教程翻译

应用程序可以通过系统库提供的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 数据包经过以下层:image.pngINBOUND_IPPACKET_V4仅具有 IP 级信息(大致上包括 OSI 层 3),主要是源/目标地址和到达