DNS Resolution Сбой для ping и curl, но не копать

11

Я использую DNSMasq в качестве локального DNS-сервера, поэтому могу решить *.local.pcfdev.io(как обсуждено здесь Использование PCF Dev Offline с Mac OS X ). Все работало, когда я впервые все настраивал.

Пару дней спустя, после нескольких перезагрузок моего MacBook, в то время как в автономном режиме я больше не могу разрешать такие вещи, как api.local.pcfdev.ioиспользование curlили ping. Однако digпоступает правильно.

$ dig api.local.pcfdev.io

; <<>> DiG 9.8.3-P1 <<>> api.local.pcfdev.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46877
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;api.local.pcfdev.io.       IN      A

;; ANSWER SECTION:
api.local.pcfdev.io.    0       IN      A       192.168.11.11

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Sep  6 10:17:44 2016
;; MSG SIZE  rcvd: 53

$ curl api.local.pcfdev.io
curl: (6) Could not resolve host: api.local.pcfdev.io

Я попытался добавить -AlwaysAppendSearchDomainsв качестве аргумента /usr/sbin/mDNSResponderв /System/Library/LaunchDaemons/com.apple.mDNSResponder.plistи перезапустил mDNSResponder с launchctl, но безрезультатно.


ОБНОВЛЕНИЕ 1

Определенно что-то прослушивается на правильном локальном IP:

$ nslookup api.local.pcfdev.io
Server:     127.0.0.1
Address:        127.0.0.1#53

Name:   api.local.pcfdev.io
Address: 192.168.11.11

$ ping api.local.pcfdev.io
ping: cannot resolve api.local.pcfdev.io: Unknown host

$ telnet 192.168.11.11 80
Trying 192.168.11.11...
Connected to 192.168.11.11.
Escape character is '^]'.

HTTP/1.1 400 Bad Request

Connection closed by foreign host.

ОБНОВЛЕНИЕ 2

После попытки предложенного ниже предложения об удалении всех DNS-серверов из сетевых настроек, кроме как 127.0.0.1, я ничего не могу решить. Мне удалось получить некоторые отладочные журналы mDNSResponder:

mDNSResponder[91]:  74: DNSServiceCreateConnection START PID[32612](ping)
mDNSResponder[91]:  74: Error socket 75 created 00000000 00000001
mDNSResponder[91]:  74: DNSServiceQueryRecord(15000, 0, api.local.pcfdev.io., Addr) START PID[32612]()
mDNSResponder[91]:  74: Error socket 75 closed  00000000 00000001 (0)
mDNSResponder[91]:  74: DNSServiceQueryRecord(api.local.pcfdev.io., Addr) ADD    0 api.local.pcfdev.io. Addr
mDNSResponder[91]:  74: Cancel 00000000 00000001
mDNSResponder[91]:  74: DNSServiceQueryRecord(api.local.pcfdev.io., Addr) STOP PID[32612]()
mDNSResponder[91]:  74: DNSServiceCreateConnection STOP PID[32612](ping)

Я также заметил это, как объяснено в предложенном ответе, nslookupи digне вызывал ничего, чтобы регистрироваться mDNSResponder, но другие инструменты ( ping, curl) делают.

Похоже, по какой-то причине dnsmasqон не работает (я могу установить TCP-соединение 127.0.0.1:53) или mDNSResponderне использует его.


ОБНОВЛЕНИЕ 3

etc/resolve.confперестает существовать, когда мой адаптер Wi-Fi активен, но я не подключен к сети. Может быть, поэтому инструменты CLI не используют локальный dnsmasqсервер?

EngineerBetter_DJ
источник
Ваш сетевой адаптер случайно отключен? Если вы перейдете к «Сеть» в Системных настройках, есть ли зеленая точка рядом с адаптером, в котором dnsmasq настроен для использования?
манго
Ну, я в поезде без Wi-Fi, так что предположительно.
EngineerBetter_DJ
1
В частности, адаптер Wi-Fi выключен? Если это так, пожалуйста, попробуйте еще раз с включенным адаптером Wi-Fi (даже если он на самом деле не подключен к Интернету). Для установки на работу, Dnsmasq должен быть DNS - сервер на сетевом интерфейсе в использовании .
манго,
Спасибо за попытку отследить это. Я также борюсь с этим, не понимаю, почему "curl foo: 8989" не может найти хост, а "dig foo" может. Да, "curl 172.20.0.17:8989" работает нормально. Как и у вас, у меня DNS сети Wi-Fi установлен на 127.0.0.1 (dnsmasq работает в контейнере Docker). FWIW в моей текущей ситуации, проблема специфична для сети Wi-Fi, к которой я подключаюсь - отлично работает на моей личной точке доступа, проблема на Wi-Fi кафе.
Джамшид
Я не перепроектировал рассматриваемые программы, но я ожидаю, что они вызывают совершенно разные базы кода разрешения DNS, и именно поэтому вы видите сбой - некоторые указывают локально, другие нет. Я бы , вероятно , копаться curlили wgetили получить их в инструменты / профилировщика / отладчик и посмотреть , что на самом деле происходит , чтобы вызвать не может ошибка решительность.
bmike

Ответы:

12

Была такая же проблема. Я думаю, что локальный кэш DNS имел плохие данные из моего предыдущего тестирования. Это было быстро исправлено:

sudo killall -HUP mDNSResponder
cmcginty
источник
1
Я заметил это pingи digиногда возвращаю разные IP-адреса (обычно с разделенным горизонтом DNS), и эта команда исправляет это. Какова основная причина, я не уверен, к сожалению.
Джеймс
7

dig с одной стороны и curl / ping с другой стороны получают данные с разных хостов:

dig запрашивает DNS-сервер - в вашем случае ваш localhost (127.0.0.1) - для записи базы данных: IP-адрес, связанный с полным доменным именем api.local.pcfdev.io. Сам хост не должен запускаться или вообще существовать.

curl / ping пытается разрешить IP-адрес с помощью mDNSResponder или другими способами и, наконец, работать на / взаимодействовать с удаленным хостом. Если хост 192.168.11.11 не запускается или не существует вообще, оба не удастся.

Теперь либо запись DNS неверна (api.local.pcfdev.io имеет другой IP-адрес, чем 192.168.11.11), либо запись DNS верна, но хост 192.168.11.11 не работает.


Добавление -AlwaysAppendSearchDomains в качестве аргумента для / usr / sbin / mDNSResponder в /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist не рекомендуется. Вместо этого вы должны добавить его в /Library/Preferences/com.apple.mDNSResponder.plist (source:) man mDNSResponder:

Чтобы заставить mDNSResponder работать с этими дополнительными аргументами при запуске в OS X 10.11 (El Capitan) и более поздних версиях, установите логические ключи AlwaysAppendSearchDomains или NoMulticastAdvertisements в true в /Library/Preferences/com.apple.mDNSResponder.plist и перезагрузите компьютер.

В вашем случае совсем не обязательно устанавливать этот ключ, потому что это не причина вашей проблемы.


После копания в VirtualBox, PCF Dev (неоднократный сбой с некоторыми «неправильными учетными данными» при попытке войти в виртуальную машину) и dnsmasq я рекомендую передавать DNS-запросы только в dnsmasq:

  • В Системных настройках> Сеть> Интерфейс> DNS-сервер удалите все DNS-серверы, кроме 127.0.0.1, и примените изменения. Вы также можете настроить второе местоположение с настройкой только 127.0.0.1 и сохранить текущий DNS-сервер в другой конфигурации.
  • добавьте файл /usr/local/etc/resolv.dnsmasq.conf с содержимым

    #use your preferred DNS servers here. In the example I use some Google name servers
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    
  • добавить resolv-file=/usr/local/etc/resolv.dnsmasq.confв строку ~ 46 файла /usr/local/etc/dnsmasq.conf
  • добавить или переместить address=/.local.pcfdev.io/192.168.11.11в / на строку ~ 80 из /usr/local/etc/dnsmasq.conf
  • перезапустите dnsmasq с помощью:

    sudo launchctl stop homebrew.mxcl.dnsmasq
    sudo launchctl start homebrew.mxcl.dnsmasq
    
klanomath
источник
Спасибо, что нашли время ответить. Там определенно что-то слушают 192.168.11.11; фактическая публичная запись DNS *.local.pcfdev.ioвсегда указывает на один и тот же локальный IP-адрес, поэтому, как только я подключаюсь к информационным сетям, я curlдолжен получить ответ от этого DNS-сервера и определить, какой IP-адрес использовать.
EngineerBetter_DJ
1
Похоже curl, pingи другие исполняемые файлы , я хочу , чтобы поразить эту вещь использует одно средство из отрываясь записей DNS (который не используется dnsmasqсервером на локальном хосте), а также nslookupи digиспользуют другие средства. Я думаю, мне нужно узнать больше о mDNSResponder!
EngineerBetter_DJ
@EngineerBetter У вас есть другие записи в Системных настройках> Сеть> Интерфейс> DNS, кроме 127.0.0.1? - Я собираюсь установить весь пакет (VBox, PCF Dev и т. Д.) И проверить это ... Какой-нибудь специальный конфиг?
Кланомат
Еще раз спасибо, что нашли время, чтобы помочь мне с этим. Вопрос был обновлен, все еще не повезло.
EngineerBetter_DJ
0

Мне потребовалось гораздо больше времени, чтобы решить эту проблему, чем следовало бы. После перезапуска mDNSResolver десятки раз, как рекомендуется для других потоков:

sudo killall -HUP mDNSResponder

Я наконец попробовал что-то еще. Я отключил Wi-Fi и удалил все мои любимые сети. Затем я восстановил соединение Wi-Fi, и все заработало:

  1. Меню Apple -> Системные настройки -> Wi-Fi (слева)
  2. «Отключите Wi-Fi», затем выберите «Дополнительно»
  3. Удалите соединение Wi-Fi, с которым у вас возникли проблемы (или все, если хотите). Для этого выберите сеть Wi-Fi, которую хотите удалить, и нажмите «-».
  4. Нажмите «Применить» и «ОК»
  5. Снова включите Wi-Fi.
  6. Выберите свою сеть Wi-Fi и войдите снова.

YMMV, но это то, что, наконец, сработало для меня. Вероятно, это должно было быть первым, что я попробовал.

Джоэл Гриффитс
источник