curl仍然将app.localhost解析为127.0.0.1,尽管在AmazonLinux 2上的/etc/hosts中被覆盖

gzjq41n4  于 2023-06-21  发布在  Linux
关注(0)|答案(1)|浏览(179)

是否有配置可以更改Amazon Linux 2的名称解析器的行为,使其不忽略有关localhost子域的条目?
目前,它正在:

docker run -it amazonlinux:2023 /bin/bash  -c "echo '172.4.0.2 app.localhost' >> /etc/hosts ; curl -v app.localhost "

*   Trying 127.0.0.1:80...

而centos(或ubuntu)“如预期”工作

docker run -it centos /bin/bash  -c "echo '172.4.0.2 app.localhost' >> /etc/hosts ; curl -v app.localhost "
*   Trying 172.4.0.2...

为什么我需要这个

在我们的本地开发环境中我有2个docker
1.一个是我们的主应用程序,运行在Amazon Linux 2上(尽可能接近生产环境)
1.一个包含其他HTTP服务的模拟
由于mock既需要由主应用程序从后端访问,也需要由前端访问,因此将mock命名为app.localhost允许
1.在前端使用的事实,我们不需要创建额外的/etc/hosts条目
1.前端和后端都使用包含主机名的相同name/env变量,这在生产中也是如此

我查了什么

1.都有相同的`/etc/host.conf配置

  1. getent hosts app.localhost用于两个返回172.4.0.2
  2. AmazonLinux 2的glic版本是2.34、centos2.28和ubuntu2.35,所以至少这不是glibc中的行为改变
    1.修改/etc/nsswitch.conf以匹配我的ubuntu
passwd:         files systemd
group:          files systemd
shadow:         files
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

是否还有其他地方可能影响本地主机名的解析方式?

col17t5w

col17t5w1#

差异来自curl的版本
请参阅https://daniel.haxx.se/blog/2021/05/31/curl-localhost-as-a-local-host/,更具体地说,此提交https://github.com/curl/curl/commit/b5c0fe20e370ea2e5791fce4cedb34a71bc784e5#diff-e0b647f3e21a7fb58400dcec74f381d2fe16ca41e983240c15fc1243c574dbf9R733
例如,对于以.localhost结尾域名,curl直接返回127.0.0.1并绕过所有名称解析。
RFC 6761解释了
名称解析API和库应将本地主机名识别为特殊名称,并应始终返回地址查询的IP环回地址,并对所有其他查询类型返回否定响应。名称解析API不应将本地主机名称查询发送到其配置的缓存DNS服务器

相关问题