Spec-Zone.ru › Apache HTTP Server

Проблемы, связанные с DNS и Apache HTTP Server

Эту страницу можно кратко изложить следующим образом: не настраивайте Apache HTTP Server так, чтобы при разборе файлов конфигурации он зависел от разрешения DNS-имен. Если для разбора файлов конфигурации httpd требуется разрешение DNS-имен, ваш сервер может столкнуться с проблемами надежности (например, он может не запуститься) или подвергнуться атакам типа «отказ в обслуживании» и краже обслуживания (в том числе виртуальные хосты могут перехватывать запросы, предназначенные для других виртуальных хостов).

Простой пример

# This is a misconfiguration example, do not use on your server
<VirtualHost www.example.dom>
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

Для правильной работы серверу абсолютно необходимы две сведения о каждом виртуальном хосте: ServerName и как минимум один IP-адрес, к которому сервер будет привязываться и на который будет отвечать. В приведенном выше примере IP-адрес не указан, поэтому httpd должен использовать DNS, чтобы найти адрес www.example.dom. Если по какой-либо причине DNS недоступен в момент, когда сервер разбирает файл конфигурации, этот виртуальный хост не будет настроен. Он не сможет отвечать на запросы к этому виртуальному хосту.

Предположим, что www.example.dom имеет адрес 192.0.2.1. Рассмотрим следующий фрагмент конфигурации:

# This is a misconfiguration example, do not use on your server
<VirtualHost 192.0.2.1>
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

На этот раз httpd должен использовать обратный DNS-поиск, чтобы найти ServerName для этого виртуального хоста. Если этот обратный поиск завершится неудачей, виртуальный хост будет частично отключен. Если виртуальный хост основан на имени, он фактически будет полностью отключен, а если он основан на IP-адресе, то в основном будет работать. Однако если httpd когда-либо потребуется сформировать полный URL сервера, содержащий имя сервера (например, при выполнении перенаправления), создать корректный URL не удастся.

Ниже приведен фрагмент, позволяющий избежать обеих этих проблем:

<VirtualHost 192.0.2.1>
  ServerName www.example.dom
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

Отказ в обслуживании

Рассмотрим следующий фрагмент конфигурации:

<VirtualHost www.example1.dom>
  ServerAdmin webgirl@example1.dom
  DocumentRoot "/www/example1"
</VirtualHost>
<VirtualHost www.example2.dom>
  ServerAdmin webguy@example2.dom
  DocumentRoot "/www/example2"
</VirtualHost>

Предположим, что вы назначили адрес 192.0.2.1 для www.example1.dom и адрес 192.0.2.2 для www.example2.dom. Кроме того, предположим, что example1.dom контролирует собственную DNS-зону. С этой конфигурацией вы поставили example1.dom в положение, позволяющее перехватывать весь трафик, предназначенный для example2.dom. Для этого достаточно указать для www.example1.dom адрес 192.0.2.2. Поскольку они контролируют собственную DNS-зону, вы не сможете помешать им направить запись www.example1.dom куда угодно.

Запросы, поступающие на адрес 192.0.2.2 (в том числе все запросы, для которых пользователи вводили URL вида http://www.example2.dom/whatever), будут обслуживаться виртуальным хостом example1.dom. Чтобы лучше понять, почему это происходит, нужно подробнее рассмотреть, как httpd сопоставляет входящие запросы с виртуальным хостом, который будет их обслуживать. Доступен краткий документ с описанием этого процесса.

Адрес «основного сервера»

Поддержка виртуальных хостов, основанных на имени требует, чтобы httpd знал IP-адреса узла, на котором работает httpd. Чтобы получить этот адрес, он использует либо глобальную переменную ServerName (если она задана), либо вызывает функцию C gethostname (которая должна возвращать тот же результат, что и команда «hostname» в командной строке). Затем для этого адреса выполняется DNS-поиск. В настоящее время избежать этого поиска невозможно.

Если вы опасаетесь, что этот поиск может завершиться неудачей из-за сбоя DNS-сервера, добавьте имя узла в /etc/hosts (вероятно, оно там уже указано, чтобы машина могла правильно загружаться). Затем убедитесь, что ваша машина настроена на использование /etc/hosts в случае сбоя DNS. В зависимости от используемой ОС для этого может потребоваться отредактировать /etc/resolv.conf или, возможно, /etc/nsswitch.conf.

Если серверу не нужно выполнять DNS-поиск по каким-либо другим причинам, возможно, вам удастся запустить httpd, установив переменную окружения HOSTRESORDER в значение «local». Это зависит от используемой ОС и библиотек разрешения имен. Это также влияет на CGI-программы, если вы не используете mod_env для управления окружением. Лучше всего обратиться к справочным страницам или разделам часто задаваемых вопросов для вашей ОС.

Как избежать этих проблем

  • используйте IP-адреса в VirtualHost
  • используйте IP-адреса в Listen
  • убедитесь, что для всех виртуальных хостов явно задан ServerName
  • создайте сервер <VirtualHost _default_:*>, на котором нет страниц для обслуживания

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/dns-caveats.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API