Isso confunde muitas pessoas, mas o comando ping
tem suas próprias integrações com o arquivo /etc/resolv.conf
, enquanto as outras ferramentas mencionadas utilizam o recurso do Name Server Switch. Você pode ver isso se você executar um strace <cmd>
e analisar a saída das bibliotecas com as quais os comandos estão interagindo.
Por exemplo, aqui está o ping
:
$ strace ping -c 3 www.aliyun.com |& grep -E "ns|resolv"
open("/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
E aqui está o curl
:
$ strace curl -v www.aliyun.com |& grep -E "ns|resolv"
open("/lib64/libnss3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnssutil3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnspr4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("47.88.251.161")}, 16) = -1 EINPROGRESS (Operation now in progress)
getpeername(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("47.88.251.161")}, [16]) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(55876), sin_addr=inet_addr("10.0.2.15")}, [16]) = 0
Você provavelmente está se perguntando, mas espere, ambos estão exibindo uma chamada para libresolv
, então qual é o problema? O motivo pelo qual o curl
até sabe chamar a libresolv
é porque foi direcionado para isso. Por quê? Por causa desse arquivo:
$ grep host /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns myhostname
A referência hosts:
neste arquivo informa às ferramentas que fazem chamadas para o NSS (Name Server Switch) que devem consultar com files
primeiro, depois chamar dns
second.
A referência files
significa usar o arquivo /etc/hosts
, a opção dns
significa consultar /etc/resolv.conf
para um servidor de nomes DNS e procurar o nome do host lá.
Seu problema
Portanto, é provável que seu problema, devido ao fato de seu arquivo /etc/nsswitch.conf
não ter a entrada dns
, como mostrado acima.
Quais executáveis usam o NSS?
Você pode examinar os executáveis usando readelf
, que mostra quais bibliotecas compartilhadas um executável requer.
$ type -f curl
curl is /bin/curl
$ readelf -d /bin/curl | grep -i shared
0x0000000000000001 (NEEDED) Shared library: [libcurl.so.4]
0x0000000000000001 (NEEDED) Shared library: [libssl3.so]
0x0000000000000001 (NEEDED) Shared library: [libsmime3.so]
0x0000000000000001 (NEEDED) Shared library: [libnss3.so]
0x0000000000000001 (NEEDED) Shared library: [libnssutil3.so]
0x0000000000000001 (NEEDED) Shared library: [libplds4.so]
0x0000000000000001 (NEEDED) Shared library: [libplc4.so]
0x0000000000000001 (NEEDED) Shared library: [libnspr4.so]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
$ type -f ping
ping is /bin/ping
$ readelf -d /bin/ping | grep -i shared
0x0000000000000001 (NEEDED) Shared library: [libcap.so.2]
0x0000000000000001 (NEEDED) Shared library: [libidn.so.11]
0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.10]
0x0000000000000001 (NEEDED) Shared library: [libresolv.so.2]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
Um método semelhante pode ser usado com ldd
:
$ ldd /bin/ping|grep -E "ns|resolv"
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fd144d40000)
$ ldd /bin/curl|grep -E "ns|resolv"
libnss3.so => /lib64/libnss3.so (0x00007f9795413000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007f97951e4000)
libnspr4.so => /lib64/libnspr4.so (0x00007f9794b9d000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f9792067000)
O DNS parece estar funcionando
Se você conseguir executar esses comandos e eles funcionarem:
$ getent hosts www.google.com
216.58.193.164 www.google.com
$ getent hosts www.aliyun.com
47.88.198.17 xjp-adns.aliyun.com.gds.alibabadns.com www.aliyun.com
Em seguida, tente usar opennssl
para ver se você pode se conectar a esses serviços:
$ true | openssl s_client -connect www.aliyun.com:443
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G2
depth=0 C = CN, ST = ZheJiang, L = HangZhou, O = "Alibaba (China) Technology Co., Ltd.", CN = *.aliyun.com
0 s:/C=CN/ST=ZheJiang/L=HangZhou/O=Alibaba (China) Technology Co., Ltd./CN=*.aliyun.com
i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
subject=/C=CN/ST=ZheJiang/L=HangZhou/O=Alibaba (China) Technology Co., Ltd./CN=*.aliyun.com
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2