我的场景
我的相关条目/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
.
这让我很惊讶。
(事实上,我已经写了一个完整的答案来证实你老师的观点,只是当我实际测试它时,我发现它不再正确。)
- 查找
www.wordpress-rend-adri.com
将返回172.22.5.107
和192.168.1.116
- 查找
172.22.5.107
将返回www.wordpress-rend-adri.com
- 查找
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.107
和192.168.1.116
),直到获得成功连接。