我正在尝试更好地了解不同的网络查询工具,例如、、、,nc
同时更多地了解互联网请求、服务器等的架构(NIC、A 记录、MX) curl
,同时已经对 TCP、名称服务器、域名注册商、数据包嗅探器、HTTP 标头和 IP 地址有所了解。这是我的背景,这是我的问题。whois
dig
nslookup
当我dig
或者whois
假设 www.valgrind.org (或 valgrind.org) 时,我得到至少两个不同的 IP 答案:178.250.76.80 和 172.16.0.23#53。
$ nslookup valgrind.org
Server: 172.16.0.23
Address: 172.16.0.23#53
Non-authoritative answer:
Name: valgrind.org
Address: 178.250.76.80
尝试浏览或中的其中一个w3m
会chromium
导致403 Forbidden
错误。此外,我不确定要导航到哪一个,但 ping
能够找到答案!如果我ping valgrind.org
(或ping www.valgrind.org
)它选择
$ ping valgrind.org
PING valgrind.org (178.250.76.80) 56(84) bytes of data.
64 bytes from 178.250.76.80: icmp_req=1 ttl=50 time=80.2 ms
它怎么知道要这么做?我应该使用什么其他工具来了解我的浏览器如何从178.250.76.80
到valgrind.org
加载某些内容?
答案1
这里有不同的程序和协议在运行,每个程序和协议都配置为独立于其他程序和协议做出响应。
要查找 IP 地址,Linux 主机通常会使用 hosts: 指令/etc/nsswitch.conf确定查询各种来源的顺序。典型的输入是
hosts: files dns
它说检查文件(通常/etc/hosts) 然后是 DNS 系统。因此,将对 /etc/hosts 文件进行搜索,如果该文件包含 valgrind.org 的条目,则将返回关联的 IP 地址。如果 /etc/hosts 不包含 valgrind.org 的条目,则将向 DNS 发出请求。这涉及读取/etc/resolv.conf 确定应联系哪些服务器来请求 DNS 信息...
查看命令的输出,您没有得到两个不同的地址。输出的第一部分告诉您哪个服务器被nslookup(172.16.0.23)以及在哪个端口(#53)上获取答案。我们还知道 172.16.0.23 没有正确配置的 PTR 记录,因为如 RobM 的答案所示,如果正确配置了 PTR 记录,服务器将显示为名称。
输出的第二部分是您请求的信息,并告诉您 178.250.76.80 是 valgrind.org 的 IPv4 地址。
当您通过端口 80 联系 178.250.76.80 时(http) 你会直接得到一个 403 forbidden,因为这个地址的 http 服务器就是这样配置的。它很可能配置为基于名称的虚拟服务器,因此需要有效的 http主持人:(第 14.23 节)标头将您的请求路由到适当的虚拟主机。
ping 命令是ICMP 协议套件并且是 ICMP 回显请求,则 178.250.76.80 处的主机响应 ping,因为它已被配置为这样做,并向每个回显请求发送 ICMP 回显答复。
答案2
您需要了解 nslookup 的工作原理。
答案的第一部分,在这里应该会更清楚,是您正在与之交谈的名称服务器。它提供的答案是第二部分
因此在我的示例中,我要求 nslookup 查询我当前配置的 DNS 服务器,以查找它认为 www.serverfault.com 的位置。
nslookup 会回复用于运行查询的服务器的地址以及它给出的答案。如果您要指定特定的 DNS 服务器来运行 dig 或 nslookup,这一点很重要,这是解决名称解析问题的一个相当正常的一部分。
答案3
您误解了 nslookup 的输出。它没有给出两个答案,而只有一个。第一个地址是它从哪里得到答案。 ping
执行完全相同的任务并获得完全相同的结果。当您尝试将 IP 地址提供给浏览器时收到 403 的原因是因为服务器正在运行虚拟托管。使用虚拟托管,服务器可以拥有多个站点,只有一个 IP 地址。它根据浏览器告诉它您输入的名称来决定为您服务哪个站点。当您输入 IP 地址时,服务器不知道您想要哪个站点。
答案4
这取决于您的操作系统和 ping 版本。如果是 Linux,您可以使用 strace 找出所有正在做的事情。
strace ping valgrind.org
它会一步一步地告诉你。太长了,无法发布,但这是我的输出,这样我知道在某个时候它会检查 hosts 文件
。
.
.
open("/etc/host.conf", O_RDONLY) = 3
.
.
.