Tenho um aplicativo que tem um servidor mDNS em execução em um dispositivo ESP32. Seu nome de host é esp32-mdns.local
. Posso executar ping neste nome de host do Windows. No entanto, não é possível no meu sistema Ubuntu 22.04.
Reinstalei o daemon avahi e os utils novamente. Quando eu faço isso avahi-browse --all
:
avahi-browse -all
+ wlp0s20f3 IPv6 192-168-178-1 Microsoft Windows Network local
+ wlp0s20f3 IPv6 fritz-box Microsoft Windows Network local
+ wlp0s20f3 IPv4 192-168-178-1 Microsoft Windows Network local
+ wlp0s20f3 IPv4 fritz-box Microsoft Windows Network local
+ wlp0s20f3 IPv6 ESP32-WebServer1 Web Site local
+ wlp0s20f3 IPv6 ESP32-WebServer Web Site local
+ wlp0s20f3 IPv4 ESP32-WebServer1 Web Site local
+ wlp0s20f3 IPv4 ESP32-WebServer Web Site local
Então avahi-resolve --name esp32-mdns.local
:
avahi-resolve --name esp32-mdns.local
esp32-mdns.local 192.168.178.71
Então, o nome está sendo resolvido, mas quando eu faço ping nele:
ping esp32-mdns.local
ping: esp32-mdns.local: Name or service not known
Posso executar ping no endereço IP diretamente, mas não no nome do host.
Aqui está meu /etc/avahi/avahi-daemon.conf
arquivo. Estou esquecendo de algo? Ou qual pode ser o problema? Obrigado.
# avahi is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with avahi; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.
# See avahi-daemon.conf(5) for more information on this configuration
# file!
[server]
#host-name=foo
#domain-name=local
#browse-domains=0pointer.de, zeroconf.org
use-ipv4=yes
use-ipv6=yes
#allow-interfaces=eth0
#deny-interfaces=eth1
#check-response-ttl=no
#use-iff-running=no
#enable-dbus=yes
#disallow-other-stacks=no
#allow-point-to-point=no
#cache-entries-max=4096
#clients-max=4096
#objects-per-client-max=1024
#entries-per-entry-group-max=32
ratelimit-interval-usec=1000000
ratelimit-burst=1000
[wide-area]
enable-wide-area=yes
[publish]
#disable-publishing=no
#disable-user-service-publishing=no
Você precisa da
libnss_mdns_minimal.so
biblioteca instalada (do pacote "libnss-mdns") e configurada/etc/nsswitch.conf
para que o sistema saiba como se comunicar com o Avahi-daemon para procurar nomes de host.O pacote do Ubuntu provavelmente o habilitará automaticamente (ou habilitará o IPv4-only 'mdns4'; você pode então editar nsswitch.conf para mudar para a variante dual-stack). Se não for habilitado automaticamente, adicione
para a
hosts:
linha de /etc/nsswitch.conf, depois dofiles
módulo – mas antes dedns
ouresolve
. Por exemplo:Muitas distribuições recentes têm suporte parcial ao mDNS como parte do
resolve
módulo do systemd-resolved; você pode usá-lo, embora quando tentei pela última vez, ele insistiu em fazer consultas reversas ao mDNS para IPv6, fazendo com que cada pesquisa reversa demorasse muito (sem mencionar que entra em conflito com o avahi-daemon para consultas de entrada , então geralmente é melhor não misturar os dois).(Ou seja, se você tiver um programa que depende da API de descoberta de serviço DNS-SD do Avahi, então use o Avahi. Enquanto isso, se você só precisa da pesquisa de nome de host *.local e nada mais, você pode usar o Avahi ou o systemd-resolved, mas não os dois.)
No caso de systemd-resolved, o módulo nsswitch.conf é chamado
resolve
– o mesmo módulo manipula DNS e mDNS – e deve ser listado na mesma posição (mas neste caso você pode omitirdns
, embora seja comum incluí-lo como fallback de emergência):O suporte mDNS do resolved precisa ser habilitado via ou por meio de perfis de conexão
/etc/systemd/resolved.conf
individuais do systemd- networkdMulticastDNS=
como opção, ou por meio de perfis de conexão do NetworkManager comoconnection.mdns
opção. (Você não precisa fazer nada disso para o Avahi.)A combinação de Avahi para mDNS e systemd-resolved para DNS regular ficaria assim: