我的场景

我的场景

我的场景

我的相关条目/etc/hosts(我按照您在此处看到的顺序编写它们)

172.22.5.107    www.wordpress-rend-adri.com
192.168.1.116   www.wordpress-rend-adri.com

我在家里和学校使用笔记本电脑,因此我总是处理 2 个地址空间:

  • 192.168.1.0/24
  • 172.22.0.0/16

所以我有这些条目是因为我有一个带有 Wordpress 的虚拟机来进行练习。这样,无论我在哪里,我都可以访问我的 Wordpress(只要 DHCP 显然在两个网络中为我提供相同的 IP)

我的问题

知道了所有这些,现在我可以告诉你,我刚刚在我的计算机中进行了该配置,/etc/hosts因为一位老师对我说,对于指向单个 IP 的名称,我只能拥有 1 条记录。他对我说,如果我有一个相同名字的重复注册,它总是采用第一个,然后停止。但他也对我说,我应该尝试一下,所以我就这么做了。

现实情况是,例如在我家(我正在使用192.168.1.0/24),即使第一个记录是针对另一个 IP,我仍然可以建立连接,并且当我 ping 该名称时,正确的 IP 会回答我。是的,我确实尝试完全确定这一点,并且我在隐身的 Firefox 窗口中进行了操作,并且我还尝试评论我家的 IP 行以检查发生了什么。

然后,我尝试交换这两个记录。我的意思是,我刚刚这样做了:

192.168.1.116   www.wordpress-rend-adri.com
172.22.5.107    www.wordpress-rend-adri.com

所以在这种情况下,显然它仍然有效。

当我去学校时,使用其他地址空间时也发生了同样的情况。

所以...
/etc/hosts如果这个配置确实对我有用,为什么说你的 中一个名字只能有 1 条记录?

¿Firefox、ping二进制文件或您使用的任何东西,在进行最终连接之前,是否会执行名称解析的内部过程来检查实际有效的条目是什么?
我问这个问题是因为例如使用ping,您就开始从有效的 IP 中获得答案。您不会像尝试连接到以前的其他 IP 那样出现连接失败的情况

答案1

我在我的 debian/wsl 上做了一些测试

~$ uname -a
Linux DESKTOP-OMM8LBC 4.4.0-17763-Microsoft #864-Microsoft Thu Nov 07 15:22:00 PST 2019 x86_64 GNU/Linux

# /etc/hosts
172.22.5.107   www.wordpress-rend-adri.com # Unreachable IP from my LAN
216.58.198.164 www.wordpress-rend-adri.com # IP for www.google.com
192.168.0.12   www.wordpress-rend-adri.com # IP for another running machine on my LAN
157.240.1.35   www.wordpress-rend-adri.com # IP for www.facebook.com

~$ ping www.wordpress-rend-adri.com
PING www.wordpress-rend-adri.com (192.168.0.12) 56(84) bytes of data.
64 bytes from www.wordpress-rend-adri.com (192.168.0.12): icmp_seq=1 ttl=64 time=49.9 ms
64 bytes from www.wordpress-rend-adri.com (192.168.0.12): icmp_seq=2 ttl=64 time=5.85 ms
64 bytes from www.wordpress-rend-adri.com (192.168.0.12): icmp_seq=3 ttl=64 time=5.58 ms
64 bytes from www.wordpress-rend-adri.com (192.168.0.12): icmp_seq=4 ttl=64 time=6.25 ms
64 bytes from www.wordpress-rend-adri.com (192.168.0.12): icmp_seq=5 ttl=64 time=6.19 ms
--- www.wordpress-rend-adri.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 9ms
rtt min/avg/max/mdev = 5.575/14.754/49.919/17.584 ms

因此ping选择了放置在两个工作 WAN IP 之间的本地 IP。

第二次测试:

/etc/hosts
172.22.5.107   www.wordpress-rend-adri.com # Unreachable IP from my LAN
216.58.198.164 www.wordpress-rend-adri.com # IP for www.google.com
#192.168.0.12   www.wordpress-rend-adri.com # IP for one running machine on my LAN
157.240.1.35   www.wordpress-rend-adri.com # IP for www.facebook.com

~$ ping www.wordpress-rend-adri.com
PING www.wordpress-rend-adri.com (172.22.5.107) 56(84) bytes of data.
# Stuck here

第三次测试:

/etc/hosts
#172.22.5.107   www.wordpress-rend-adri.com # Unreachable IP from my LAN
216.58.198.164 www.wordpress-rend-adri.com # IP for www.google.com
#192.168.0.12   www.wordpress-rend-adri.com # IP for one running machine on my LAN
157.240.1.35   www.wordpress-rend-adri.com # IP for www.facebook.com

~$ ping www.wordpress-rend-adri.com
PING www.wordpress-rend-adri.com (216.58.198.164) 56(84) bytes of data.
64 bytes from www.wordpress-rend-adri.com (216.58.198.164): icmp_seq=1 ttl=54 time=24.5 ms
64 bytes from www.wordpress-rend-adri.com (216.58.198.164): icmp_seq=2 ttl=54 time=22.4 ms
64 bytes from www.wordpress-rend-adri.com (216.58.198.164): icmp_seq=3 ttl=54 time=21.7 ms
64 bytes from www.wordpress-rend-adri.com (216.58.198.164): icmp_seq=4 ttl=54 time=30.5 ms

--- www.wordpress-rend-adri.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 21.734/24.768/30.457/3.440 ms

第四次测试:

/etc/hosts
#172.22.5.107  www.wordpress-rend-adri.com # Unreachable IP from my LAN
216.58.198.164 www.wordpress-rend-adri.com # IP for www.google.com
192.168.0.12   www.wordpress-rend-adri.com # IP for one running machine on my LAN
192.168.0.1    www.wordpress-rend-adri.com # IP for my router
157.240.1.35   www.wordpress-rend-adri.com # IP for www.facebook.com

~$ ping www.wordpress-rend-adri.com
PING www.wordpress-rend-adri.com (192.168.0.1) 56(84) bytes of data.
64 bytes from www.wordpress-rend-adri.com (192.168.0.1): icmp_seq=1 ttl=64 time=1.56 ms
64 bytes from www.wordpress-rend-adri.com (192.168.0.1): icmp_seq=2 ttl=64 time=1.35 ms

--- www.wordpress-rend-adri.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 1.349/1.455/1.561/0.106 ms

所以我的结论是,ping不要一个接一个地尝试。它有利于路由器、本地 IP 而不是 WAN IP。

更新 :

上述 IP 的选择通过以下 python 命令确认:

python -c 'import socket;print(socket.gethostbyname("www.wordpress-rend-adri.com"))'

答案2

考虑一下当您有这些条目时/etc/hosts

172.22.5.107    www.wordpress-rend-adri.com
192.168.1.116   www.wordpress-rend-adri.com

过去,查找www.wordpress-rend-adri.com(最多)只会返回匹配的第一行中的条目,即172.22.5.107在本例中。

(某些)现代 Linux 发行版上会扫描整个/etc/hosts文件以查找匹配项,您不仅会得到172.22.5.107,还会得到192.168.1.116.

这让我很惊讶。

(事实上​​,我已经写了一个完整的答案来证实你老师的观点,只是当我实际测试它时,我发现它不再正确。)

  1. 查找www.wordpress-rend-adri.com将返回172.22.5.107 192.168.1.116
  2. 查找172.22.5.107将返回www.wordpress-rend-adri.com
  3. 查找192.168.1.116将返回www.wordpress-rend-adri.com

演示一下,假设这两条记录都在本地/etc/hosts

grep hosts /etc/nsswitch.conf
hosts:          files dns

tail -n2 /etc/hosts
192.168.1.116   www.wordpress-rend-adri.com
172.22.5.107    www.wordpress-rend-adri.com

getent hosts www.wordpress-rend-adri.com
192.168.1.116   www.wordpress-rend-adri.com
172.22.5.107    www.wordpress-rend-adri.com

getent hosts 172.22.5.107
172.22.5.107    www.wordpress-rend-adri.com

getent hosts 192.168.1.116
192.168.1.116   www.wordpress-rend-adri.com

我推测您可以在任一上下文中使用任一地址的原因是您的 Web 浏览器等正确尝试集合中的每个可能的 IP 地址(即172.22.5.107192.168.1.116),直到获得成功连接。

相关内容