我正在阅读有关DNS如何工作的一般情况,我偶然发现了这个问题和答案。
根据接受的答案 ,第二步是当DNS与主机名IP地址的ISP服务器通信时。
DNS:“等一下,我会问ISP服务器,好像是157.166.226.25。”
我碰巧读到这个答案 ,
运行浏览器的CLIENT请求使用UDP协议的DNS服务器logging
www.pippo.it在客户端是做parsing部分的操作系统和浏览器交谈,浏览器从不直接与DNS通话,而是通过调用
gethostbyname()
在Linux上,parsing优先级由/etc/nsswitch.conf定义
因此,如果我使用防火墙规则将所有出站stream量阻塞到端口53,那么这是否意味着我无法parsing任何主机名?
我认为不应该是这样,为什么我们有/etc/nsswitch.conf文件(在Linux机器上,尽pipe其他操作系统也可能有类似的概念)。 该文件理解主机名和数字由gethostbyname()和相关函数使用的hosts数据库。
有人能否澄清我的理解是正确的还是误解?
关于HTTP需要记住的一点是,浏览器和Web服务器之间的所有通信都是通过使用IP地址的TCP进行的。 如您所说,名称parsing首先发生,因为没有IP地址,就不能进行通信。
因此,互联网工作正常,甚至可以访问没有DNS的网站,即使您的hosts文件中没有名称,只要知道IP地址即可。
现在,与我刚才所说的有点矛盾,因为你的问题是关于HTTP的,所以事实是,如果你试图直接通过IP地址来访问它们,一些网站将无法工作。
这可能有很多原因,但其中最常见的一种情况是,Web服务器实际上在单个IP上托pipe了许多不同的网站,然后根据请求的主机名将请求区分到这些站点。
这是作为HTTP请求的一部分通过添加Host:标头完成的。 浏览器使用您在地址栏中提供的名称在请求期间填写此标头,但严格来说,这与DNS无关。
通过IP浏览的另一种方式可能会造成问题,因为证书是发给某些主机名的。 这不会阻止他们的工作,但由于名称不匹配,证书不能被浏览器validation,您将收到警告。
严格来说,主机名parsing过程超出了HTTP规范的范围。 但实际上,几乎总是通过UDP端口53使用DNS。
在特殊情况下,可以使用其他名称parsing机制:
Hosts文件,然后DNS,然后执行NetBIOS名称parsing。 .local地址。 /etc/nsswitch.conf来确定主机名parsing顺序。 备用机制包括LDAP和NIS。 系统pipe理员经常select在防火墙中阻止DNS,强制组织内的所有客户端使用本地DNS服务器。 这有助于控制DNScaching中毒攻击的风险。
nsswitch的默认设置将首先查找/ etc / hosts(文件)然后尝试dns。 因此,如果主机在/ etc / hosts中列出,并且阻止了端口53的udp / tcp,那么它仍然会得到正确的ip并且工作。 如果主机不在/ etc / hosts中,则不会获得IP
所以我的问题是,如果我阻止所有使用防火墙规则的机器中的端口53的出站stream量,这是否意味着我根本无法parsing任何主机名?
那么,你的操作系统有可能build立了一个以前的DNS查询响应的caching,但是这些caching会过期,一旦他们这样做,你根本就没有能力parsing域名,这基本上是正确的。
有些复杂的问题是,你可以在一个文件( /etc/hosts )中“硬编码”一些域→IP映射,还有其他方法可以parsing域名 – 例如各种本地networking域控制器使用DNS,如果没有,可能不使用端口53)。 但是,这些不太可能帮助你进入Facebook。
HTTP客户端通常在进行连接时使用DNS转发查询,但不一定,因为HTTP代理服务器是可能的。 它将parsing服务器名称委托给代理(可以反过来查询另一个代理等)。 Ī曾经读过(虽然没有看到),古老的局域网协议允许浏览器在没有TCP的情况下运行。
此外,如果应用程序调用gethostbyname()或类似的方法,那么它可能会导致出站数据包,但不一定,因为这是特定操作系统及其设置的DNS实现问题。 其中gethostbyname()不会导致出站stream量的情况之一是本地运行的(127.0.0.1)DNS服务器,由于某种原因,它已经caching了所有需要的DNSlogging。