Мой адрес mdns myhost.local ошибочно связан с виртуальной сетью Docker, а не с моей сетью Wi-Fi
Вкратце: как я могу получить доступ к моему интерфейсу Wi-Fi, а не к виртуальной сети Docker?
Имя хоста моей настольной системы — «myhost» (от
/etc/hostnameд.), под управлением Ubuntu 18.04.
ip aкоманда говорит мне, что мой IP-адрес Wi-Fi
192.168.0.6, а мой редко используемый IP-адрес в сети докеров
172.17.0.1.
Мне нравится использовать mdns/Avahi для доступа к моему рабочему столу через «myhost.local», например, при подключении к локальным ноутбукам jupyter с других хостов в моей домашней локальной сети.
По какой-то причине mdns назначает два адреса:
$ host myhost.local
myhost.local has address 192.168.0.6
myhost.local has address 172.17.0.1
myhost.local has IPv6 address fe80::46da:e48:c3c0:112
Ноутбук Jupyter работает с
ip=192.168.0.6
Когда я
ping myhost.local, или подключиться к
http://myhost.local:8888/несколько месяцев назад он работал, но теперь он пытается использовать адрес 172.17.0.1, который не работает для jupyter.
Похоже, это связано с оставшимся без ответа вопросом на форуме сообщества Docker: сетевой интерфейс Docker мешает адресу mDNS .
Обновление : чтобы ответить на вопрос, это файл hosts. Я думаю, что это происходит из-за того, что Ubuntu по умолчанию настраивает файл hosts, поэтому
localhostна самом деле не то же самое, что
myhost, но я, возможно, подправил его.
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 myhost
Бонусное обновление
user10489правильно отмечает, что другие хосты разрешат
myhost.localчерез mdns нормально. И моя основная проблема заключалась в том, что я хотел знать, какой IP-адрес настроить в моем
jupyter notebookсделать его доступным через мою беспроводную локальную сеть. Просто мы не видим простого способа использовать mdns на локальной машине для получения этого ответа.
Решение этой основной проблемы заключается в том, чтобы просто выяснить, какой IP-адрес у меня есть на данном интерфейсе (здесь показано с неуклюжим именем первой беспроводной сети Ubuntu):
dev=wlp3s0
ip=$(ip -br -o a show $dev | (read interface status ip ip6; echo ${ip%/*}))
jupyter notebook --no-browser --ip=$ip
2 ответа
По умолчанию здесь активны несколько механизмов разрешения имен:
- /и т.д./хосты
- мднс
- DNS
Это порядок по умолчанию, и mdns обычно пытается разрешить *.local
Но также учтите, что это имеет место отдельно для двух машин — локальной и удаленной.
Таким образом, если вы хотите, чтобы myhost.local разрешал определенный интерфейс без отключения mdns на других интерфейсах, вы должны иметь возможность просто поместить переопределение в /etc/hosts. Однако это влияет только на локальную машину.
Удаленные машины разрешат myhost.local любым трансляциям mdns, которые они услышат. Поэтому, если они находятся в вашей сети докеров и в вашей локальной сети (как и на вашей локальной машине), они получат все эти адреса от mdns. Если они находятся только в одной из этих сетей, они должны видеть только адрес, соответствующий этой сети.
Поэтому, возможно, решение состоит не в изменении конфигурации, а в изменении хоста, который вы используете, чтобы задать вопрос.
Читая справочную страницу файла конфигурации демона avahi (/etc/avahi/avahi-daemon.conf), вы можете указать интерфейсы, которые вы явно хотите запретить:
deny-interfaces= Установите список сетевых интерфейсов, разделенных запятыми, которые должны игнорироваться avahi-daemon. Будут использоваться другие неуказанные интерфейсы, если не установлен параметр allow-interfaces. Эта опция имеет приоритет над deny-interfaces.
Так что, возможно, попробуйте добавить строку «deny-interfaces=docker0» в этот файл (всегда делайте резервную копию оригинала!), А затем перезагрузите его с помощью «avahi-daemon --reload». Измените «docker0» на то, как называется ваш интерфейс докера, хотя я думаю, что это значение по умолчанию.
https://linux.die.net/man/5/avahi-daemon.conf
http://manpages.ubuntu.com/manpages/bionic/man8/avahi-daemon.8.html