我正在使用套接字 API 在 C 中编写一个内容过滤器,它将拦截 DNS 请求,并且仅在允许域时才返回响应。描述这个的伪代码是:
- 将所有 DNS 查询重定向到正在侦听 UDP 端口 X 的内容过滤程序。
- 内容过滤程序提取正在查询的域并确定是否允许。
- 如果允许,则内容过滤程序将原始 DNS 请求包转发给原始目标 DNS 服务器,同时保持原始源和 IP+端口,以便 DNS 服务器可以将回复直接发送回客户端。
- 如果不允许该域,则不发送任何回复。
我目前有程序在 UDP 端口 X 上侦听,但问题是我无法访问 IP 标头,因此无法在保留原始标头的同时将 DNS 请求简单地转发到原始服务器。
我尝试过使用socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
,但它没有绑定到端口 X(可以理解),并且没有收到任何流量。
在 UDP 端口 X 上侦听,同时仍然能够访问传入数据包的 IP 标头的最佳方法是什么?