![HTTP get 方法是否依赖端口 53 进行 DNS 解析?](https://linux22.com/image/647679/HTTP%20get%20%E6%96%B9%E6%B3%95%E6%98%AF%E5%90%A6%E4%BE%9D%E8%B5%96%E7%AB%AF%E5%8F%A3%2053%20%E8%BF%9B%E8%A1%8C%20DNS%20%E8%A7%A3%E6%9E%90%EF%BC%9F.png)
我在阅读有关 DNS 工作原理的文章时偶然发现了这问题和答案。
根据接受的答案第二步,DNS与ISP服务器进行通信,获取主机名的IP地址。
DNS:“好的……等一下,我会询问 ISP 服务器。好的,看起来像是 157.166.226.25。”
我偶然读到这个答案也就是说,
客户端运行浏览器,使用 UDP 协议向 DNS 服务器请求 A 记录
www.pippo.it
在客户端上,操作系统负责解析部分并与浏览器对话,浏览器从不直接与 DNS 对话,而是通过操作系统调用,
gethostbyname()
在 Linux 上,解析优先级由以下方式定义:/etc/nsswitch.conf
那么,如果我使用防火墙规则阻止计算机中到端口 53 的所有出站流量,是否意味着我根本无法解析任何主机名?
我认为情况不应该如此,这就是为什么我们有/etc/nsswitch.conf
文件(在 Linux 机器上,尽管其他操作系统也可能存在类似的概念)。该文件了解hosts
使用主机名和数字的数据库gethostbyname()
以及相关功能。
有人可以澄清我的理解是否正确或者我误解了吗?
答案1
关于 HTTP,需要记住的是,浏览器和 Web 服务器之间的所有通信都是通过 TCP 进行的,而 TCP 使用 IP 地址。正如您所说,名称解析首先发生,因为没有 IP 地址,就无法进行通信。
因此,互联网可以正常工作,您甚至可以访问没有 DNS 的网站,即使您的文件中没有名称hosts
,只要您知道 IP 地址。
现在,稍微反驳一下我刚才所说的,由于您的问题是关于 HTTP 的,事实是,如果您尝试直接通过 IP 地址访问某些网站,它们将无法运行。
这可能有很多原因,但最常见的原因之一是 Web 服务器实际上在单个 IP 上托管许多不同的网站,然后根据请求的主机名区分对这些网站的请求。
这是通过添加标头作为 HTTP 请求的一部分完成的Host:
。浏览器在请求期间使用您在地址栏中提供的名称来填充此标头,但严格来说,这与 DNS 无关。
通过 IP 浏览可能出现问题的另一种方式是使用 HTTPS 网站,因为证书是颁发给某些主机名的。这不会阻止它们工作,但由于名称不匹配,浏览器无法验证证书,您会收到警告。
答案2
严格来说,主机名解析过程超出了 HTTP 规范的范围。但在实践中,它几乎总是使用 UDP 端口 53 上的 DNS 来完成。
在特殊情况下,可以使用备用名称解析机制:
- Windows 客户端将检查本地
Hosts
文件,然后检查 DNS,然后执行 NetBIOS 名称解析。 - OX X 客户端还将使用多播 DNS(UDP 端口 5353)来解析
.local
地址。 - Linux / Unix 系统将使用
/etc/nsswitch.conf
来确定主机名解析顺序。替代机制包括LDAP和 NIS。
系统管理员经常选择在防火墙处阻止 DNS,以强制组织内的所有客户端使用本地 DNS 服务器。这有助于控制 DNS 缓存中毒攻击的风险。
答案3
nsswitch 的默认设置将首先查找 /etc/hosts(文件),然后尝试 dns。因此,如果主机在 /etc/hosts 中列出,并且您阻止端口 53 udp/tcp,那么它仍将获取正确的 ip 并正常工作。如果主机不在 /etc/hosts 中,您将无法获取 IP
答案4
HTTP 客户端按说在建立连接时使用 DNS 转发查询,但不一定,因为可以使用 HTTP 代理。它将解析服务器名称委托给代理(代理可以依次查询另一个代理。等等)。我曾经读到(虽然没有看到)古老的 LAN 协议允许浏览器完全不使用 TCP 即可运行。
此外,如果应用程序调用gethostbyname()
或类似调用,那么它可能会导致出站数据包,但不一定,因为这是特定操作系统及其设置中的 DNS 实现问题。gethostbyname()
不会导致出站流量的情况之一是本地运行的 (127.0.0.1) DNS 服务器由于某种原因已经缓存了所需的所有 DNS 记录。