I need some help to understand why a PHP-FPM chrooted PHP script fails to resolve an FQDN few instants after the PHP-FPM service started.
When I (re)start the PHP-FPM service, it works (resolution succeeds) a few seconds and then resolution fails.
I chrooted a PHP application (a WordPress actually) via PHP-FPM (settings `` chroot` in the PHP-FPM pool configuration file) and gave PHP what it needed:
- A basic
/etc/hosts
file - A
mount --bind
of /etc/ssl/certs - A
/dev/urandom
(viamknod
) - A
mount --bind
of /usr/share/zoneinfo - A
mount --bind
of /var/run/mysqld for the socket to MySQL. - A
mount --bind
of /var/run/nscd for the socket to nscd resolver. - A place to store PHP sessions
I noticed the issue when WordPress complained it could not download updates with:
stream_socket_client(): php_network_getaddresses: getaddrinfo failed: Name or service not known stream_socket_client(): unable to connect to tcp://www.wordpress.org:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)
Sample script:
<?php
$domain = 'www.example.com';
echo 'gethostbynamel(): '; var_dump(gethostbynamel($domain));
echo 'checkdnsrr(): '; var_dump(checkdnsrr($domain, 'A'));
echo 'dns_get_record(): '; var_dump(dns_get_record($domain));
?>
When it works:
gethostbynamel(): array(1) {
[0]=>
string(13) "93.184.216.34"
}
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
[0]=>
array(5) {
["host"]=>
string(15) "www.example.com"
["class"]=>
string(2) "IN"
["ttl"]=>
int(86348)
["type"]=>
string(1) "A"
["ip"]=>
string(13) "93.184.216.34"
}
}
After a few instants:
gethostbynamel(): bool(false)
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
[0]=>
array(5) {
["host"]=>
string(15) "www.example.com"
["class"]=>
string(2) "IN"
["ttl"]=>
int(86400)
["type"]=>
string(1) "A"
["ip"]=>
string(13) "93.184.216.34"
}
}
Note that, in any case, both dns_get_record()
and checkdnsrr()
always works fine.
Three questions:
- What makes
dns_get_record()
andcheckdnsrr()
achieve to resolve FQDN whengethostbynamel()
fails? - What does
gethostbynamel()
need in a chrooted setup? - What could make it works only for a few moment?
Software versions:
- Debian 9
- Nginx 10.3
- PHP 7.0.19
Thanks
/etc/host.conf
and/etc/nsswitch.conf
in the chroot jail. – Gran/etc/host.conf
,/etc/nsswitch.conf
and/etc/resolv.conf
but the issue persists. Runningsysdig
(not on a chrooted instance because I fail to usesysdig
on the PHP-FPM) shows thegethostbynamel()
only uses/etc/resolv.conf
(stat res=0 path=/etc/resolv.conf
) where bothdns_get_record()
andcheckdnsrr()
uses the network (sendto fd=3(<4u>127.0.0.1:47531->127.0.0.1:domain) size=33 tuple=NULL
). – Queer/lib/x86_64-linux-gnu/libnss_dns.so.2
into the jail (keeping the two files you gave) and it seems to work for now (resolving more than 5 minutes is way longer it never did). – Queer