在C中构建DNS代理

我想在C中构建一个简单的DNS代理,它接受来自UDP端口53的DNS查询,将查询转发到谷歌的DNS服务器TCP端口53进行查找,然后返回谷歌提供的答案。

是的,这是一个学校项目,我很困惑,我不知道从哪里开始。

谢谢你的帮助!!

你很满意这些要求 – 因为你要从UDP – > TCP,它实际上比做UDP – > UDP简单得多。

具体来说,我的意思是因为面向外的一侧使用面向连接的套接字,所以您立即知道您收到的响应必须与您刚刚发送的查询有关,只要您为每个查询使用新的TCP套接字即可。

如果面向外的一侧是UDP,那么找出每个响应与哪个查询相关就变得困难得多 – 在协议中不能保证响应以与查询相同的顺序到达。

如果不需要multithreading,则(伪代码)

"open" a UDP socket "bind" that socket to port 53 while (true) { "recvfrom" a packet from the UDP socket ... and remember the address it was received from "open" a TCP socket "connect" it to Google's DNS "write" the length of the original query (two bytes, network order - RFC 1035) "write" the contents of the original query "read" a two byte length header "read" that many bytes from the TCP socket "close" the TCP socket "sendto" those bytes back over the UDP socket to the original client address } 

首先,您需要选择一个API来将消息写入网络。 对于Windows,您有Winsock API 。 对于类Unix系统,您有BSD套接字API 。
虽然大多数课程都使用BSD API。

现在您的步骤可能是:

  • 看看rfc的DNS实现。 您只能关注请求和响应消息的格式,因为您可能需要更改某些字段。
  • 现在编写一个客户端服务器代码,它包含两个模块:
    • 服务器端代码接收DNS查询请求,可能需要更改一些字段。
    • 将其传递给与Google的DNS服务器交互的模块。
    • 捕获响应并将其转发回请求客户端。 (再次你可能需要改变一些字段)