我的服务器pf.conf
文件包含以下行(以及其他协议的行):
block in proto udp all
pass out proto udp all
现在该服务器需要通过UDP广播检查一些邻居机器的状态:
- 它在任意地址上打开一个 UDP 套接字;操作系统为其分配一个端口
- 它使用此套接字向明确定义的端口发送广播 UDP 消息
- 同一网络中的主机使用单播或广播回复此消息,回复到服务器使用的同一端口
- 服务器记录这些响应,并能判断是否有任何相邻的机器发生故障
举个例子:
- 我的服务器 192.168.1.1 发送一个 UDP 数据包
192.168.1.1:52361 -> 192.168.1.255:4545
- 主机 192.168.1.3 回复
192.168.1.3:4545 -> 192.168.1.1:52361
- 主机 192.168.1.4 回复
192.168.1.4:37243 -> 192.168.1.1:52361
- 主机 192.168.1.5 回复
192.168.1.5:4545 -> 255.255.255.255:52361
- 服务器注册 192.168.1.{3,4,5} 已启动并正在运行。
现在的问题是 PF 阻止我的应用程序接收这些响应。Tcpdump 显示响应正在流入,但应用程序没有收到任何内容。如果我禁用 pf,我会得到我期望的响应。
我可以添加什么来pf.conf
获取答复?
由于请求(
192.168.1.1
、192.168.1.255
)和后续响应(192.168.1.*
、255.255.255.255
)中的 src IP 和 dst IP 不同,因此为请求保留的状态不足以允许传入响应。您可以允许所有来自所需源端口的传入数据包到达广播地址(例如
52361
):您还可以允许对接口的广播地址进行响应(例如
eth0
):