Виртуальность

Denis Kolisnichenko

В статье пойдет речь о конфигурировании виртуальных HTTP- и FTP-серверов. В качестве HTTP сервера будет рассмотрен Apache, а создание виртуального FTP-сервера будет происходить с использованием FTP-серверов wu-ftp и ProFTP.

Для начала определимся что такое виртуальный сервер? Как и подразумевает слово "виртуальный", наш сервер не будет существовать физически, но пользователь будет считать, что он работает с реальным сервером.

Установка виртуального Web-сервера
Идентификация по имени
Идентификация по IP-адресу
Подключение почтового интерфейса
Установка виртуального FTP-сервера
Директивы файла конфигурации FTP-сервера


Виртуальный HTTP-сервер

Концепция виртуальных хостов позволяет Apache поддерживать несколько Web-узлов. Получается, что один Web-сервер заменяет несколько и пользователи видят отдельные Web-узлы. Это очень удобно, если нужно организовать персональные Web-узлы пользователей или собственные Web-узлы подразделений компании, например develop.mycompany.com

Apache можно настроить несколькими способами: чтобы запускался один сервер, который будет прослушивать ВСЕ обращения к виртуальным серверам, или запускать отдельный процесс для каждого виртуального сервера. В первом случае один сервер будет одновременно обслуживать все виртуальные. Если вас интересует такой вариант, нужно настраивать виртуальные сервера с помощью директивы VirtualHost. Настройка отдельны процессов для каждого сервера осуществляется с помощью директивы Listen и BindAddress.

В статье я буду рассматривать именно первый случай. Внутри блока директивы VirtualHost можно использовать любые директивы, кроме ServerType, BindAddress, Listen, NameVirtualHost, ServerRoot, TypesConfig, PidFile, MinRequestPerChild, MaxSpareServers, MinSpareServers, так как некоторые из них относятся к основному HTTP-серверу (например, ServerType), а некоторые - ко второму варианту настройки виртуальных серверов и здесь неприемлемы. Обязательно должны присутствовать директивы ServerName, DocumentRoot, ServerAdmin и ErrorLog

В зависимости от версии и от настроек Apache виртуальные узлы могут прописываться или в файле httpd.conf или в файле vhosts.conf

Виртуальные сервера можно идентифицировать по имени или по IP-адресу.


Виртуальные сервера с идентификацией по имени

Идентификация по имени имеет существенное преимущество перед идентификацией по IP-адресу: вы не ограничены количеством адресов, имеющемся у вас в распоряжении. Вы можете использовать любое количество виртуальных серверов и при этом вам не потребуются дополнительные адреса. Такое возможно благодаря использованию протокола HTTP/1.1. Данный протокол поддерживается всеми современными броузерами.

Поддержка виртуальных хостов обеспечивается директивами VirtualHost и NameVirtualHost. Если ваша система имеет только один IP-адрес, его нужно указать в директиве VirtualHost. Внутри блока директивы VirtualHost записывается директива ServerName. Эта директива задает доменное имя для нашего виртуального сервера. Это обязательно нужно сделать, чтобы избежать поиска службой DNS - мы же не хотим, чтобы при неудачном поиске виртуальный сервер был заблокирован? Все директивы VirtualHost используют один и тот же IP-адрес, заданный директивой NameVirtualHost. В блоке VirtualHost записываются параметры виртуального сервера, причем они записываются для каждого виртуального сервера отдельно.

Пример 1.1. Создадим два виртуальных сервера - www и lib


ServerName den.dhsilabs.com

<NameVirtulaHost 192.168.1.1>

<VirtualHost 192.168.1.1>
	ServerName www.dhsilabs.com
	ServerAdmin webmaster@den.dhsilabs.com
	DocumentRoot /var/httpd/www/html
	ErrorLog /var/https/www/logs/error.log
	TransferLog logs/access.log 
</VirtualHost>

<VirtualHost 192.168.1.1>
	ServerName lib.dhsilabs.com
	ServerAdmin webmaster@den.dhsilabs.com
	DocumentRoot /var/httpd/lib/html
	ErrorLog /var/https/lib/logs/error.log
	TransferLog logs/access.log 
</VirtualHost>

Если ваша система имеет только один IP-адрес, доступ к основному серверу станет невозможным, то есть вы не сможете использовать его напрямую. Можно основной сервер использовать в качестве виртуального, что я и сделал в примере 1.1.: основной сервер www является виртуальным. При наличии двух IP-адресов можно один присвоить основному серверу, а другой - виртуальным.

Apache позволяет использовать несколько доменных имен для доступа к одному серверу: ServerAlias www.dhsilabs.com www2.dhsilabs.com

Запросы, посланные по IP-адресам, которые присвоены нашим виртуальным хостам, должны соответствовать одному из указанных доменных имен. Чтобы зафиксировать запросы, не соотвествующие ни одному их этих имен, нужно с помощью опции default:* создать виртуальный хост, который будет обслуживать такие запросы: <VitrualHost _default_:*>

Обратите внимание на то, что адреса www.dhsilabs.com и lib.dhsilabs.com должны быть прописаны в DNS


Виртуальные сервера с идентификацией по IP-адресу

В директиве VirtualHost в качестве адресов можно использовать доменные имена, но лучше указывать IP-адрес, причем действительный, а не виртуальный. В этом случае вы не будете зависеть от DNS при резолвинге. Также потребуется один IP-адрес для вашего основного сервера. Если распределить все адреса между виртуальными серверами, то нельзя будет получить доступ к основному серверу.

Пример 1.2.


<VitrualHost 192.168.1.2>
	ServerName www.dhsilabs.com
	ServerAdmin webmaster@den.dhsilabs.com
	DocumentRoot /var/httpd/www/html
	ErrorLog /var/https/www/logs/error.log	
</VirtualHost>

<VirtualHost lib.dhsilabs.com>
	ServerName lib.dhsilabs.com
	ServerAdmin webmaster@den.dhsilabs.com
	DocumentRoot /var/httpd/lib/html
	ErrorLog /var/https/lib/logs/error.log
</VirtualHost>

В приведенном примере сконфигурированы два виртуальных сервера и идентификацией по IP-адресу. Один из них использует сам IP-адрес, а другой - доменное имя, соответствующее IP-адресу.

При конфигурировании виртульных серверов можно использовать опцию ExeсCGI, которая разрешает выполнение CGI-скриптов на виртуальном сервере. Ниже приведен пример для почтового Web-интерфейса:

Пример 1.3. Подключение почтового Web-интерфейса



# Файл httpd.conf

<Directory /home/httpd/mail>
	order deny,allow 
	deny from all 
	allow from localhost 
	allow from 192.168 
	allow from 123.123.123.123 
	Options ExecCGI 
</Directory> 

# Файл vhosts.conf

<VirtualHost 123.123.123.123> 
	ServerAdmin webmaster@den.dhsilabs.com 
	DocumentRoot /home/httpd/mail 
	ServerPath /mail 
	ServerName wwwmail.dhsilabs.com 
	ErrorLog logs/error_log 
	TransferLog logs/access_log 
	ErrorDocument 403 http://www.dhsilabs.com/messages/error403.html 
</VirtualHost> 

# Error 403 - доступ извне, то есть почтовый интерфейс будет доступен только 
# из локальной сети


Виртуальный FTP-сервер

Рассмотрим конфигурирование виртуального FTP-сервера на примере ProFTP. Демон proftpd позволяет обслуживать сразу несколько FTP-узлов. Виртуальные FTP-узлы нужны когда мы, например, хотим организовать несколько FTP-узлов - один для одной рабочей группы, другой - для второй, в третий может быть анонимным и т.д.

Настройка виртуального FTP-узла очень похожа на настройку виртуального Web-сервера - даже используется та же директива VirtualHost. Linux может поддерживать несколько Ip-адресов, благодаря чему мы можем создать виртуальные узлы. Дополнительные IP-адреса, которыми вы располагаете можно использоваться виртуальными узлами. При конфигурировании виртуальных FTP-узлов каждому виртуальному узлу нужно присвоить отдельный IP-адрес.

Для конфигурирования виртуального FTP в файл proftpd.conf нужно добавить директиву VirtualHost, содержащую IP-адрес.


<VirtualHost 192.168.1.5>
 ServerName "Virtual FTP Server"
</VirtualHost>

В блок VirtualHost можно другие вставить директивы, например, директиву Anonymous, которая создаст гостевой узел. Можно также задать каталог или порт.

Пример 2.1.



<VirtualHost ftp.library.com>
	ServerName         "Online library"
	MaxClients         15
	MaxLoginAttempts   1
	DeferWelcome       on
 <Limit LOGIN>
        Allow  from        192.168.1
        Deny   from        all
 </Limit>

 <Limit WRITE>
	AllowUser libadmin
        DenyAll
 </Limit>

 <Anonymous  /var/ftp/library/books>
  User                     library
  Group                    library
  AnonRequirePassword      on

 <Anonymous /var/ftp/library>
  User   ftp
  Group  ftp
  UserAlias anonymous ftp
 </Anonymous>
</VirtualHost>

В примере 2.1 приведена конфигурация виртуального сервера ftp.library.com. В директиве VirtualHost используется доменное имя, которое должно быть прописано в сервере DNS. IP-адрес должен указывать на узел сети, на котором запущен демон proftpd. В конфигурации 2.1 также конфигурируются две анонимных учетных записи - library и ftp. Причем учетная запись library требует ввода пароля при регистрации. Пароль должен совпадать с паролем того пользователя, который запустил демон. Доступ к виртуальному серверу разрешен только для нашей подсети (192.168.1.0). Записывать данные на сервер может только пользователь libadmin.

Директивы конфигурации сервера ProFTP

 
Директива Описание
AccessGrantMsg message Ответное сообщение, которое будет отправлено пользователю в случае его регистрации или получения анонимного доступа. Символы %u будут заменены на имя пользователя, которое он ввел при регистрации.
Allow from all | host | network [,host | network[, ...]] Используется внутри блока Limit. Ограничивает доступ к серверу (а именно разрешает доступ). По умолчанию allow from all
AllowAll Разрашает доступ к блокам Directory, Anonymous, Limit
AllowForeignAddress on | off Разрешает клиенту указывать при соединении соединения адрес, который не соответствует ему. По умолчанию off. Может использоваться в блоках VirtualHost, Anonymous, <Global>
AllowGroup group_list Разрешает доступ определенным группам. Используется в блоке Limit
AllowUser user_list Разрешает доступ определенным группам. Используется в блоке Limit
AnonRequirePassword on | off Требует пароль при анонимной регистрации. Пароль должен совпадать с паролем того пользователя, который запустил демон. По умолчанию опция выключена.
<Anonymous directory> Создает анонимную учетную запись, directory - корневой каталог анонимного сервера.
AuthGroupFile path Позволяет указать путь к альтернативному файлу group. По умолчанию используется файл /etc/group
AuthUserFile path Указывает альтернативный файл passwd
Bind address Разрешает привязку дополнительного IP-адреса к основному или виртуальному хосту.
DefaultRoot directory Задает корневой каталог по умолчанию
Deny from all | host | network Запрещает доступ к серверу. Блок Limit
DenyAll Запрещает анонимным пользователям доступ к объектам, указанным в блоке Limit
DenyUser user_list Запрещает доступ определенным пользователям
<Directory> path Используется в VirtualHost, Anonymous для того, чтобы определить особенные параметры доступа к каталогу и его подкаталогам
DisplayFirstChdir filename Текстовый файл filename будет выводиться, когда пользователь впервые за время сеанса войдет в данный каталог. Используется в VirtualHost, Directory, Anonymous
DisplayLogin filename Этот файл будет отображен, когда пользователь зарегистрируется
<Global> Используется для задания параметров, которые будут использоваться как основным, так и всеми виртуальными серверами
<Limit command> Ограничение на выполнение данной FTP-команды, например LOGIN, WRITE
MaxClients number | none | message Ограничение на количество клиентов. Message будет отображено, если пользователю будет отказано в доступе. Блоки Anonymous, Global
MaxLoginAttempts Максимальное количество попыток зарегистрироваться. По умолчанию 3. Блоки VirtualHost, Global
Order allow, deny | deny, allow Порядок выполнения директив Allow и Deny в блоке Limit
PersistentPassword on | off При значении on будут использованы системные файлы /etc/passwd и /etc/group, несмотря на то, что командой chroot корневой каталог был изменен.
RequireValidShell on | off Разрешает или запрещает регистрацию при использовании оболочек (shells), которые не указаны в файле /etc/shells
ServerAdmin email Определяет email администратора сервера.
ServerType Определяет режим работы сервера standalone (по умолчанию) или inetd. В первом случае сервер будет запускаться автоматически из стартовых сценариев системы, во втором - его будет запускать сервер inetd при попытке соединения.
TimeoutIdle seconds Время в секундах, в течение которого пользователь имеет право не проявить активности. По умолчанию 60 (1 минута).
User username Имя пользователя, присвоенное демону ProFTP
UserAlias Alias User Создает псевдоним (alias) для пользователя (user)
<VirtualHost address> Создает виртуальный сервер

Организация виртуальных FTP-узлов с помощью wu-ftp

По сравнению с демоном ProFTP, демон wu-ftp имеет не столь богатые возможности в конфигурировании и поддержке виртуальных узлов.

Поддержку виртульных узлов можно включить командой virtual в файле конфигурации wu-ftp /etc/ftpaccess. virtual address Данная команда разрешает использование виртуального FTP-узла.


Cчетчик Linux coutner
Hosted by uCoz