我在 Windows 上实现了一个 DNS 中继程序。
我每条命令都会收到 3 个 DNS 查询nslookup
,PTR、A 和 AAAA。
我首先回复 type=A 查询,然后在几微秒后回复 PTR/AAAA 查询。
但我遇到了超时nslookup
,发现本地主机收到了每个 A 和 AAAA 响应,但 PTR 响应出现了 ICMPPort unreachable
错误。
我想知道为什么会发生这种情况?
答案1
地址(A 和 AAAA)请求与 PTR 记录请求是分开的。除非您有地址,否则您无法请求 PTR 记录。
对于典型的 SMTP 反向 DNS 验证查找 IP,192.0.2.8
过程如下:
- 将 IP 地址转换为查找格式。
- 查找 的 PTR
8.2.0.192.in-addr.arpa
。 - 收到带名称的 PTR
smtp.example.org
- 查找地址
smtp.example.org
- 接收地址
192.0.2.8
由于需要查找子网(例如,2.0.192.in-addr.arpa
找到子网的名称服务器),因此 IP 地址在查找时是反向的。
部分子网的委派是使用 CNAME 记录完成的。
答案2
您使用的是 UDP、TCP 还是两者兼有?使用 UDP 时,您是否使用与原始查询源相同的 UDP 端口号作为目标端口?(换句话说:当 UDP 查询从 IP 地址 abcd 端口 X 进入您的 IP 地址和端口 53 时,答案应从您的端口 53 发送到 abcd 的端口 X。)
DNS 可以同时使用 TCP 和 UDP:通常首先使用 UDP,因为它速度最快,但如果答案无法容纳在单个 UDP 数据包中,则服务器会尽可能多地放入答案,并添加一个标志,告诉客户端“这是第一部分;如果您需要更多,请通过 TCP 再次询问以获得完整答案”。