Small HTTP server

Содержание

  • Что это?
  • Лицензия.
  • Возможности
  • Как...?
  • Каталоги и имена файлов
  • Настройки и параметры командной строки
  • Разрешенные и запрещенные диапазоны IP адресов.
  • Лимиты
  • Запуск скриптов
  • SSI
  • Регулярные выражения
  • Internet Server Applications (ISAPI)
  • Proxy сервер
  • DNS сервер.
  • SMTP сервер.
  • POP3 server & proxy
  • FTP server & proxy
  • TLS/SSL сервер.
  • Регистрация.
  • Заключение.
        •  

    Когда сервер запущен доступны:

    Установки / Текущие состояние
    Пользователи и Виртуальные хосты
    Текущая статистика
    В он-лайне:
    Что нового?
    (Последняя версия, Форум, и т.д.)
    Сгрузить Web Mail
    Внешний скрипт предоставляющий Web интерфейс для работы с почтой
    Регистрация.
    Google
    Web smallsrv.com


    Реклама:


    Что это и зачем оно нужно?

    Эта очень небольшая утилита превращает ваш компьютер в полноценный Web-сервер. Сама программа задействует минимальное количество системных ресурсов, функционирование сервера не должно сказаться на производительности вашего компьютера. Сервер может работать в локальной сети или даже на DialUp-е. Веб-мастера могут запускать эту утилиту даже на своем локальном компьютере, и не входя в сеть отлаживать CGI-скрипты.


    Возможности.

    Так же одним из достоинств этой программы является ее компактность. Ее работа не должна мешать вашей! Она задействует минимум системных ресурсов, ровно столько сколько необходимых для быстрой передачи данных, и сразу же освобождает их после передачи. Для обеспечения такого режима работы мне пришлось несколько ограничить, те возможности которые могли бы быть.

    Содержание



    Как ...?

    Очень просто -- устанавливайте, запускайте http.exe и все ! Если Ваш браузер не настроен на работу через прокси, то даже не входя в сеть вы можете сами сходить на свой сайт используя стандартный IP-адрес http://127.0.0.1/. Если у вас нет собственного DNS-имени, это не страшно. Любой пользователь может попасть ваш сайт используя Ваш IP адрес.


    Каталоги и имена файлов.

    Сервер поддерживает определенные имена каталогов. Ваш сайт начинается с подкаталога заданного в настройках (по умолчанию WWW). Файлы могут передаваться только из него и из всех вложенных в него подкаталогов, кроме файлов содержащих в своем пути идентификатор CGI, по умолчанию это /CGI-BIN/. Предполагается, что в каталоге /CGI-BIN/ находятся исполняемые CGI-скрипты, и при получении запроса на файл из /CGI-BIN/ сервер пытается его запустить. При этом если файл имеет расширение *.pl то запускается Perl-интерпретатор, который должен быть либо в PATH-е, либо указан в настройках. Запрос файла с расширениями *.phtml,*.pht,*.php приводит к попытке запуска PHP интерпретатора, которому передается указанный файл. Например если Вы установили программу в каталог С:\HTTP то по вашему IP-адресу можно будет забирать файлы из каталога C:\HTTP\WWW т.е. http://127.0.0.1/test.htm==C:\HTTP\WWW\test.htm. А CGI в этом случае запускаются из C:\HTTP\WWW\CGI-BIN\. Если Вы создали в каталоге WWW подкаталог WWW\IMAGES и записали туда файл bgr.gif то получить его можно http://127.0.0.1/images/bgr.gif и т.д. В любом случае, если имя файла не задано, т.е. запрос кончается на '/' то сервер автоматически подставляет имя файла по умолчанию заданное в настройках, сохраняя структуру каталогов. Так http://127.0.0.1/My/ эквивалентно http://127.0.0.1/My/index.htm. Сервер может поддерживать несколько виртуальных хостов. Каждый хост имеет собственный корневой каталог и также может включать виртуальные каталоги общие для всех.
    Сервер определяет тип файла по расширению. Поддерживаются ASIS файлы. Эти файлы содержат полный HTTP заголовок в начале. Такие файлы удобно использовать для перенаправления на другой сайт. Этот файл должен начинаться с ключевого слова "Status: " и кода возврата и ваш заголовок. После заголовка одна пустая строка и данные. Последнее расширение должно быть .asi или .asis

    Содержание


    Настройки и параметры командной строки.

    Вы можете настроить сервер диалог "Установки..", через Web интерфейс если удаленное администрирование разрешено, или вы можете вручную редактировать http.cfg или просто добавить параметров в командной строке.
    Параметры и коментарииключи
    Общие параметры
    Не показывать иконку в таскбаре. Не добавлять иконку в таскбар. В этом случае, когда окно спрятано, для доступа к диалогу администрирования вы должны: Что бы открыть окно, нажмите Ctrl-Alt-Del, в появившемся таск-менетжере выберите Http, и попробуйте закрыть его. Сервер спросит: "Do you want to close HTTP server?" , Если ответить "Нет", то откроется его окно. В окне сервера вызовите системное меню (Правой кнопка мыши на заголовке) и выберите дополнительный элемент "Server". Если программа запущена как служба NT то окно можно вызвать из менетжера служб, кнопкой Pausenoicon
    Сворачиваться при старте.hide
    Подробный отчет для POP/SMTP/FTP. Иначе фиксируются только основные события.detail
    Не сохранять лог.nolog
    Сохранять лог. Выберите имя лог-файла.log=name.log
    Новый лог файл каждый день. Это нужно, что бы получать статистику по дням.logday
    Разрешить удаленное администрирование. Иначе, для администраторов будут доступны только страницы статистики.radmin
    Максимальное количество одновременных подключений с одного и того же хоста. Для снятия ограничений можно использовать 0. Ограничения распространяются на все TCP соединения (HTTP,FTP,POP,SMTP,Proxy) from_same_host=##
    IP адреса, для которых сервер будет доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший. Например: 192.168.0.1-192.168.0.16,127.0.0.1ip_range={#.#.#.#[-#.#.#.#],}
    Запрещенные IP адреса, для которых сервер будет не доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший. Например: 192.168.0.1-192.168.0.16,127.0.0.1ip_deny={#.#.#.#[-#.#.#.#],}
    Параметры HTTP сервера:
    TCP/IP порт для HTTP сервера. Обычно это 80port=##
    Сколько HTTP запросов будут обрабатываться одновременно. Около 20Kb памяти будет резервироваться для ждущих нитей. Обычно 5-12 соединений достаточно для 3-8 посетителей в минуту. max=##
    Имя файла по умолчанию. (Можно использовать шаблон '*'. Например index.* для любого index-а)def=name.ext
    Файл ошибки. Полный путь к файлу или скрипту возвращаемому при отсудствии запрошенного файла. Для скриптов и SSI переменная QUERY_STRING будет содержать имя запрошенного файла.error=path\name.ext
    Корневая Web папка по умолчанию. Каталог с которогр будет начинаться ваш сайт.dir=root_dir_name
    CGI идентификатор. Часть URL для определения CGI. По умолчанию это \"\\cgi-bin\\\", но можно использовать, например, \"\\cgi-\", \"\\local-bin\\\", \".cgi\", и т.д.cgi_ident="\cgi-bin\"
    PERL интерпретатор. Интерпретатор для скриптов с расширением .plperl=path\name.exe
    Разделяемый каталог. Если вы хотите что бы для всех CGI был один и тот же каталог запуска, укажите его здесь. Иначе каталогом запуска, будет каталог самого скрипта.share=path
    Разрешить обрабатывать Server Side Includes (SSI) в HTML файлах. По умолчанию сервер проверяет SSI только в .sht*,.sml*,.asp* файлах. Предостережение: Обработка SSI требует больше памяти и это медленнееssihtm
    Отменяет предыдущий ключ.nossihtm
    Предельное количество байт принимаемое по методу POST. Не указывайте большие значения т.к. это даст хакерам возможность серьезно загрузить вашу сеть, и затребовать много памятиpost_limit=##
    Никогда не запускать .htm,.gif,.jpg файлы. Иначе, сервер пытается запустить любой файл с CGI идентификатором.norunhtm
    Максимальное время на выполнение CGI В секундах.cgi_timeout=##
    CGI интерпретаторы
    Приложения или DLL для запуска при запросе указанных CGI-файлов. Например, для .sh -- d:\gnu\bin\bash.exe, для .cgi -- d:\perl\perlis.dll.
    ext=".ext;application;.ext;application;..."
    MIME типы
    Определяет дополнительные MIME типы для расширений. Например, для .bmp mime тип может быть image/bitmap
    mime=".ext1;mime-type1;.ext2;mime-type2;...;.extN;mime-typeN"
    Виртуальные хосты и виртуальные каталоги
    Веб каталоги для различных хост имен. Вы можете добавить сколько угодно имен хостов и связать с каждым из них свой каталог. Что бы эти имена были видны только на вашей машине, достаточно добавить их системный hosts -файл, или выбрать соответствующую опцию, что бы сервер сделал это автоматически. Здесь же могут быть добавлены виртуальные каталоги, каталоги общие для всех хостав. Имя каталога задается между двумя слешами. (/directory/)
    hostpath="hostname;path"
    Ключ может повторятся много раз.
    Параметры Proxy сервера
    Запретить HTTP proxy.noproxy
    TCP/IP порт для proxy сервера.proxy=#port
    Сколько proxy запросов будут обрабатываться одновременно.proxy_max=#max
    IP адреса, для которых сервер будет доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший.proxy_range={#.#.#.#[-#.#.#.#],}
    Запрещенные IP адреса, для которых сервер будет не доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший. Например: 192.168.0.1-192.168.0.16,127.0.0.1proxy_deny={#.#.#.#[-#.#.#.#],}
    Запретить кэш на жестком диске.noproxy_dir
    Каталог для сохранения кеша.proxy_dir=path
    Сколько дней должны храниться данные в кэше. Proxy может загруженные файлы из кэша по прошествии указанного количества дней поле загрузки. В любом случае если юзер использует кнопку "Reload" файл перегружаетя.proxy_time=#days
    Игнорировать NO-CACHE в управляющих заголовках страниц. ignocache
    Proxy только для авторизованых пользователей.proxyusers
    Параметры DNS сервера
    Hosts file. See also format of this filehosts=hosts_file
    Запретить DNS серверnohosts
    Для сервера удаленного перенаправления запросов. Уведомления о текущем IP адресе:
    URL запроса. Полный URL для сообщения вашего IP адреса серверу динамических перенаправлений. Можно использовать \"$IP_ADDRESS\" переменную что бы вставить ваш IP адрес в URL. ddns=url
    Интервал переподтверждения.ddns_time=#N
    Запретить уведомления о текущем IP адресе.noddns
    Параметры FTP сервера
    Запретить FTP сервераnoftp
    Сколько FTP запросов будут обрабатываться одновременно.ftp_max=max
    TCP/IP порт для FTP сервера. Обычно это 21ftp_port=port
    Таймаут по бездействию в секундах. По прошествии этого времени, после последней операции, соединение будет закрыто.ftp_timeout=#N
    Имя для загрузок. Если FTP каталог содержит такой подкаталог то пользователи с доступом только для чтения могут загружать туда файлы.ftp_upload="/dir/"
    Разрешить виртуальные директории для FTP.ftp_vdirs
    Параметры POP3 сервера
    Запретить POP3 сервер.nopop3
    Сколько запросов будут обрабатываться одновременно.pop3_max=max
    TCP/IP порт для POP3 сервера. Обычно это 110pop_port=port
    Параметры SMTP сервера
    Запретить SMTP сервера.nosmtp
    Сколько запросов будут обрабатываться одновременно.smtp_max=max
    Имя SMTP сервера. (Имя домена)smtp_name=your.domain.name
    Использовать все виртуальные хосты как синонимы имени домена.vhalias
    TCP/IP порт для SMTP сервера. Обычно это 25smtp_port=port
    Output каталог. Каталог для сохранения сообщений перед отправкой.smtp_out=path
    Sent каталог. Каталог для сохранения сообщений после отправки.smtp_sent=path
    Error каталог. Каталог для сохранения сообщений, которые не удалось доставить адресату.smtp_err=path
    DNS сервер, через который будет искаться информация о почтовом пути. (Это может быть ваш обычный DNS сервер)smtp_dns=#.#.#.#
    Принимать для отправки сообщения с любым полем "From". Иначе сервер будет отсылать сообщения только от извесный_пользователь@имя.доменаsmtp_any
    IP адреса, для которых сервер будет доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший. smtp_range={#.#.#.#[-#.#.#.#],}
    Запрещенные IP адреса, для которых сервер будет не доступен. Указывайте IP адреса через запятую и диапазоны младший через дефис старший. Например: 192.168.0.1-192.168.0.16,127.0.0.1 smtp_deny={#.#.#.#[-#.#.#.#],}
    Черный список. E-mail адреса спамеров через пробел. (Можно *@имя.хоста чтобы запретить принимать сообщения от всех с этого хоста)blacklist="u@adr1 *@adr2 ..."
    Проверять наличие \"forward\" файла в каталоге пользователя и выполнять инструкции из него.forward
    Разрешить исполнение приложений из пользовательского \"forward\" файла. fwdrun
    Пользователи
    Что бы предоставить FTP, почтовый или администраторский доступ вы должны добавит пользователей.
    user="имя;пароль;домашний_каталог;тип_доступа"
    Ключ может повторяться несколько раз.
    тип_доступа -- это последовательность следующих символов:
    • F -- FTP доступ -- пользователь может читать файлы из своего домашнего каталога по FTP протоколу.
    • W -- FTP доступ на запись -- пользователи могут сгружать файлы в свой домашний каталог по FTP протоколу.
    • N -- Запретить запись файлов с CGI идентификатором в пути.
    • S -- SMTP. Пользователи могут отправлять сообщения по SMTP с адресаимя_пользователя@имя.вашего.домена
    • P -- POP3. Пользователь будет иметь почтовый ящик. Все сообщения на имя_пользователя@имя.вашего.домена будут сохранятся в каталоге домашний_каталог\mbox и будут доступны через POP3.
    • A -- Это администратор. -- Имеет полный доступ к административным страницам, может добавлять пользователей, менять права доступа и т.д...
    • H -- Proxy. Доступ к Proxy-серверу.
    Для FTP доступа вы можете добавить anonymous пользователя без пароля В этом случае просто оставьте поля пароля пустым. Например:
    user=anonymous;;c:\public;FWN
    user=ftp;;c:\readonly;F
    

    Обратите внимание, что между именем переменной знаком равенства и значением не должно быть пробела Если значение содержит пробелы, вводите его в кавычках. Вот пример строки запуска:
    http.exe port=1080 def=index.html php="C:\PROGRAM FILES\PHP\php.exe" nolog
    Вот пример конфигурационного файла:
    log=c:\temp\http.log
    perl=c:\Perl\bin\perlis.dll # supported !!!
    max=12 def=index.stm
    @www.cfg # include other configuration file
    hostpath=www.name.www;C:\www1
    hostpath=max.name.www;C:\www2
    # End of file
    


    Содержание


    Разрешенные и запрещенные диапазоны IP адресов.

    Для ограничения у каждого севериса предусмотрены разрешенные и запрещенные диапазоны IP адресов. Также предусмотрен общий разрешенный и запрещенный диапазоны IP блокирующий или разрешающий доступ сразу ко всем TCP сервисам, и диапазоны задающие IP адреса с которых возможно Web администрирование. Адреса задаются через запятую. Можно задавать как одиночные адреса так и диапазоны адресов. Пример: 127.0.0.1,192.168.0.1-192.168.0.255

    HTTP,FTP,POP3,Proxy будут принимать запросы только с IP адресов входящих в список разрешенных и не поподающих в список запрещенных.

    SMTP сервер будет принимать письма своего домена (входящие для своих пользователей) с любых адресов, кроме запрещенных. Письма для отправки наружу, он будет принимать только с адресов из разрешенного списка Если вы не хотите принимать письма с какого-то IP -- добавте его в список запрещенных адресов.

    DNS сервер также возвращает локальные записи всем желающим, но вот рекурсивный поиск имен делает только для адресов из разрешенного диапазона.

    Содержание


    Лимиты.

    Для HTTP,Proxy,SMTP,FTP можно лимитировать объемы данных. Для этого в настройках необходимо задать время на которое распростроняется лимит, объем для IP адреса, для сети соответствующей этому адресу и общий объем для сервиса. Обратите внимание, что даже при исчерпании лимита посередине обмен не прерывается, файлы передаются целиком и только при последующих обращениях пользователь будет получать отказ в течении такого времени которое необходимо для того объема который уже получен или передан.

    Содержание



    Запуск скриптов.

    Скрипты запускаются в случае когда запрошенный файл в своем пути содержит идентификатор CGI. По умолчанию из поддиректории /CGI-BIN/ Если выбрана опция "Запускать системные файлы" то также будут запускаться файлы с атрибутом 'SYSTEM'. При этом поддерживается интерфейс CGI/1.1 подробное описание которого можно найти например на http://Web.Golux.Com/coar/cgi/ При запуске строка запроса передается как в командной строке так и в переменной окружения QUERY_STRING. После запуска выходной поток скрипта напрямую транслируется пользователю приславшему запрос. Скрипт, обязательно должен выдавать строку Content-Type: тип\r\n или Location: url релокейшена.. Также могут следовать другие служебные строки, например Content-Length: xx\r\n или Date: Завершается служебная информация последовательностью \r\n\r\n. Если вы пишите на Си или Перле то обратите внимание на то, что функции вывода в тестовом режиме сами преобразуют символ \n в последовательность \r\n. На Паскале функция writeln завершает вывод этими символами.

    Содержание


    Server Side Includes (SSI)

  • SSI значительно расширяет Ваши возможности, позволяя динамически вставлять, документы или результаты работы CGI в произвольные места запрошенного документа.
  • Когда удаленный пользователь запрашивает у Вас файл имеющий расширение *.SHT, *.SHTM, *.SHTML сервер отдает его с учетом встречающихся в нем SSI тегов.
  • SSI тег имеет следующий формат:
    <!--#имя_тега {переменная="значение" } -->
  • Внутри "значения" могут применятся подстановки HTTP переменных или переменных полей формы запроса. Имя переменной начинается с символа '$' и далее может быть заключено в фигурные скобки {}, если Вы хотите объединить полученное значение с последующим текстом, исключая пробелы. Например значением "$USER_AGENT" является соответствующая строка идентифицирующая браузер, а если вы хотите объединить ее с текстом "_12345" то используйте "${USER_AGENT}_12345" Для включения в значение символа '$' используйте '\$', для '\' -- '\\', для '"' -- '\"' и т.д. Если при подстановке, соответствующая переменная не найдена подставляется значение "undefined".

    Данная версия сервера поддерживает следующие теги:

    include
    <!--#include virtual="patch/file_name" -->
    <!--#include file="full_patch/file_name" -->
    Оба варианта этой директивы включают в документ содержимое файла file_name. В первом случае документ ищется, начиная с каталога сервера. Во втором случае, начиная с каталога текущего документа. В обоих случаях path вообще может быть опущен. Если в результате подстановки обнаруживается, что запрашиваемый документ находится на сервере в подкаталоге /CGI-BIN/ то он воспринимается как CGI и запускается. Выходной поток соответственно транслируется, начало до последовательности "\r\n\r\n" убирается. При этом если в имени не содержалось символа '?' то CGI передается исходный запрос, с которым обратились к родительскому документу. Если обнаружен '?' то дальнейшая последовательность будет передана как запрос, она должна быть соответственно преобразована Вами.

    exec
    <!--#exec cgi="file_name" -->
    <!--#exec cmd="full_patch/file_name" -->
    Запуск скрипта. Все аналогично include. В первом случае файл запускается из каталога CGI-BIN, во втором должен быть задан полный маршрут.

    fsize и lastmod
    <!--#fsize virtual="patch/file_name" -->
    <!--#fsize file="full_patch/file_name" -->
    <!--#lastmod virtual="patch/file_name" -->
    <!--#lastmod file="full_patch/file_name" -->
    Подставляет размер или дату последней модификации файла.

    echo
    <!--#echo var="var" -->
    Выводит значение переменной.

    printenv
    <!--#printenv -->
    Выводит все переменные.

    break
    <!--#break -->
    Вызывает прекращение обработки документа.

    if -- elif -- else -- endif
    <!--#if expr="выражение" -->
    текст
    <!--#elif expr="выражение" -->
    текст
    <!--#elif expr="выражение" -->
    текст
    ...
    <!--#else -->
    текст
    <!--#endif -->
    Подстановка по условию. Текст будет передаваться пользователю в зависимости от истинности условий. Выражение может содержать переменные и значения разделенные знаками логических операций и скобками:
    ! -- перед выражением -- простое отрицание
    = или == -- равно
    != -- не равно
    <,>,<=,>= -- соответственно.
    && между выражениями логическое и.
    || между выражениями логическое или.
    str1~str2 -- результат истина, если строка str2 является частью строки str1.
    str1 =~ /pattern/ig -- pattern это регулярное выражение Юникс. Результат истина, если в строке str1 обнаруживается подстрока соответствующая шаблону pattern
    Если вообще нет никакого знака сравнения, то значение выражения сравнивается с "undefined". Части elif и else могут быть пропущены. Часть elif может повторяться сколько угодно раз. Обязательно долен быть закрывающий тег endif.

    set
    <!--#set var="переменная" value="значение" -->
    Добавление или изменение значения переменной. Не стоит злоупотреблять этой опцией, так как и количество переменных которые можно добавить и размер буфера под них ограничены.

    Содержание



    Регулярные выражения

    Для анализа входящих переменных можно использовать поиск по шаблону. Шаблон это регулярное выражение, соответствует синтаксису принятому в Юниксе, и позволяет найти и выделить фрагмент практически любой сложности. (Расширенный синтаксис регулярных выражений допускаемый в Переле пока не поддерживается) Регулярное выражение представляет из себя подстроку поиска в которой также могут присудствовать, распозноваться и подставлятся метасимволы, модификаторы и переменные. Понимаются следующии метасимволы:

  • ^ -- начало строки.
  • . -- любой символ кроме новой строки.
  • \ -- если седующий символ метасимвол он рассматривается как обычный символ. Например \. это просто точка. Также понимаются следующии последовательности:
  • [] -- в квадратных скобках указываются допустимые или не допустимые значения для символа: Символ строки считается совпавшим, если он указан в скобках Если первый элемент в скобках '^' значит символ может быть любым кроме символов указаных в скобках. '-' внутри скобок означает символы от ему предшествующего до последующего. Символ '\' также изменяет значение следующего за ним символа. Примеры:
  • () -- предписывает запомнить подстроку соответствующую шаблону внутри скобок для последующего использования. Найденные подстроки нумеруются последовательно от 1 до 9 и доступны как переменные $1 - $9. Последнее совпадение также доступно как $+
  • | -- или.
    После метасимвола может следовать модификатор:
  • * -- повторяется 0 или большее число раз
  • + -- повторяется 1 или большее число раз
  • ? -- может отсудствовать
  • {n} -- повторяется n раз
  • {n,} -- повторяется n или большее число раз
  • {n,m} -- повторяется не меньше n но не больше m раз. После любого модификатора может следовать еще один модификатор '?' уменьшающий распространение шаблона. Например, для поиска в строке '123abcdefff567' В конце шаблона, после последнего слеша, могут следовать модификаторы. Сейчас программа понимает следующие модификаторы:
  • i -- не разлечать строчные и прописные буквы
  • v -- запретить очистку списка переменных ($1 - $9). Без этого модификатора програма будет очищать список в новом логическом выражении, когда первое регулярное выражение начнет проверяться.
  • c -- Очистить список переменных ($1 - $9) перед началом.

    Содержание



    Internet Server Applications (ISAPI)

    Это алтернатива к CGI исполняемым файлам. Сервер будет определять исполняемы файлы с расширением .DLL как ISAPI. Для каждого пользовательского запроса к такому файлу, будет вызвана функция HttpExtensionProc из этой DLL. Полное описание интерфейса и заголовочные файлы есть SDK. Моя реализация этого интерфейса имеет следующие дополнительные свойства:
  • Если HttpExtensionProc вернет 4 (HSE_STATUS_ERROR) или больше то DLL будет выгружена.
  • Когда скрипт вызывает WriteClient либо dwHttpStatusCode должна содержать правельное значение или вывод должен начинаться с HTTP/ и содержать полный HTTP ответ.
  • Отсудствие GetExtensionVersion -- это не ошибка.

    Содержание



    Прокси

    Эта версия включает в себя http прокси сервер. Вы можете указать порт для прокси, одновременное число подключений. Кэш на жестком диске. позволяет сохранять весь принятый трафик определенное количество дней. HTTP протокол предусматривает запрет кеширования определенных страниц. Часто владельцы сайтов пользуются этим только для того, что бы подсчитывать реальное число посещений. По вашему указанию сервер может игнорировать NO-CACHE. В этом случае страничка будет перегружаться только когда один из пользователей прокси нажмет кнопку Reload в своем браузере. Можно включить авторизованый доступ к прокси, и добавить пользователей для которых он разрешен. Смотрите так же описания ключей командной строки.

    Содержание.



    DNS сервер

    Эта версия включает в себя DNS сервер. Для запуска вы должны указать hosts-файл. Формат этого файла с одной стороны совместим со стандартным виндосовким, с другой стороны дополнен возможностью быть похожим на формат мастер-файла рекомендованого в RFC 1035.
    Для совместимости с системным хост-файлом, каждая строка должна состоять из IP адреса и имени хоста. Комментарии начинаются с символа '#'. В отличие от виндосовкого формата доменные имена в этом файле могут начинаться с последовательности '*.' для описания всех поддоменов. Вот пример такого файла:

    # Here example of hosts file for local network begins.
    192.168.1.21 www.max.local
    192.168.1.21 max.local
    192.168.1.21 max.max.local
    192.168.1.20 *.max.local
    192.168.1.22 www.boss.local
    192.168.1.23 serg.local
    192.168.1.26 www.serg.local
    192.168.1.24 *.andy.local
    192.168.1.25 *.mary.local
    # etc ...
    # end of hosts file
    
    Так же каждая строка может соответствовать рекомендациям RFC и содержать имя домена и RR описание. Коментарии могут начинаться с ';'
    $ORIGIN <domain-name>
    $TTL <validate-time> -- целое, описывающие время в течении которого запись может храниться в кеше.
    [<domain-name>] <blank> [<TTL-always-ignored>] IN <type> <RDATA>

    При описании домена, в отличии RFC рекомендаций вы должны указывать <domain-name> полностью. ('@' не интерпретируется, завершающая точка может пропускаться или присудствовать, без разницы). Вы можете вообще пропустить <domain-name> в этом случае используется предыдущие имя домена. в отличии RFC рекомендаций вы должны указать класс "IN" для каждой строчки в RR формате. <type> может быть:
  • A <IP-address> - имя хоста
  • NS <full-name> - авторизирующий сервер имен.
  • CNAME <full-name> - синоним. 'A' запись оригинала должна присудствовать в том же файле.
  • SOA <full-name> <e-mail by owner> (<SERIAL>,<REFRESH>,<RETRY>,<EXPIRE>,<MINIMUM>) - начало зоны.
  • MX <preference> <full-name> - почтовый сервер. <preference> -- число от 1 до 255. Наименьшее значение соответствует наиболие предпочтительному серверу.
  • PTR <full-name> - имя. Хост с левой стороны должен быть вида #.#.#.#.in-addr.arpa
    Другие типы игнорируются.
    Также сервер поддерживает PTR запросы, но RDATA для ответа берется из первой 'A' записи с этим IP, или из строк совместимых с системным hosts файлом. Для любого типа записей domain-name может начинаться с шаблона '*.' что бы описать все под-домены. Сервер поддерживает '*'- запрос, для возврата всего о домене. Для домена с шаблоном ответы на такой запрос тоже будет содержать шаблон. Для всех других типов запросов ответы будут без шаблонов.

    Сервер может поддерживать рекурсию. Для реализации резольвинга любого домена вы должны указать NS записи корневых серверов. Если вы выбрали "Рекурсивные вызовы только к серверам верхнего уровня." вместо корневых серверов укажите DNS сервера вашего, провайдера. Все запросы будут идти к ним. Иначе, сервер будет обращатся к различным серверам, предположительно близким к запрошенной зоне. Пример:

    # Here is an example of hosts file for export domain to Internet,
    # and resolve other names.
    
    ; First, lines holds the information on root name servers needed to
    ; initialize cache of Internet domain name servers
    
    .                  IN  NS a.root-servers.net
    a.root-servers.net IN  A  198.41.0.4
    .                  IN  NS b.root-servers.net
    b.root-servers.net IN  A  128.9.0.107
    .                  IN  NS c.root-servers.net
    c.root-servers.net IN  A  192.33.4.12
    .                  IN  NS d.root-servers.net
    d.root-servers.net IN  A  128.8.10.90
    .                  IN  NS e.root-servers.net
    e.root-servers.net IN  A  192.203.230.10
    .                  IN  NS f.root-servers.net
    f.root-servers.net IN  A  192.5.5.241
    .                  IN  NS g.root-servers.net
    g.root-servers.net IN  A  192.112.36.4
    .                  IN  NS h.root-servers.net
    h.root-servers.net IN  A  128.63.2.53
    
    ; Now declare our domain
    
    $TTL 86400  ;TTL - 24 hours
    
    somedomain.net IN SOA  somedomain.net  max@somedomain.net (
     2002120602 ; Serial
     36000      ; Refresh
     3000       ; Retry
     36000000   ; Expire
     36000      ; Minimum
     )
      IN NS   ns.somedomain.net
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
      IN MX 2 relay2.somedomain.net
      IN A 192.168.12.1
    
    ns.somedomain.net     IN A 192.168.12.1
    ns2.somedomain.net    IN A 192.168.12.2
    relay1.somedomain.net IN A 192.168.12.1
    relay2.somedomain.net IN A 192.168.12.2
    
    pc2.somedomain.net    IN A 192.168.12.2
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
    
    *.somedomain.net      IN A 192.168.12.1
      IN NS   ns.somedomain.net
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
      IN MX 2 relay2.somedomain.net
    
    
    ; also this file may contents lines in next format:
    192.168.1.21 www.max.local
    192.168.1.21 max.local
    192.168.1.20 *.max.local
    
    # end of hosts file
    



    SMTP сервер

    SMTP сервер может:

  • Принимать сообщение для указанных пользователей. Адрес назначения должен быть user_name@your.domain.name Эти сообщения сохраняются в пользовательском home\mbox каталоге и доступны через POP3.
  • Принимать сообщения от указаных пользователей для любого. Исходный адрес должен быть user_name@your.domain.name Вы можете разрешить принимать сообщения от любого для любого, и вы можете ограничить диапазон IP, для которого разрешены сообщения этого типа. Для определения пути, SMTP сервер спрашивает DNS сервер. Вы должны указать DNS IP в настройках.
  • Вы можете добавлять адреса спамеров в черный список. Сообщения с этих адресов никогда не будут приниматься.
  • Вы можете разрешить серверу проверять пользовательский "forward" файл, чтобы перенаправлять или фильтровать сообщения.
    Файл с именем "forward" может лежать в домашнем каталоге пользователя. Когда опция включена сервер анализирует каждую строчку этого файла и понимает следующие инструкции:
  • #if выражение -- следующие строки будут проверяться, только если выражение истина.
  • #elif выражение -- если предыдущие условие ложь, то следующие строки будут проверяться, если выражение истина
  • #else -- следующие строки будут проверяться, только если предыдущие выражение ложь.
  • #endif -- конец условного блока
  • #mv куда -- переместить сообщение
  • #cp куда -- копировать сообщение
  • #rm -- удалить сообщение
  • # что угодно -- комментарий
  • !d:\путь\приложение {параметры} -- выполнить "d:\путь\приложение {параметры} каталог_пользователя\mbox\имя.msg". Только если в настройках разрешено исполнение. Так же возможно указать в строке запуска переменные ($имя_переменной), но в этом случае:
  • to1@host1 {toN@hostN} -- переслать сообщения на эти адреса.
    Условие может содержать переменные ($size_kb -- размер сообщения в кБ; $in_text(текст для поиска) -- истина, если текст содержится в сообщении; $errorlevel -- значение возвращенное последним внешним скриптом или ноль если небыло удачных запусков) и значения разделенные следующими знаками операций: $text -- полный текст сообщения. $body -- тело сообщения.

    ! -- перед выражением -- простое отрицание
    = или == -- равно
    != -- не равно
    <,>,<=,>= -- соответственно.
    && между выражениями логическое и.
    || между выражениями логическое или.
    =~ /pattern/ig поиск по шаблону. pattern это регулярное выражение Юникс. Результат истина, если в строке str1 обнаруживается подстрока соответствующая шаблону pattern
    Пробел и обратный слеш (' \') в конце строки означает продлжени текущей команды на следующей строке. Пример:
    # Here is the example of forward file.
    
    #if  $text =~ /\nFrom: .*?boss@address/i
    !d:\perl\bin\perl.exe check.pl
    #endif
    
    #if $in_text(100% FREE)
    #mv c:\probably\spam
    #elif $size_kb<=20 && ! ( $text =~ /^From: .*?([^< ]+?@[^> \r\n]+).*/i && ($1 == my@private.address || $1 == boss@address ) || $in_text(do not redirect) )
    #cp c:\probably\importan
    my_home@address my_seccond_address@yahoo.com
    #else
    !d:\perl\bin\perl.exe autoreply.pl $msgfile $1
    #endif
    
    # End of forward file
    
    Пример:
  • Антивирусный скрипт имеет такой же формат как "forward" файл, но в отличии от "forward"-файла он проверяется перед отправкой любого каждого сообщения.
    # Here is the example of antivirus file.
    
    #if  $text =~ /Content-Transfer-Encoding: ["`]?base64[\001-\xFF]*?\n\r?\nTVqQAAMA/
    
    #if  $text =~ /name=.*\.pif/
    #mv c:\probably\virus
    #else
    !c:\DrWeb\drwebcl.exe /GO /TM- /WA- /TB- /ML
    #endif
    
    #elif $body =~ /<script language=/ && $body =~ /<!DOCTYPE HTML/
    #mv c:\probably\spam
    #endif
    
    # End of file
    
    
    Фильтр разрыва, это специальное вырожение которое может осуществить проверку после того как сервер получил первые 8Kb сообщения. Если результат этого выражения исина, собщение не будет приниматья дальше, Комбинация "отправитель+IP адрес+приветствие сервера+получатели" будет помещена во временный черный список и последующие попытки отправить это сообщения будут присекаться еще до начала приема данных.
    Внутри выражения могут проверяться следующие переменные:
  • $msg -- первые 8Kb сообщения
  • $sender -- адрес отправителя
  • $hello -- самоидентификация удаленного сервера.
  • $control -- полная идентификационная строка в формате:
    "From отправитель (удаленный_сервер [IP]) дата и время For получатели\r\n"
    Выражение может включать такие же действия как и в операторе #if: ||,&&,<,>,>=,<=,==,!=,=~
    Фильтр разрыва предназначен для остановки получения больших спамерских писем.
    Пример выражения:
     (! ( $msg =~ /^From:[^\n\r]*<([^>\n\r]+)>/i ||
          $msg =~ /^From:[ \t]*([^\n\r]+)/i        )
     )
     || $1 != $sender
     || $msg =~ /^Subject:[^\n\r]*семинар|руководителю|бухгалтеру/i
     || $msg =~ /aдpес[ \r\n\t]+пoлучен[ \r\n\t]+из[ \r\n\t]+oткpытыx[ \r\n\t]+истoчнuкoв/i
     || $msg =~ /р[ \r\n\t]*А[ \r\n\t]*м[ \r\n\t]*е[ \r\n\t]*р[ \r\n\t]*и[ \r\n\t]*к[ \r\n\t]*а[ \r\n\t]*н[ \r\n\t]*с[ \r\n\t]*к.*А[ \r\n\t]*н[ \r\n\t]*г[ \r\n\t]*л[ \r\n\t]*и[ \r\n\t]*/i
    
    В данном примере: первые четыре строки проверяют наличие в сообщении поля From, выделяют адрес из этого поля и требуют совпадения этого адреса с адресом отправителя; следующая строка в поле Subject ищет любое из слов "семинар","руководителю","бухгалтеру"; следущей строкой в теле сообщения ищется строка "aдpес пoлучен из oткpытыx истoчнuкoв", при этом между словами может быть любое количество пробелов; последняя строка ослеживает различные модификации производные от строки "Центр Американского Английского"
    При выполнении любого из этих условий письмо ситается спамом.

    POP3 сервер и прокси

    POP3 сервер предоставляет доступ к входящей почте. Если POP3 прокси разрешен то пользователи могут настроить свои почтовые программы чтобы забирать почту с любых удаленных POP3 через этот POP3. Для этого, user настройка в почтовой программе должна иметь вид:
    local_user@remote_user@remote_host
    Пароль должна иметь вид: local_password@remote_password
    Или @remote_password часть может быть добавлена к user настройке. Везде вместо '@' может использоваться '#'.



    FTP сервер и прокси

    FTP сервер предоставляет доступ к домашним каталогам пользователей и если опция "Разрешить виртуальные директории для FTP" выбрана то и к приватным виртуальным каталогам. Открытые виртуальные каталоги недоступны через FTP.
    Если FTP прокси разрешен то пользователи могут настроить свои FTP программы чтобы забирать почту с любых удаленных FTP через этот FTP. Для этого, user настройка в FTP программе должна иметь вид:
    local_user@remote_user@remote_host
    Пароль должна иметь вид: local_password@remote_password
    Или @remote_password часть может быть добавлена к user настройке. Везде вместо '@' может использоваться '#'.
    Некоторые FTP клиенты (например FTP плагин в Far-е) поддерживает схожий тип FTP proxy. В этих клиентах в настройках файрвола можно указать your_host:FTP_port, и указывать FTP URL-ы в виде: ftp://local_user#remote_user:local_password#remote_password@ftp_host/



    TLS/SSL сервер

    Сервер не содержит встроенных TLS/SSL криптографических функций, но включает интерфейс для подключения внешней TLS/SSL билиотеки. Вы можете подключить к серверу OpenSSL или GNU TLS. Простая DLL базирующаяся на OpenSSL 0.9.6j лежит здесь: seclib.zip



    Регистрация.

    После ознакомления с программой, если вас все устраивает и вы хотите использовать ее в коммерческих целях (получать финансовую выгоду от ее использования), вы должны зарегистрировать свою копию. Регистрируясь, вы финансируйте развитие продукта, выход новых улучшенных версий. Следующую версию зарегистрированные пользователи получат бесплатно.
    Заказ документов на оплату можно сделать в онлайне. онлайне. По всем вопросам обращайтесь по E-mail

    На территории СНГ и Прибалтийских государств программа может свободно распространяться и использоваться в некоммерческих целях. Имя регистрации:Гражданин бывшего СНГ
    Код, например, 31.


    Заключение.

    В заключении я не могу не выразить свою глубочайшую признательность, программистам, написавшим прекрасный компилятор GNU C++, с помощью которого откомпилирована эта программа. Я благодарю GNU за то, что они подарили мне возможность писать самые лучшие программы, используя самый лучший компилятор.
    Вы можете посмотреть GNU ресурсы:
  • DJGPP -- домашняя страница трансляции GNU GCC в среду DOS.
    Я пользовался именно этой версией, своими библиотеками, вызывающими WIN32 API и своей программкой строящей Windows PE *.exe из COFF a.out.
  • GNU -- Собственно сам сайт GNU.


    М. Феоктистов


    Содержание