在C中构建DNS代理

时间:2010-11-18 07:42:22

标签: c dns

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

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

感谢您的帮助!!

2 个答案:

答案 0 :(得分:3)

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

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

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

如果不需要多线程,那么(在伪代码中)

"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
}

答案 1 :(得分:2)

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

现在您的步骤可能是:

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