Boot-camping your new bought Mac: DNS

Наверное, есть люди, которые просто покупают новый Macbook, и его настройки «из коробки» вполне им подходят. Если вы — UNIX-инженер, то на это, впрочем, не так уж много шансов. Что же может потребоваться? — Очевидно, если вы имеете дело с IT — либо hardware, либо software! Будем считать, что с hardware Apple справилась, поэтому, очевидно, вам нужен home brew. Кроме того, если networking для вас — не пустой звук, вам будет нужен Firewall — по-умолчанию он выключен, да и настроен не лучшим образом, если его даже и найти где включить. Что ж, до firewall-а мы ещё доберёмся, а в этой части Mac-настроек, я хочу задокументировать установку локального DNS-resolver’а. Зачем нужен свой DNS-resolver? — Этот вопрос мне приходилось слышать даже от коллег. Общий ответ на него, у меня, таков: «DNS слишком критичный сервис, чтобы оставлять его кому-либо ещё». Если вдаваться в причины, то может получиться такой список:

  • ваш канал в Internet может оказаться с ощутимой задержкой — в таком случае, кэширование DNS-ответов локально, существенно сократит время ожидания открытия WEB-страниц (да и не только их)
  • DNS-resolver может работать некорректно — например, вам могут выдавать спец. landing-сайты, если запрошенного домена не существует. Он может игнорировать или переопределять TTL записей
  • Вы не можете инвалидировать кэш DNS-сервера, который не под вашим управлением. Если вы внесли исправление в DNS-записи, а они уже были закэшированы, поможет вам только время. Запасайтесь терпением, и «не делайте так больше»

Поэтому, в общем-то, вопрос устанавливать локальный resolver для меня давно не стоит — очевидно, он нужен. На выбор есть несколько вариантов, и я выбираю Pdnsd. Он есть в home brew, так что установка тривиальна. Но дальше потребуется прикрутить его системно. Для этого пригодится вот такой plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>localdomain.pdnsd</string>

 <key>Program</key>
 <string>/usr/local/sbin/pdnsd</string>

 <key>ProgramArguments</key>
 <array>
 <!-- I'd say this is stupid, but you have to duplicate program path-name
 in ProgramArguments -->
 <string>/usr/local/sbin/pdnsd</string>
 </array>

 <key>RunAtLoad</key>
 <true/>

 <key>UserName</key>
 <string>nobody</string>

 <key>StandardErrorPath</key>
 <string>/dev/null</string>

 <key>StandardOutPath</key>
 <string>/dev/null</string>
</dict>
</plist>

Прикручивание:

  1. Сохрание plist-файл сервиса — сохрание этот файл в /Library/LaunchAgents/localdomain.pdnsd.plist
    • Нюанс: установка при помощи homebrew подразумевает, что владельцем файлов, установленных программ, является ваш пользователь. Если вас устраивает ситуация, когда сервис Pdnsd запущен под вашей учётной записью, нужно будет изменить ключ UserName — в примере, который приведён выше, там задан пользователь nobody. Если же вы предпочитаете разделение, и для DNS вам лучше подходит nobody, то менять plist не нужно, но нужно будет изменить владельцев кэша Pdnsnd, который у homebrew здесь: /usr/local/var/cache/pdnsd
  2. sudo launchctl load /Library/LaunchAgents/localdomain.pdnsd.plist

Проверка, что прикрутилось:

  • pgrep -l dns
    68561 pdnsd
  • sudo launchctl list | fgrep dns
    68595 0 localdomain.pdnsd
  • $ host ya.ru localhost
    Using domain server:
    Name: localhost
    Address: 127.0.0.1#53
    Aliases:
    
    ya.ru has address 213.180.193.3
    ya.ru has address 213.180.204.3
    ya.ru has address 93.158.134.3
    ya.ru has IPv6 address 2a02:6b8::3
    ya.ru mail is handled by 10 mx.yandex.ru.