在 Wireshark 中查看我的网络适配器的 DNS 和 SNI,我看到的只是域名和子域名,但斜线后什么都没有,就像没有提到example.com/page
或twitter.com/mypage
所以,我想知道,应用程序或浏览器如何知道在正斜杠之后访问哪个页面?
浏览器或应用程序是否只需要知道/查询主域或子域的 IP 地址,然后它会简单地在其后添加斜杠?例如192.168.1.1/mypage
,在 Twitter 的情况下?
我认为这可行,但如果斜杠后面的地址有不同的 IP 地址怎么办?例如,Twitter.com
位于192.168.1.1
但Twitter.com/mypage
位于192.168.2.1
?这样做甚至是主流吗?
最后但也是最重要的一点,如果 DNS 请求/响应和 TLS SNI 字段仅包含网站的子域和主域,这是否意味着例如我的 ISP 不会确切知道我访问了哪些 Twitter 或 Instagram 页面并且只能看到我访问 Twitter.com 和 Instagram.com,只要连接是 HTTPS?
PS 请考虑仅在端口 53 上使用纯文本 DNS,根本没有像 DoH 或 DoT 这样的安全 DNS。
更新:阅读此 Server Fault 帖子中所选答案下的评论回答了我的第一个问题。
在处理 http(s) 请求时,DNS 所做的只是将域名转换为 IP 地址。Web 浏览器然后连接到该 IP 地址并请求资源(例如,斜线之后的部分) - 不涉及 DNS。
您认为 twitter.com 位于 192.168.1.1 但 twitter.com/mypage 位于 192.168.2.1 的论点是错误的。从 Web 客户端 POV 来看,twitter.com 和 twitter.com/mypage 都存在于同一个 IP 地址上。twitter.com 上的服务器可以充当反向代理并从 192.168.2.1 获取最终数据,但它将通过浏览器和 192.168.1.1 之间建立的安全连接路由请求。
DNS 和 SNI 几乎没有关系。SNI 由网络服务器协商,不关心 DNS(暂时忽略 CAA 记录等,它们相关但与 SNI 无关,也不是无处不在)。事实上,拿一个网站,将其移动到另一台服务器上的另一个 IP 地址 - 但请确保您也移植了证书,修改您的主机文件以指向新的 IP 地址,即使您覆盖了您的 HTTPS 站点也将工作域名系统。
添加到其他答案:这里是一个 URL 的快速剖析:
https://
- 浏览器用来与网络服务器对话的协议,也就是“语言”。www.example.com:99
- 地址,进一步分为两部分:www.example.com
- 主机名又名“域名”。浏览器会在连接前将其转换为 IP 地址:99
- 浏览器用于建立网络连接的 TCP 端口号。这部分通常被省略,然后浏览器使用所选协议的默认端口号(80
forhttp
;443
forhttps
)/some/path
和?a=b&c=d
- “资源路径”和“查询字符串”。浏览器在建立连接后将所有这些一起发送到服务器(在 HTTPS 的情况下,包括所有 TLS 协商,因此它被加密发送)。除了确保它不包含非法字符之外,浏览器不会修改此文本。它实际上可以是任何东西,它只是一个约定,第一部分是“资源”的路径,第二部分是某种参数。实际上,您几乎可以发送任何东西,服务器可以随意处理它。#1223
- 这称为“片段”,浏览器根本不会将其发送到服务器。这是 100% 供客户端使用。例如,如果 URL 生成一个 HTML 页面,浏览器将尝试查找具有此 ID 的 HTML 元素并滚动到它。它也可以通过在浏览器中运行的 Javascript 访问(然后可以用它做任何事情)。但它永远不会被发送到任何地方。因此,如您所见,在 DNS 系统中查找的确实只是域部分。而且您不能根据路径使用不同的 IP 地址。
它实际上从来没有不同的IP地址。HTTP URL 语法无法做到这一点。它定义只有斜杠之前的部分是“权限”(要连接的服务器的域名或 IP 地址)——同一台服务器始终负责其域下的所有 HTTP 路径。
(实际的服务器可以以它喜欢的任何方式处理不同路径的 HTTP 请求,例如,它可以在本地提供一些路径,同时将其他路径代理到不同的后端主机,但这都是客户端不可见的服务器端逻辑。)
这里有很多很好的答案,但它们是对 URL 组件的框架挑战或解释。我建议阅读我之前的那些,因为我的目的是扩展这些。
我将通过接受问题的前提来回答(“这怎么可能发生?”),但要澄清它的实际含义。
严格来说,“DNS 所做的只是将域名转换为IP地址”并不完全正确。DNS 可以将一个域名转换为多个IP 地址。但是,所有这些 IP 地址都意味着彼此等价,选择使用哪一个(在所有实际情况下)与 URL 的其他组件无关。
dig microsoft.com
这是我刚刚运行的示例答案部分:中间的部分并不重要,但为了完整起见,它们是 TTL (
2838
)、地址族 (IN
) 和记录类型 (A
)。当您请求您的浏览器或其他工具进行检索
https://microsoft.com/example
时,它将首先进行 DNS 查找microsoft.com
,然后它将选择一个返回的地址来使用。很多时候,它只会选择列表中的第一个。DNS 服务器也可能会打乱响应中的地址,使得列表中的第一个每次都不是同一个。服务器管理员可能将其 DNS 服务器设置为为特定域名返回多个 IP 地址的主要原因有两个:
不过,还有其他方法可以提供冗余和负载平衡;例如,
dig google.com
现在只为我返回一个地址,但我相当肯定 Google 的主页运行速度并没有微软那么强大。DNS 只是该过程的一部分。因此,要回到最初的问题,完全有可能并且似乎
https://microsoft.com/
解析https://microsoft.com/example
为两个不同的 IP 地址,但这只是因为解析为多个 IP 地址并且第二次选择了不同的 IP 地址。如果您多次进行此实验,您会发现两个 URL 都可以解析到池中的 5 个地址中的任何一个,因为正如其他人所说,只有域名才是重要的。microsoft.com
浏览器将该路径和查询信息发送到从域名中找到地址的服务器。服务器确定它希望为此返回什么。
当您要求浏览器(或其他用户代理)检索
http://www.example.com/foo/bar?a=1&b=2#baz
时,它会将该 URL 分解为由标准URL 语法指定的组件并执行以下操作:从方案部分确定
http:
它是使用 HTTP 协议。从 确定
//
紧随其后的将是一个权限,在这种情况下它只是一个服务器名称:www.example.com
。然后它将通过 DNS 查找服务器名称以获取它的 IP 地址。如果您的过滤器允许,您应该在 Wireshark 跟踪中看到此 DNS 请求和响应。由于该权限没有端口规范,浏览器将假定默认端口
80
,就像您输入了一样http://www.example.com:80/foo/bar
。然后它将连接到该主机和 TCP 端口上的服务器,并将路径和查询字符串作为 HTTP 请求的一部分发送。这些将在启动请求的请求行中:
GET /foo/bar?a=1&b=2 HTTP/1.0
。(请注意,它不会发送片段。)如果您在 Wireshark 中检查 HTTP 请求的内容,您将看到这一点。服务器将按照自己的意愿解释请求并返回某种结果。
如果返回的结果是一个 HTTP 文档,那么浏览器将寻找一个具有
id="baz"
属性的元素(即,匹配上面指定的片段)并滚动到它。这个过程实际上还有一些微妙之处;为简单起见,我故意省略了其他方案、请求行之外的HTTP 请求的其他部分(例如 HTTP 标头)、有关 HTTP 响应格式的任何详细信息,以及浏览器在响应时可能对片段执行的操作不是 HTML 文档。
这是正确的,只要您没有在浏览器中安装任何允许代理或透明代理通过解密和重新加密来代理 HTTPS 连接的非标准证书。
事实上,对于任何给定的 HTTPS 请求(或者他们认为是 HTTPS 请求,因为它转到端口 443 并使用 TLS),他们所能看到的只是您连接的 IP 地址,在某些情况下可能是系统托管许多不同的网站(特别是如果它是CDN端点的地址)。也就是说,他们通常也会看到您的 DNS 请求,这些请求是明文的,因此他们当然可以猜到,如果您查找 example.com 以获取 192.168.1.1 并且您在连接到 192.168.1.1 上的端口 443 后不久,您正在连接到 example.com,而不是也可以从该地址提供服务的其他站点。
DNS 只会将域名解析为
twitter.com
IP 地址,例如192.168.1.1
(请注意,这实际上不是 Twitter 的 IP 地址,而是来自为专用网络保留的地址块中的地址)。由于例如 DNS 流量管理或与域相关联的 DNS 记录的更改,多个 DNS 请求之间返回的 IP 地址可能不同。
一旦您的浏览器解析
twitter.com
为 eg192.168.1.1
,它将向后面的服务器发送一个 HTTP GET 请求,请求域上192.168.1.1
的资源:mypage
twitter.com
请注意,后面的服务器可能会
192.168.1.1
托管多个域。例如,如果example.com
也托管在 上192.168.1.1
,则 HTTP GET 请求example.com/mypage
将如下所示:总之,您的浏览器使用 DNS 找出发送 HTTP 请求的位置,并在请求中指定它想要获取的确切资源。反过来,服务器将根据 HTTP 请求中的信息准确地知道要为哪个域提供服务。
对于您的最后一个问题,是的,使用 HTTPS 将加密 URL。但是,URL 的域名部分可能会以明文形式发送,具体取决于使用的 TLS 握手过程。有关详细信息,请参阅此问题。
因此,攻击者可能能够看到您访问过 Twitter 或 Instagram,但无法准确判断出哪些页面/个人资料。
您已经收到了关于 dns 如何与您的问题相关的很好的解释。生病回答SNI部分。
简短的回答:您的 ISP 只能看到主机名。SNI 仅包含您的浏览器尝试访问的主机名。这是以纯文本形式发送的,您的浏览器有必要告诉 Web 服务器它请求哪个 ssl 证书。然后进行握手并在发送完整 URL 之前确保连接安全。
不是简短的答案(比您要求的要多得多,但是...)
SNI=服务器名称指示。它是 HTTPS TLS 握手过程的一部分。当您想连接到 twitter.com 时,首先要为其解析 dns。然后您的浏览器在端口 443 上向该 IP 地址发送请求(使用 https:// 时)。该请求的一部分包括 SNI,如果您的浏览器支持它,大多数支持。SNI 仅包含域名。如果您键入 https//www.twitter.com/bejrjoftj,则 dns 查找将解析www.twitter.com,然后包括www.twitter.com作为 SNI 请求。请注意“www”。实际上是顶级域名的子域。一个 IP 可以承载多个域。只有 HTTP 和 HTTPS 根据请求的主机名访问不同的资源。这很重要,因为即使 twitter.com 和 geocities.com 可能解析到相同的 IP 地址,Web 浏览器也会根据请求的主机名接收不同的资源(服务器为您提供的网页),但该 IP 地址只能主机,例如,端口 22 上的一台 SSH 服务器。因此,当您使用相同的 IP 访问不同的网站时,该 IP 仅运行一个网络服务器,该服务器根据 SNI 主机名决定向您发送哪个页面。但这就是 SNI 的全部内容,就是主机名。
Apache HTTP Server 和 nginx 都支持虚拟主机。例如,如果您直接在浏览器中使用 IP 地址,服务器将提供一个“默认主机”。这通常重定向到调用虚拟主机配置。虚拟主机不仅仅是主机名。
虚拟主机也可以是主机名右侧的数据。例如,twitter.com 和 twitter.com/something/ 可能是两个不同的虚拟主机。由于 dns 仅解析域名/主机名,因此无论 url 的其余部分是什么,twitter.com 都会解析到相同的 IP。但在 tls 握手并加密连接后,网络服务器确实收到了完整的请求 URL。重新交互,SNI 的目的是确保 Web 服务器发送正确的 SSL 证书来加密您的连接,因为如果您尝试访问 goatse.cx 并且其 IP 地址与 twitter.com 相同,则服务器需要 makr确保它将正确的证书发送到您的浏览器,以便您的浏览器可以验证它收到的证书是否与它尝试连接的主机名匹配。
如果没有 SNI,服务器将无法知道您想要来自服务器的 goatse.cx 虚拟主机,而不是 twitter.com 虚拟主机。并且您的浏览器需要接收 goatse.cx 证书才能完成握手而不会出现任何问题。该 IP 上的 Web 服务器需要具有主机名的虚拟主机条目,然后才能定义 url 虚拟主机。goatse.cx/ 和 goatse.cx/gaping/ 不一定是相同的虚拟主机,即使它们共享相同的证书,如果配置文件具有为 goatse.cx/gaping/* 定义的虚拟主机。至于 goatse.cx/gaping 可能最终位于 192.168.2.1 而 goatse.cx/ 位于 192.168.1.1 的原因是因为虚拟主机可以定义重定向。如果是这样,它会将您的浏览器重定向到另一个IP。这是一个软件定义的重定向,由结果代码 300 定义。一个更常见的结果代码是 404,这意味着请求的文件不存在。如果虚拟主机配置包含一个自定义响应页面,以在服务器从您请求的 url 收到 404 响应时将其发送回您的浏览器,则每次您请求不存在的文件时,它都会向您发送该页面。300 的重定向响应还包括一个新的 url,它告诉您的浏览器“嘿,您到达了 goatse.cx/gaping/ 虚拟主机,但抱歉 mario,您的公主在另一座城堡中。您需要将该请求发送到 twitter.com /张开/代替。” 然后你的浏览器说“哦,该死的,好吧,我的错。” 然后向服务器告诉它去的任何 url 发送一个请求。当您尝试访问看似无辜的 url 时,这就是您最终被重定向到恶意 url 的方式。但该重定向直接来自 Web 服务器,而不是 dns。dns 重定向仅在 dns 配置具有 CNAME 记录时(IPV4 的正常 IP 地址条目是 A 记录)。CNAME 记录是别名记录。并且将 A 或 CNAME 记录分配给主机名。因此,如果 gaping.goatse.cx 在 goatse.cx 主记录文件中有一条值为“twitter.com”的 CNAME 记录,则 dns 客户端将被告知查找 twitter.com 以完成对 gaping.goatse 的请求.cx。CNAME 记录始终是域名而不是 IP 地址。它告诉您的 dns 客户端 gaping.goatse.cx 只是用于 twitter.com 的另一个名称。如果您想使用 gaping.goatse.cx 作为 gapinghole.com 的另一个名称,并且您希望 dns 客户端跟踪到 gapinghole.com,这可能很有用。这不需要您运行一个为 gaping.goatse.cx 设置虚拟主机的 Web 服务器。然后,您的 dns 客户端将查找 gapinghole.com,您将取回分配给 gapinghole.com 的任何 IP。
DNS只涉及域名。您正在查看的是一个网址。域名是紧接在 the 之前的单词,其中
.com
不能有句点。域名如此something.domain.com/something…
简单,然后以各种方式与dns相关。domain
有关更多信息,请参见 URL。