RÉPONSE COURTE :
Vous serez en mesure d'envoyer un ping à un hôte local par son nom uniquement si votre routeur Wi-Fi (ou un autre hôte local) utilise un serveur DHCP/DNS. qui connaît le nom de l'hôte que vous essayez de pinger. . Voici une capture d'écran de mon routeur :
Vérifiez également que votre appareil Android envoie des requêtes DNS au serveur local et non à Internet. Android aime tellement Google, que vous trouverez souvent des requêtes allant à 8.8.8.8
(peut être lorsque le routeur est annoncer le serveur DNS IPv6 ) comme c'est le cas dans votre affaire. 192.168.1.1
doit être le premier (et de préférence le seul) DNS. Configurer IP fixe dans les paramètres Wi-Fi ou si vous avez Root, vous pouvez utiliser le pare-feu intégré du noyau Android. netfilter
pour forcer un serveur de noms. Puisque le DNS utilise le port UDP 53
effectuer une traduction d'adresse de réseau de destination (DNAT) :
~# iptables -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to 192.168.1.1:53
La solution non-root qui fonctionne à la fois pour le Wi-Fi et les données mobiles est d'utiliser une application VPN telle que Hôtes virtuels qui intercepte le trafic DNS et effectue des requêtes auprès du serveur DNS configuré en amont.
Sous Android Pie+, vous devez définir DNS privé désactivé car par défaut, le DNS sur TLS ( DoT
) envoie des requêtes DNS cryptées sur port 853 qui ne peut pas être interprété par les serveurs DNS ordinaires.
Pour plus de détails, voir Comment configurer correctement le DNS ?
DÉTAILS :
QU'EST-CE QUE LE DNS ?
Les hôtes du réseau (tout ce qui est connecté au réseau, y compris les ordinateurs, les téléphones, les imprimantes, les routeurs, etc.) s'identifient les uns les autres par des adresses ( IPv4
le plus courant de nos jours). Le nom d'hôte - qui correspond à une adresse IP - est relativement facile à retenir pour les humains. Quand un hôte veut accéder à un autre hôte par son nom, le nom d'hôte doit être résolu d'abord à l'adresse IP correspondante. Cette résolution de nom était facile à l'origine, notamment avant l'arrivée d'Internet, lorsque les réseaux étaient plus petits. /etc/hosts
sur chaque hôte contenait la correspondance entre l'IP et le nom d'hôte de tous les hôtes d'un réseau, toujours valable aujourd'hui. Lorsque la taille du réseau a augmenté, avec des milliers puis des millions d'hôtes, il n'a plus été possible de maintenir un fichier de correspondance entre l'IP et le nom d'hôte. hosts
d'un réseau en constante expansion, le système de nom de domaine a donc été introduit.
En termes simples, le DNS consiste en serveurs - un ou plusieurs hôtes sur un réseau local ou public - qui entretiennent un énorme hôtes base de données. On peut donc configurer le résolveur DNS sur son hôte pour qu'il contacte un serveur DNS spécifique (qui peut à son tour contacter d'autres serveurs de manière récursive) lorsqu'il doit résoudre un nom. Adresse IP du serveur DNS ( nameserver
) est généralement fourni par le serveur DHCP ou peut être défini manuellement. Il existe un certain nombre de DNS publics populaires tels que 1.1.1.1
(CloudFlare) et 8.8.8.8
(Google) etc. On peut configurer le résolveur DNS pour qu'il utilise le DNS souhaité, par exemple à partir des paramètres de l'interface graphique ou à l'aide de la fonction /etc/resolv.conf
sous Linux, mais Android n'offre pas de moyen très simple d'y parvenir. Voir Comment Android OS fait-il la résolution de nom DNS ? pour les détails.
SERVEUR DNS LOCAL
Donc maintenant, si vous voulez envoyer un ping à un hôte local par son nom, vous devez soit ajouter une entrée dans le fichier /etc/hosts
sur votre téléphone ou il devrait y avoir un serveur DNS sur votre réseau local. En fait, il y en aurait déjà un. La plupart des routeurs offrent les services de serveurs DHCP/DNS en plus d'agir comme des passerelles. Même lorsque vous créez un hotspot sur votre téléphone (et qu'il fonctionne comme un simple routeur), il exécute les fonctions suivantes dnsmasq
(jusqu'à Pie) comme son serveur DHCP/DNS. Mais afin de résoudre les hôtes locaux, le serveur DNS doit être un résolveur pas seulement transitaire .
DNS DYNAMIQUE AVEC DHCP
La question suivante est de savoir comment un serveur DNS local pourrait connaître les noms d'hôtes de tous les hôtes du réseau. Cela relève de la collaboration entre le client et le serveur DHCP. La communication DHCP se fait à l'aide de différents codes d'option. Code 12 est celui qui permet au client d'envoyer son nom d'hôte au serveur (ou peut aussi demande pour un nom d'hôte) lorsqu'on demande une adresse IP. Les hôtes Windows et Linux sont généralement configurés dès le départ pour envoyer leur nom d'hôte au serveur DHCP. ( 1 ) . Depuis Android 8 DHCPDISCOVER
y DHCPREQUEST
Les paquets n'incluent pas le nom d'hôte, donc les hôtes Android ne sont pas accessibles par les noms d'hôtes de cette façon. Voir Comment changer le nom de mon appareil Android ?
Le serveur DHCP transmet ensuite l'adresse IP attribuée ainsi que le nom d'hôte reçu/attribué au serveur DNS afin de mettre à jour sa base de données. ( 2 , 3 ) . Une citation d'un routeur configuration avancée :
Enregistrer les baux DHCP dans le résolveur DNS permet d'enregistrer les mappages statiques DHCP. Cela permet ensuite de résoudre les noms d'hôtes auxquels le serveur DHCP a attribué des adresses IP.
Il en va de même pour dnsmasq
:
Les machines qui sont configurées par DHCP ont leur nom automatiquement inclus dans le DNS.
Une autre solution pourrait consister à configurer votre serveur DHCP pour attribuer des adresses IP statiques et définir un nom d'hôte pour chaque IP. Voir cette réponse pour un peu plus de détails à ce sujet.
ALTERNATIVES DNS
Les requêtes DNS sont unicast c'est-à-dire qu'un hôte demande à un serveur DNS de résoudre un nom en l'appelant explicitement par son adresse IP. Toutefois, il est également possible d'appeler des hôtes par leur nom sur un réseau local sans utiliser le protocole hôtes ou un serveur DNS. Pour ce faire, on utilise le DNS multicast (un protocole à configuration nulle) dans lequel chaque hôte du réseau joue le rôle de client et de serveur. Lorsqu'un hôte envoie mDNS
requête à tous les hôtes du réseau à l'adresse multicast 224.0.0.251
où <hostname>.local
est l'hôte avec le nom hostname
répond lui-même avec son adresse IP, de sorte que la communication commence ( 4 ) .
Android dispose d'un système mDNS intégré, mais il ne fonctionne que si une application utilise le système mDNS. API NSD . Par exemple adbd
les départs forcés mdns
service ( 5 ) afin d'accéder facilement à un appareil Android (par exemple Raspberry Pi ) du PC. Voir cette réponse pour les détails.
Il existe également d'autres solutions de résolution de noms comme NIS
y LDAP
/ AD
généralement utilisé sur de grands réseaux privés ou NetBIOS
utilisé par le partage de fichiers de Windows. Mais la libc Bionic d'Android ne fournit pas un phénomène tel que NSS
pour donner la priorité à NIS, LDAP ou mDNS sur DNS. Le résolveur d'Android recherche uniquement hosts
avant d'aller chercher les DNS ( 6 ) . Vous devez donc opter pour l'un des deux.