跳到主要内容

4. 服务器回复源地址选择

大多数 (即便不是全部) DNS 客户端都期望: 收到回复的地址与发出引出该回复的查询时所指向的地址是同一个地址. 对于为进行递归查询解析而充当客户端的服务器, 以及简单的解析器 (resolver) 客户端, 这一点都成立. 该地址连同回复中的标识符 (ID) 一起, 用于区分不同的回复, 并过滤掉虚假响应. 这在设计 DNS 时可能是有意为之, 也可能不是, 但如今已是既成事实.

某些运行 DNS 服务器的多宿主 (multi-homed) 主机会使用一个与客户端请求包中的目的地址不同的源地址来生成回复. 这类回复会被客户端丢弃, 因为回复的源地址与客户端发送原始请求时所指向的主机地址不匹配. 也就是说, 它看起来像是一个未经请求的响应.

4.1. UDP 源地址选择​

为避免这些问题, 服务器在使用 UDP 响应查询时, 必须使回复在发送时其 IP 头中的源地址字段被设置为: 包含引发该响应的查询的那个数据包的 IP 头中目的地址字段所含的地址. 如果这样做会导致响应从一个不允许用于此目的的 IP 地址发出, 那么响应可以从分配给该服务器的任意合法 IP 地址发出. 应当选择这样一个地址: 使客户端能够用它进行后续查询的可能性最大化. 如果服务器被配置成其并非所有地址都能从所有潜在客户端以同等程度可达, 那么在响应发送到任播 (anycast), 多播 (multicast) 或类似地址的查询时需要格外小心.

4.2. 端口号选择​

对所有查询的回复都必须发往发送该查询的那个端口. 当查询经由 TCP 接收时, 这是传输协议固有的一部分. 对于通过 UDP 接收的查询, 服务器必须记下源端口, 并在响应中将其用作目的端口. 回复应始终从它被发往的那个端口发出. 除特殊情况外, 这将是分配给 DNS 查询的众所周知端口 (well known port) [RFC1700].