gratifiant > linux.debian.user.french

Marc Chantreux (13/09/2019, 12h20)
salut à tous,

sur ma machine, j'ai un /etc/hosts avec plein d'alias perso dedans (en
bombinant avec les hosts ssh, c'est merveilleux d'éfficacité et de
mémoire). c'est une pratique que je m'interdis sur des machines qui sont
co-gérées et cette discipline est pénible.

sauf que cette semaine, je trouve dans GETHOSTBYNAME(3):

in_addr equivalent into the h_addr_list[0] field of the returned
hostent structure. If name doesn't end in a dot and the
environment variable HOSTALIASES is set, the alias file pointed to
by HOSTALIASES will first be searched for name (see hostname(7) for
the file format). The current domain and its parents are searched
unless name ends in a dot.

génial! tentative ....

$ export HOSTALIASES=~/.hosts
$ echo 127.0.0.1 wow> $HOSTALIASES
$ ping wow
ping: wow: Aucune adresse associée avec le nom de l'hôte

pas mieux avec `getent ahosts` ...

j'ai vu dans GETENT(1) qu'il y a un GETHOSTBYNAME(3) qui utilise aussi
$HOSTALIASES. du coup je me suis dis que files arrivait trop tard mais:

$ grep -H '^hosts' /etc/nsswitch.conf
/etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns

du coup, là ... je sêche. quelqu'un a une idée?

d'avance merci
marc
Basile Starynkevitch (13/09/2019, 14h10)
Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5)
<http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html>

Pour ssh ou mosh, je configurerais plutôt des fichiers spécifiques (par
exemple sous ~/.ssh)

Enfin, la libc est tellement centrale, qu'il y a plein de caches
associées. Voir aussi et rebooter la machine

On 9/13/19 12:12 PM, Marc Chantreux wrote:
[..]
didier.gaumet (13/09/2019, 14h20)
avertissement habituel: le réseau et moi ça fait deux...

mais la page man de gethostbyname(3) indique que la fonction, bien que toujours disponible, a été remplacée par getnameinfo(3) dont on conseille l'usage.
Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
Marc Chantreux (13/09/2019, 15h50)
salut Basile,

> Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5)
> <http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html>


sauf que je disais dans mon message initial que

$ grep -H '^hosts' /etc/nsswitch.conf
/etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns

files est appellé en premier donc ca n'est pas du à la réponse négative
d'une base qui aurait priorité.

> Pour ssh ou mosh, je configurerais plutôt des fichiers spécifiques (par
> exemple sous ~/.ssh)


précisément: je me plante régulièrement parceque ssh, scp, rsync, git et
toutes ces commandes qui sous-traitent à ssh marchent bien mais qu'à
l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.

> Enfin, la libc est tellement centrale, qu'il y a plein de caches associées.
> Voir aussi et rebooter la machine


je viens de faire un strace en root et on y voit bien qu'il lit le
fichier (deux fois, même...).

$ cd /tmp
$ echo 127.0.0.1 wow > a
$ export HOSTALIASES=/tmp/a
$ strace ping wow |& sed '/tmp.a"/,/^close/!d'

ping: wow: Aucune adresse associée avec le nom de l'hôte
openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5
read(5, "1", 1) = 1
read(5, "2", 1) = 1
read(5, "7", 1) = 1
read(5, ".", 1) = 1
read(5, "0", 1) = 1
read(5, ".", 1) = 1
read(5, "0", 1) = 1
read(5, ".", 1) = 1
read(5, "1", 1) = 1
read(5, " ", 1) = 1
read(5, "w", 1) = 1
read(5, "o", 1) = 1
read(5, "w", 1) = 1
read(5, "\n", 1) = 1
read(5, "", 1) = 0
close(5) = 0
openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5
read(5, "1", 1) = 1
read(5, "2", 1) = 1
read(5, "7", 1) = 1
read(5, ".", 1) = 1
read(5, "0", 1) = 1
read(5, ".", 1) = 1
read(5, "0", 1) = 1
read(5, ".", 1) = 1
read(5, "1", 1) = 1
read(5, " ", 1) = 1
read(5, "w", 1) = 1
read(5, "o", 1) = 1
read(5, "w", 1) = 1
read(5, "\n", 1) = 1
read(5, "", 1) = 0
close(5) = 0

donc je pense pas que ce soit une question de cache mais je rebooterais
la machine à l'occas.

cordialement,
marc
Marc Chantreux (13/09/2019, 16h00)
salut Didier,

> avertissement habituel: le réseau et moi ça fait deux...


ben la stack réseau de linux est un peu devenu une usine à gaze pour
moi... par contre j'utilise maintenant Gnome et NetworkManager et il
faut bien avouer que dans la grande majorité des cas, ca juste marche.

> Je suppose qu'en interne lors de tes essais, c'est la nouvelle
> fonction et pas l'ancienne qui est appelée...


comme je disais dans l'autre message: la base est bien consultée quand
je fais ping par exemple.

je vais faire un essai ce we: écrire deux petits bouts de C avec les 2
fonctions pour voir strace voit un comportement différent.

cordialement,
marc
Daniel Caillibaud (13/09/2019, 18h00)
Le 13/09/19 =C3=A0 15h46, Marc Chantreux <mc> a =C3=A9crit :
> > Pour ssh ou mosh, je configurerais plut=C3=B4t des fichiers sp=C3=A9cif= iques (par
> > exemple sous ~/.ssh) =20

>=20
> pr=C3=A9cis=C3=A9ment: je me plante r=C3=A9guli=C3=A8rement parceque ssh,= scp, rsync, git et
> toutes ces commandes qui sous-traitent =C3=A0 ssh marchent bien mais qu'= =C3=A0
> l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.


Pour ce besoin, j'utilise mon r=C3=A9solveur local (unbound), avec=20
- la liste `host ip` dans un /etc/unbound/hosts.list
- un /root/bin/refresh_unbound_local_zone.sh qui g=C3=A9n=C3=A8re
un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la=20
nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)

Dans mon cas c'est pour g=C3=A9rer du *.lan.domain.tld (qui n'existe=20
pas dans les dns publics), avec dans le resolv.conf un=20

search lan.domain.tld

=3D> L'utilisateur n'a pas besoin de conna=C3=AEtre le suffixe lan.domain.t=
ld,=20
s'il veut joindre le host toto =C3=A7a ira chercher dans unbound toto.lan.d=
omain.tld

=C3=87a donne dans ce local.conf

server:
# pour qu'il accepte de donner des ip priv=C3=A9es dans les r=C3=A9ponses
private-domain: "lan.domain.tld"
# notre domaine fictif statique
local-zone: "lan.domain.tld." static

# la liste d'apr=C3=A8s /etc/unbound/hosts.list
local-data: "xx.lan.domain.tld. IN A 192.168.x.y"
local-data-ptr: "192.168.x.y xx.lan.domain.tld"

Je suis s=C3=BBr que tu n'a pas besoin de moi pour =C3=A9crire la transform=
ation
liste =3D> conf, mais si =C3=A7a peut servir =C3=A0 d'autres voici mon scri=
pt.
Dsl c'est du bash, mais zsh doit dig=C3=A9rer =C3=A7a sans pb ;-)

#!/bin/bash

# pour g=C3=A9n=C3=A9rer la liste d'apr=C3=A8s la conf c'est
# sed -nre 's/.*local-data:.*"([^\.]+)\.[^0-9]*([0-9\.]+)".*/\1 \2/p' /etc/=
unbound/unbound.conf.d/local.conf

set -u

SRC=3D/etc/unbound/hosts.list
DST=3D/etc/unbound/unbound.conf.d/local.conf
BAK=3D/etc/unbound/local.bak
BAKO=3D/etc/unbound/local.ko

DOM=3Dlan.domain.tld

OK=3D0
KO=3D1

confirm=3Dyes
[ "${1-}" =3D=3D "-y" ] && confirm=3Dno

[ ! -f $SRC ] && echo "$SRC n'existe pas, abandon">&2 && exit $KO

if [ "$confirm" =3D=3D "yes" ]; then
echo "Ce script va =C3=A9craser la conf locale (statique) d'unbound pour =
$DOM (avec les $(egrep -c '^[a-z]' $SRC) hosts de $SRC)"
echo "Continuer [o/N] ?"
read rep
[ "$rep" !=3D "o" ] && echo "Abandon" && exit $OK
fi

# backup conf actuelle
cp -af $DST $BAK

cat <<EOF > $DST
# fichier g=C3=A9n=C3=A9r=C3=A9 automatiquement d'apr=C3=A8s $0
server:
# pour qu'il accepte de donner des ip priv=C3=A9es dans les r=C3=A9ponses
private-domain: "lan.domain.tld"
# notre domaine fictif statique
local-zone: "lan.domain.tld." static

# la liste d'apr=C3=A8s $SRC
EOF

awk '/^[a-z]/ {
printf(" local-data: \"%s.'$DOM'. IN A %s\"\n", $1, $2)
printf(" local-data-ptr: \"%s %s.'$DOM'\"\n", $2, $1)
}' < $SRC >> $DST

if unbound-checkconf
then
if [ "$confirm" =3D=3D "yes" ]; then
echo "Conf OK, recharger unbound [o/N] ?"
read rep
[ "$rep" !=3D "o" ] && echo "Sortie sans rechargement, unbound UTILISE =
TOUJOURS l'ancienne configuration" && exit $OK
fi
unbound-control reload
else
echo "Conf KO (cf le r=C3=A9sultat g=C3=A9n=C3=A9r=C3=A9 dans $BAKO), on =
remet l'ancienne"
cp -af $DST $BAKO
cp -af $BAK $DST
fi

--=20
Daniel

=C3=80 une table, le nombre 13 n'est =C3=A0 craindre
que si il n'y a =C3=A0 manger pour 12.
Grimod de la Reyni=C3=A8re
Marc Chantreux (13/09/2019, 21h30)
salut Daniel et merci pour ta réponse détaillée,

> Pour ce besoin, j'utilise mon résolveur local (unbound), avec
> - la liste `host ip` dans un /etc/unbound/hosts.list
> - un /root/bin/refresh_unbound_local_zone.sh qui génère
> un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la
> nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)


a ce stade, je vois déja des solutions plus simples comme un wrapper qui
me permettrait d'éditer /etc/hosts en user.

a vrai dire je pense même que c'est une meilleure solution parceque ca
fonctionnerait sur les unices qui n'ont pas de glibc.

en tout cas merci encore
marc
Nisar JAGABAR (16/09/2019, 11h00)
Salut,

> $ export HOSTALIASES=~/.hosts
> $ echo 127.0.0.1 wow> $HOSTALIASES
> $ ping wow
> ping: wow: Aucune adresse associée avec le nom de l'hôte


Il me semble que ping n'utilise pas gethostbyname mais getaddrinfo:

bash$ sudo ltrace ping google.com
__cxa_atexit(0x5574d608c060, 0, 0x5574d6092328, 0) = 0
cap_get_proc(0x7f1acd5be718, 1, 3, 32) = 0x5574d71af294
cap_init(0x5574d71af294, 0x5574d71af29c, 0x5574d71af290, 0x7f1acd4fcd17)
= 0x5574d71af2c4
cap_get_flag(0x5574d71af294, 12, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 1, 1, 0x5574d60923e0) = 0
cap_get_flag(0x5574d71af294, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 1, 1, 0x5574d60923e4) = 0
cap_set_proc(0x5574d71af2c4, 1, 0x3000, 4096) = 0
prctl(8, 1, 0x3000, 0x7f1acd4fcd47) = 0
getuid() = 0
setuid(0) = 0
prctl(8, 0, 0x3000, 0) = 0
cap_free(0x5574d71af2c4, 0, 0x3000, 0x7f1acd4fd0aa) = 0
cap_free(0x5574d71af294, 1, 0, 0x5574d71af010) = 0
getuid() = 0
geteuid() = 0
setlocale(LC_ALL, "") =
"LC_CTYPE=en_US.UTF-8;LC_NUMERIC="...
bindtextdomain("iputils", "/usr/share/locale") = "/usr/share/locale"
textdomain("iputils") = "iputils"
strlen("ping") = 4
getopt(2, 0x7fff8da6a5f8, "h?4bRT:6F:N:aABc:dDfi:I:l:Lm:M:n"...) = -1
cap_get_proc(13, 1, 1, 0) = 0x5574d71af2c4
cap_get_flag(0x5574d71af2c4, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 0, 1, 0x7fff8da6a44c) = 0
cap_set_proc(0x5574d71af2c4, 0, 8192, 0) = 0
cap_free(0x5574d71af2c4, 0x5574d71af2cc, 8192, 0x7f1acd4fcd47) = 0
__errno_location() = 0x7f1acd3def80
socket(2, 2, 1) = -1
socket(2, 3, 1) = 3
__errno_location() = 0x7f1acd3def80
socket(10, 2, 58) = -1
socket(10, 3, 58) = 4
cap_get_proc(13, 0, 58, 0x7f1acd4fdac7) = 0x5574d71af2c4
cap_get_flag(0x5574d71af2c4, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 0, 1, 0x7fff8da6a44c) = 0
cap_set_proc(0x5574d71af2c4, 0, 0, 0) = 0
cap_free(0x5574d71af2c4, 0x5574d71af2cc, 0, 0x7f1acd4fcd47) = 0
getaddrinfo("google.com", nil, 0x7fff8da6a4b0, 0x7fff8da6a498) = 0
inet_aton("google.com", { 0 }) = 0
....

Par ailleurs, getaddrinfo est plus simple à utiliser que gethostbyname
: ça te retourne les resolutions avec tous les type de familles ; et il
ne faut pas oublier ce buffer overflow (aka "GHOST") :
Discussions similaires