Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Questions sur systemd-resolved

6 réponses
Avatar
Francois Lafont
Bonjour à tous,

Je suis sous Ubuntu LTS 18.04 et j'utilise systemd en version 237, qui n'est
autre que la version de systemd issue de ma distribution. Si j'ai bien compris
c'est systemd-resolved qui manage ma configuration « client DNS » de ma
distribution et notamment le contenu du fichier /etc/resolv.conf.

J'ai deux questions sur systemd-resolved.

1. J'ai un VPN que je monte manuellement parfois (j'utilise le client VPN
openconnect) et j'ai un script shell qui procède à quelques configuration
automatiquement quand le VPN est UP (par exemple il met en place des routes, car
je ne veux pas que tout passe par le VPN par défaut). Une fois que le VPN se
monte, je voudrais _ajouter_ un domaine au niveau de l'instruction "search"
du fichier /etc/resolv.conf. Seulement, sauf erreur, je ne dois pas éditer le
fichier /etc/resolv.conf (managé systemd-resolved) et il faut que j'utilise
systemd-resolved. Je pensais utiliser la commande "systemd-resolve" (notez bien
l'absence du "d" à la fin) et quelque chose comme ceci semble aller dans la
bonne direction :

sudo systemd-resolve --set-domain mondomain.tld --interface eth0

Seulement voilà, si je regarde la sortie de la commande suivante et plus
précisément le champ "DNS Domain" de l'interface eth0 :

sudo systemd-resolve --status

je m'aperçois que "mondomain.tld" n'a pas été _ajouté_, il a remplacé tous les
domaines déjà existants, ce qui ne me convient pas. Je veux juste procédé à un
ajout et non pas tout remplacer.

Y a-t-il un moyen selon vous pour _ajouter_ un domaine en ligne de commandes dans
un shell au niveau du champ "DNS Domain" renvoyé par la commande
"systemd-resolve --status" ? Ou alors puis-je faire quelque chose en ajoutant un
fichier de configuration dans /etc/systemd/resolved.conf.d/ ? J'avoue que je ne
suis pas expert dans systemd-resolved et le fait, par exemple, qu'on puisse définir
des DNS par interface m'échappe un peu.

Je sais juste que j'ai un VPN qui se monte parfois et dont l'interface s'appelle
tun-dsi et je voudais qu'un domaine en particulier soit automatiquement _ajouté_
dans les "search" quand le VPN est UP et automatiqueemnt supprimé quand le VPN est
DOWN.

2. Avec systemd-resolved, quand un nom sans caractère "." est résolu, mettons
"toto", systemd-resolved tente de résoudre tous les fqdn de la forme "toto.xxx"
où xxx décrit la liste des domaines présents dans le champ "DNS Domain" (issu
de la sortie de la commande "systemd-resolve --status"). Ça, ça me va très bien.
En revanche, si je veux résoudre "foo.bar", alors comme, il y a un ".", il y a
directement une tentative de résolution de "foo.bar", ce qui me va aussi. Mais
comme "foo.bar" ça n'existe pas alors systemd-resolved continue à tenter des
résolutions sur "foo.bar.xxx" où xxx décrit la liste des domaines dans "DNS Domain",
et ça je ne voudrais pas. Comment faire pour éviter cela (ie sur des noms avec le
caractère ".", on tente de résoudre le nom directement et c'est tout, même si le
nom/fqdn n'existe pas) ?

Merci d'avance pour votre aide.

--
François Lafont

6 réponses

Avatar
Nicolas George
Francois Lafont , dans le message
<5e5bb6b1$0$4046$, a écrit :
Seulement, sauf erreur, je ne dois pas éditer le
fichier /etc/resolv.conf (managé systemd-resolved) et il faut que j'utilise

Tu fais ce que tu veux, c'est ton système. Le pire qui puisse t'arriver
ici, c'est que le changement fait à la sauvage soit annulé par systemd
qui remettrait la valeur officielle, et dans ce cas tu sais que tu as
besoin d'une solution plus sophistiquée.
je m'aperçois que "mondomain.tld" n'a pas été _ajouté_, il a remplacé tous les
domaines déjà existants, ce qui ne me convient pas. Je veux juste procédé à un
ajout et non pas tout remplacer.

Tu as essayé de mettre tous les domaines que tu veux en une seule fois ?
sudo systemd-resolve --set-domain ${${(M)${(f)"$(</etc/resolv.conf)"}:#search*}#* } --interface eth0
(c'est zsh)
En revanche, si je veux résoudre "foo.bar", alors comme, il y a un ".", il y a
directement une tentative de résolution de "foo.bar", ce qui me va aussi. Mais
comme "foo.bar" ça n'existe pas alors systemd-resolved continue à tenter des
résolutions sur "foo.bar.xxx" où xxx décrit la liste des domaines dans "DNS Domain",
et ça je ne voudrais pas. Comment faire pour éviter cela (ie sur des noms avec le
caractère ".", on tente de résoudre le nom directement et c'est tout, même si le
nom/fqdn n'existe pas) ?

C'est le comportement normal, et ce n'est pas lié à systemd. Si tu veux
que la résolution DNS soit exacte sur le nom que tu as donné, il faut
qu'il soit complet, c'est à dire qu'il ait sont point final :
« foo.bar. » et pas « foo.bar ».
Avatar
Francois Lafont
On 3/1/20 3:07 PM, Nicolas George wrote:
Seulement, sauf erreur, je ne dois pas éditer le
fichier /etc/resolv.conf (managé systemd-resolved) et il faut que j'utilise

Tu fais ce que tu veux, c'est ton système. Le pire qui puisse t'arriver
ici, c'est que le changement fait à la sauvage soit annulé par systemd
qui remettrait la valeur officielle, et dans ce cas tu sais que tu as
besoin d'une solution plus sophistiquée.

Oui, on est d'accord. Je souhaite avoir un truc qui ne soit pas effacé par systemd
autant que possible.
je m'aperçois que "mondomain.tld" n'a pas été _ajouté_, il a remplacé tous les
domaines déjà existants, ce qui ne me convient pas. Je veux juste procédé à un
ajout et non pas tout remplacer.

Tu as essayé de mettre tous les domaines que tu veux en une seule fois ?
sudo systemd-resolve --set-domain ${${(M)${(f)"$(</etc/resolv.conf)"}:#search*}#* } --interface eth0
(c'est zsh)

Oulà, le one liner zsh diabolique que voilà !
J'ai donc opté pour le même genre d'idée dans mon script shell, par contre c'est
du /bin/sh. Le script est appelé automatiquement par mon client VPN openconnect
avec plein de variables d'environnement dont CISCO_DEF_DOMAIN qui représente le
domaine que je souhaite ajouter quand le VPN est UP. De plus, le script est appelé
avec "connect" en argument quand il s'agit de monter le VPN et avec "disconnect"
en argument quand il s'agit de démonter le VPN. Voici mon code dont je donne
juste les extraits qui concernent le sujet de ce fil. C'est sans doute perfectible
et un peu pataud mais d'après mes tests, ça fonctionne :
---%<------%<------%<------%<------%<------%<------%<------%<---
#!/bin/sh
export PATH='/usr/sbin:/usr/bin:/sbin:/bin'
export LC_ALL='C'
# Fonction pour afficher les options --set-domain de la commande systemd-resolve via
# l'instruction "search" du fichier « resolv.conf » donné en argument 1, en supprimant
# l'exception donné en argument 2. Par exemple, si le fichier "f" contient la ligne :
#
# search domain1.tld domain2.tld domain3.tld
#
# L'instruction « get_set_domain_opts f domain2.tld » va afficher :
#
# --set-domain domain1.tld --set-domain domain3.tld
#
get_set_domain_opts () {
local resolv_conf="$1"
local exception="$2"
local search_domains=$(sed -rn 's/^[[:space:]]*search[[:space:]]*(.*)$/1/p' "$resolv_conf")
local set_domains_opts=''
local d
for d in $search_domains
do
[ "$d" = "$exception" ] && continue
set_domains_opts="$set_domains_opts --set-domain $d"
done
echo $set_domains_opts
}
# Pour obtenir le nom de l'interface « WAN ».
get_ifwan () {
ip --oneline route get 8.8.8.8 2>/dev/null | awk '{print $5}'
}
resolv_conf_backup='/var/run/vpnc/resolv.conf-backup'
case "$reason" in
connect)
# On sauvegarde la configuration DNS d'avant la connexion VPN.
[ ! -d "${resolv_conf_backup%/*}" ] && mkdir -p "${resolv_conf_backup%/*}"
cp '/etc/resolv.conf' "$resolv_conf_backup"
# Ajout du domaine spécifique lorsque le VPN est monté.
systemd-resolve --set-domain '~.'
$(get_set_domain_opts "/etc/resolv.conf" "$CISCO_DEF_DOMAIN")
--set-domain "$CISCO_DEF_DOMAIN" --interface "$(get_ifwan)"
;;
disconnect)
# On remet comme c'était avant.
systemd-resolve --set-domain '~.' $(get_set_domain_opts "$resolv_conf_backup" "") --interface "$(get_ifwan)"
;;
esac
exit 0
---%<------%<------%<------%<------%<------%<------%<------%<---
Remarque : j'ignore à quoi correspond l'option « --set-domain '~.' » dans
la commande systemd-resolve mais manifestement il faut que je le mette si
je veux obtenir quelque chose de semblable à ce que fait le DHCP par défaut.
En revanche, si je veux résoudre "foo.bar", alors comme, il y a un ".", il y a
directement une tentative de résolution de "foo.bar", ce qui me va aussi. Mais
comme "foo.bar" ça n'existe pas alors systemd-resolved continue à tenter des
résolutions sur "foo.bar.xxx" où xxx décrit la liste des domaines dans "DNS Domain",
et ça je ne voudrais pas. Comment faire pour éviter cela (ie sur des noms avec le
caractère ".", on tente de résoudre le nom directement et c'est tout, même si le
nom/fqdn n'existe pas) ?

C'est le comportement normal, et ce n'est pas lié à systemd. Si tu veux
que la résolution DNS soit exacte sur le nom que tu as donné, il faut
qu'il soit complet, c'est à dire qu'il ait sont point final :
« foo.bar. » et pas « foo.bar ».

Ok, alors si c'est le comportement normal, je vais rester ainsi pour éviter d'avoir
des confs tordues (qui se payent un jour ou l'autre).
Merci pour ton aide Nicolas.
--
François Lafont
Avatar
Jo Engo
Le Sun, 01 Mar 2020 21:46:32 +0100, Francois Lafont a écrit :
c'est du /bin/sh

Chez moi (debian out of te box j'ai :
:~$ file /bin/sh
/bin/sh: symbolic link to dash
--
Tout le monde aime mieux croire que juger.
-+- Sénèque -+-
Avatar
Sergio
Le 06/03/2020 à 07:45, Jo Engo a écrit :
Le Sun, 01 Mar 2020 21:46:32 +0100, Francois Lafont a écrit :
c'est du /bin/sh

Chez moi (debian out of te box j'ai :
:~$ file /bin/sh
/bin/sh: symbolic link to dash

Pour conclure, personne n'a eu l'idée de lire le man ?
"man rbash" affiche :
"Si bash démarre sous le nom rbash ou si l'option -r est fournie lors de son appel,
l'interpréteur devient restreint."
Donc le lien symbolique de bash (ou dash) vers rbash fera exécuter le shell en mode restreint...
--
Serge http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
Avatar
Nicolas George
Sergio , dans le message <5e61f4b5$0$3892$, a
écrit :
Pour conclure, personne n'a eu l'idée de lire le man ?
"man rbash" affiche :
"Si bash démarre sous le nom rbash ou si l'option -r est fournie lors de son appel,
l'interpréteur devient restreint."
Donc le lien symbolique de bash (ou dash) vers rbash fera exécuter le
shell en mode restreint...

Pourquoi parles-tu de ça ici, alors que pas une fois dans cette
discussion il n'a été question de bash ni rbash.
Accessoirement, ta dernière phrase semble indiquer que tu as compris la
page de man à l'envers.
Avatar
Francois Lafont
On 3/6/20 7:45 AM, Jo Engo wrote:
c'est du /bin/sh

Chez moi (debian out of te box j'ai :
:~$ file /bin/sh
/bin/sh: symbolic link to dash

Certes, mais comme Nicolas, je ne vois pas trop le rapport avec le fil de discussion (par ailleurs résolu).
Mais oui, en général /bin/sh est un symlink vers un interpréteur et, sous ma Ubuntu 18.04 (une Debian like), c'est aussi un symlink vers /bin/dash. Il me semble que ça fait un moment que /bin/sh ne pointe plus vers /bin/bash sous Debian.
--
François Lafont