1

我正在使用套接字 API 在 C 中编写一个内容过滤器,它将拦截 DNS 请求,并且仅在允许域时才返回响应。描述这个的伪代码是:

  1. 将所有 DNS 查询重定向到正在侦听 UDP 端口 X 的内容过滤程序。
  2. 内容过滤程序提取正在查询的域并确定是否允许。
  3. 如果允许,则内容过滤程序将原始 DNS 请求包转发给原始目标 DNS 服务器,同时保持原始源和 IP+端口,以便 DNS 服务器可以将回复直接发送回客户端。
  4. 如果不允许该域,则不发送任何回复。

我目前有程序在 UDP 端口 X 上侦听,但问题是我无法访问 IP 标头,因此无法在保留原始标头的同时将 DNS 请求简单地转发到原始服务器。

我尝试过使用socket(AF_INET, SOCK_RAW, IPPROTO_UDP),但它没有绑定到端口 X(可以理解),并且没有收到任何流量。

在 UDP 端口 X 上侦听,同时仍然能够访问传入数据包的 IP 标头的最佳方法是什么?

4

2 回答 2

1

我认为 UDP 套接字上的 recvfrom 应该给你正确的源地址。您可能仍然需要一个原始套接字来转发消息。

于 2012-10-16T22:27:34.777 回答
0

基于 SOCK_RAW 的套接字的功能取决于您所在的平台。通常,当您想要访问完整的 IP 数据报信息时,我建议使用伯克利包过滤器来挖掘寻址到感兴趣的 UDP 端口的数据链路层帧。

于 2012-10-16T23:11:38.907 回答