Локальный resolve systemd-resolved

Thank you for reading this post, don't forget to subscribe!

Установка и первичная настройка systemd-resolved

Для рабо­ты с systemd-resolved вам пона­до­бит­ся демон systemd-resolved.
yum install systemd-resolved

Так же необ­хо­ди­мо убе­дить­ся в нали­чии биб­лио­те­ки libnss_resolve.so - без нее при­ло­же­ния не смо­гут свя­зы­вать­ся с резолвером.

Сле­ду­ю­щим шагом будет прав­ка фай­ла /etc/nsswitch.conf. Нахо­дим строч­ку, начи­на­ю­щу­ю­ся с "hosts:" и при­во­дим к виду:

hosts: files resolve

Пояс­ним. Эта стро­ка отве­ча­ет за после­до­ва­тель­ность обра­ще­ний при­ло­же­ния к систем­ным ком­по­нен­там с целью резолвин­га инте­ре­су­ю­ще­го при­ло­же­ние име­ни. В дан­ном слу­чае сна­ча­ла про­грам­ма загля­нет в файл /etc/hosts и, если не обна­ру­жит там воз­мож­но­стей по разы­ме­но­ва­нию (сов­па­де­ния по име­ни), обра­тить­ся уже к демо­ну systemd-resolved с прось­бой сде­лать это для себя люби­мой. Ранее в этой стро­ке у вас ско­рее все­го было упо­ми­на­ние сло­ва "dns", застав­ля­ю­щее при­ло­же­ние само­сто­я­тель­но обра­щать­ся к DNS сер­ве­рам с целью резолвин­га. Мы уда­ли­ли эту воз­мож­ность за более нена­доб­но­стью. К тому же этот спо­соб зна­чи­тель­но мед­лен­нее, чем обра­ще­ние напря­мую к локаль­но уста­нов­лен­но­му демо­ну systemd-resolved, кото­рый, к сло­ву, еще и под­дер­жи­ва­ет кэши­ро­ва­ние полу­чен­ных запи­сей. Конеч­но же, самое пер­вое обра­ще­ние всё рав­но будет сопро­вож­дать­ся запро­сом systemd-resolved к DNS сер­ве­рам, но потом накоп­лен­ный кэш суще­ствен­но уско­рит эти опе­ра­ции. Неболь­шое заме­ча­ние: конеч­но же, при­ло­же­ние само не дела­ет ника­ких обра­ще­ний - оно про­сто не уме­ет. Всё это дела­ет­ся по сред­ствам биб­лио­теч­ных вызо­вов. Имен­но поэто­му мы доуста­нав­ли­ва­ли биб­лио­те­ки в нача­ле ста­тьи и имен­но поэто­му исполь­зо­ва­ние systemd-resolved эффек­тив­нее, пото­му что биб­лио­теч­ные вызо­вы быст­рее, чем обра­ще­ния, про­из­во­ди­мые с исполь­зо­ва­ни­ем сте­ка TCP/IP.

Откры­тым остал­ся вопрос о том, как сооб­щить systemd-resolved IP-адре­са DNS сер­ве­ров, к кото­рым сле­ду­ет обра­щать­ся для разы­ме­но­ва­ния запро­сов при­ло­же­ний. Мож­но опре­де­лить DNS сер­ве­ра в фай­ле /etc/systemd/resolved.conf, мож­но их опре­де­лить в фай­лах ".network" демо­на systemd-networkd, а мож­но, поль­зу­ясь DHCP с при­вле­че­ни­ем того же systemd-networkd полу­чать эти адре­са авто­ма­ти­че­ски от сер­ве­ра DHCP. Но для это­го у вас дол­жен быть запу­щен и настро­ен systemd-networkd. Если его нет, или вы не хоти­те его исполь­зо­вать, то един­ствен­ным вари­ан­том оста­ет­ся /etc/systemd/resolved.conf.

Для целей сов­ме­сти­мо­сти с при­ло­же­ни­я­ми, кото­рые по каким-либо при­чи­нам не исполь­зу­ют биб­лио­теч­ные вызо­вы, а обра­ща­ют­ся к DNS сер­ве­рам напря­мую, полу­чая их IP-адре­са из /etc/resolv.conf, сле­ду­ет создать сим­во­ли­че­скую ссылку:

ln -svi /run/systemd/resolve/resolv.conf /etc/resolv.conf

Нам оста­ет­ся толь­ко запу­стить сер­вис и насла­ждать­ся резолвин­гом с помо­щью systemd-resolved:

systemctl enable systemd-resolved
systemctl start systemd-resolved

LLMNR в systemd-resolved

Отдель­но­го упо­ми­на­ния заслу­жи­ва­ет под­держ­ка в systemd-resolved про­то­ко­ла LLMNR (Link-Local Multicast Name Resolution). Этот про­то­кол поз­во­ля­ет узлам в одной сети (широ­ко­ве­ща­тель­ном домене) обра­щать­ся друг к дру­гу по име­ни хоста, не при­бе­гая к услу­гам DNS вооб­ще. Рабо­та­ет это сле­ду­ю­щим обра­зом: какая-нибудь про­грам­ма пыта­ет­ся обра­тить­ся к хосту в сво­ей сети по име­ни, исполь­зуя, как мы уже упо­ми­на­ли, биб­лио­теч­ные вызо­вы; локаль­ный DNS-резолвер, как напри­мер герой нашей ста­тьи - systemd-resolved, сна­ча­ла попы­та­ет­ся най­ти запра­ши­ва­е­мый хост в сво­ей сети, делая груп­по­вой запрос на адрес 224.0.0.252 для ipv4 и FF02::1:3 для ipv6; если в сети есть хосты с под­держ­кой LLMNR и сре­ди них ока­жет­ся тот, имя кото­ро­го будет соот­вет­ство­вать запра­ши­ва­е­мо­му, systemd-resolved неза­мед­ли­тель­но вер­нет запра­ши­ва­ю­щей про­грам­ме IP-адрес инте­ре­су­ю­ще­го ее хоста. Одна­ко сто­ит заме­тить, что для рабо­ты это­го про­то­ко­ла очень важ­но пра­виль­но кон­фи­гу­ри­ро­вать hostname на каж­дом ком­пью­те­ре в сети. Вы долж­ны исполь­зо­вать корот­кую нота­цию - не FQDN. В linux имя хоста ука­зы­ва­ет­ся в /etc/hostname. Вы так­же може­те исполь­зо­ать коман­ду 'hostnamectl set-hostname NAME' для горя­че­го изме­не­ния hostname ком­пью­те­ра. Ну и конеч­но же, LLMNR дол­жен быть вклю­чен в вашем systemd-resolved. Это мож­но про­ве­рить по выво­ду коман­ды ss:

ss -ntpul | grep 5355
udp UNCONN  0 0     *:5355 *:* users:(("systemd-resolve",pid=15784,fd=12))
udp UNCONN  0 0     :::5355 :::* users:(("systemd-resolve",pid=15784,fd=11))
tcp  LISTEN      0 128 *:5355 *:* users:(("systemd-resolve",pid=15784,fd=14))
tcp  LISTEN      0 128 :::5355 :::* users:(("systemd-resolve",pid=15784,fd=15))

стан­дарт­ный порт LLMNR - 5355 для TCP и UDP. Если вы обна­ру­жи­ли, что LLMNR порт никем не слу­ша­ет­ся, про­верь­те настрой­ки в фай­ле /etc/systemd/resolved.conf - LLMNR дол­жен быть выстав­лен в "yes".

В завер­ше­нии ста­тьи неболь­шое отступ­ле­ние, сове­ты по использованию:

  • Исполь­зуй­те systemd-resolved в паре с systemd-networkd. У вас появит­ся воз­мож­ность авто­ма­ти­че­ски полу­чать настрой­ки DNS с DHCP сервера
  • Уда­ли­те дру­гие локаль­ные кэши­ру­ю­щие DNS заглуш­ки - они боль­ше не нуж­ны. К ним отно­сят­ся dnsmasq и прочие