Apache. Документация на русском


Разделы:   1      2      3    4    5    6    7    8    9    10    11    12    13    14    15    16  

Раздел 2. Использование HTTP-сервера Apache

Пункты:   6    7    8    9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25      26    

 <         > 
  RU            EN  

Пункт 26. Проблемы с DNS и Apache

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

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

 # Это пример неправильной конфигурации, не используйте на своем сервере
<Виртуальный хост www.example.dom>
 Администратор сервера webgirl@example.dom
 DocumentRoot "/www/пример"
</ виртуальный хост> 

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

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

 # Это пример неправильной конфигурации, не используйте на своем сервере
<Виртуальный хост 192.0.2.1>
 Администратор сервера webgirl@example.dom
 DocumentRoot "/www/пример"
</ виртуальный хост> 

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

Вот фрагмент, который позволяет избежать обеих этих проблем:

 <Виртуальный хост 192.0.2.1>
 Имя сервера www.example.dom
 Администратор сервера webgirl@example.dom
 DocumentRoot "/www/пример"
</ виртуальный хост> 

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

Рассмотрим этот фрагмент конфигурации:

 <Виртуальный хост www.example1.dom>
 Администратор сервера webgirl@example1.dom
 DocumentRoot "/www/example1"
</ виртуальный хост>
<Виртуальный хост www.example2.dom>
 Администратор сервера webguy@example2.dom
 DocumentRoot "/www/example2"
</ виртуальный хост> 

Предположим, вы назначили 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_:*> сервер, на котором нет страниц для обслуживания


 <         > 

Пункты:   6    7    8    9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25      26    

Рейтинг@Mail.ru