Не боги горшки обжигают
19 декабря 2003
Рубрика: Интернет и сети.
Автор: Сергей Ниваров.

pic

Новая универсальная интернет-система делается руками нашего отечественного программиста.

Проект, над которым я работаю, называется MyInternet. Предприятие, где он разрабатывается, называется Serendipity-Interactive и находится в самом крупном городе Шотландии Глазго (что на севере Великобритании).

Проект состоит из разработки клиентской и серверной части. Клиентская — веб-интерфейс. Серверная — прокси-сервер.

Цель проекта — создать универсальную систему для работы в Интернете. Для достижения этой цели веб-интерфейс разрабатывается на все случаи жизни. Он представляется, как большой портал, через который можно попасть на миллионы сайтов. Как видно из рисунка, на интернет-страницах видны категории сайтов. Войдя в категорию, попадаешь в следующую категорию, например, попав в категорию животных, увидишь категории птиц, рыб и т.д., перейдя в категорию птиц, увидишь следующие категории и т.д. до ссылок на сами сайты. Самое большое применение проект найдет, скорее всего, в образовании. Так, например, для школ веб-интерфейс состоит из образовательных программ. Через него учащийся может быстро найти нужную ему информацию: книги, статьи, ответы на многие вопросы и т.д и т.п. Но образование — это только одно из направлений использования системы. Универсальность системы — это не только удобный интерфейс, но и ориентированность на любого заказчика и на любые требования. Так, если заказчик небогат, то это не значит, что от него надо отказываться. Каждый заказчик имеет право и возможность пользоваться программой. Для такого заказчика будут предложены бесплатные или самые дешевые составляющие серверной части. Например, операционная система Linux Debian, БД PostgreSQL, функция собственного составления базы данных запрещенных сайтов. Что касается требований, то бывает так, что заказчик хочет использовать только ту БД, к которой он привык. Поэтому базы данных и модули обработки создаются для совершенно различных серверов БД. Также серверная часть программы разрабатывается под разные операционные системы, но это, в любом случае, разновидности UNIX. Кроме того, в качестве сервиса фирма-разработчик будет осуществлять дополнения, необходимые заказчику, то есть изменять программу или разрабатывать дополнительные модули. Новые изменения будут вноситься таким образом, чтобы они не противоречили требованиям других пользователей, так как программный код будет оставаться один для всех. То есть включение или отключение функций возможно будет с помощью настроек или копированием в папку модулей нового модуля.

Прокси-сервер, над которым я работаю, называется MIProxy (сокр. от MyInternetProxy). Для тех, кто не знает, поясню, что работа любого прокси-сервера заключается в перехвате всех запросов клиента. Работа происходит по следующей схеме: обрабатывается запрос клиента, в зависимости от результата обработки запрос может быть послан на веб-сервер, полученный от веб-сервера результат обрабатывается, итоговый результат возвращается клиенту. Наш прокси-сервер будет являться не просто http-прокси, а самым что ни на есть полным интернет-прокси-сервером, так как будет поддерживать не только HTTP, но и SSL, FTP и другие протоколы.

Сервер должен обеспечивать быструю и надежную работу системы в целом. Один из важнейших пунктов прокси-сервера — это кэширование информации. Представьте себе большую школу из тысячи классов. В школе имеется один сервер. Большинство пользователей будут обращаться, как правило, к одним и тем же страницам. Работа значительно ускорится при кэшировании этих страниц. Также немаловажно решить проблему ограничения доступа пользователей. Так, школа может запретить своим школьникам заходить на сайты порнографии, религиозных сект, дискриминации. Для этого база данных может быть составлена из запретных сайтов сотрудниками самой школы через удобный web-интерфейс или же используя готовый модуль «Orange Filter» немецкой фирмы Orange, который хранит в своей базе миллионы сайтов. При его использовании в базу данных достаточно занести только список запретных групп, так как каждая группа в Orange Filter имеет свой номер.

Естественно, каждый внешний модуль не бесплатный. Нами разрабатываются и внутренние модули. Например, модули аутентификации пользователя. По умолчанию, прокси-сервер предлагает стандартную http-аутентификацию, затем введенные имя пользователя и пароль проверяют в базе данных. Но заказчик может хотеть, например, чтобы пользователи хранились не в БД, а проверялись NT-сервером. Для этого написан модуль MI-NTLM. А если же заказчик хочет, чтобы окно аутентификации не появлялось вообще, а сервер проверял текущего пользователя клиентской машины Windows, то будет использоваться модуль MI-Ident и т.д.

Модули базы данных также различные. Так, заказчик может желать использовать БД IBM DB2, Oracle или, для небогатых заказчиков, бесплатный «Postgres». Мы разрабатываем модули для всех БД, которые, по нашему мнению, могут быть востребованы. Конечно, всего предусмотреть нельзя, и, возможно, что заказчик востребует БД, нами не предусмотренную. В таком случае, если его нельзя убедить в использовании альтернативной БД, возможно написание нового модуля БД.

В принципе программа может работать и без модулей вообще. В этом тоже есть преимущество над обычным использованием Интернета. Это ускорение работы и снижение трафика Интернета путем обращения к кэшируемой информации.

MIProxy будет располагать еще множеством других возможностей: разборка HTML с вырезом из тела запретной информации, список всегда разрешенных и всегда запрещенных расширений, переадресация, мультипортовость, мультипоточность и многое другое.

Вообще проект огромный. На данный момент сделано всего лишь 10%. Однако новая система начнет продаваться уже после того, как я закончу серверную часть. Дальше изменения будут вноситься во время эксплуатации, как было с «Почтамитой» (см. «Компас» № 2), в которой я являлся ведущим разработчиком.

В проект я попал в июле этого года (через полгода после его начала). После изучения задания на серверную часть я приступил к ее написанию. К настоящему моменту основа программы уже разработана. Сейчас дорабатывается и отлаживается основная часть (корень) программы, далее будут разрабатываться модули.

Теперь, для особо любопытных, немного о «кухне». В основу программы MIProxy положен принцип использования потоков. Потоки подразделяются на три категории, ну или на две, если не считать главный поток. Главный поток ждет соединения по сокету, после ее приема он считывает информацию, поступившую на сокет, и предпринимает какое-либо действие. В основном это запуск или останов «сервера». Server — это поток, который создается главным потоком при команде запуска и уничтожается при команде останова. В качестве аргумента для запуска сервера передается путь к его домашнему каталогу. Именно там находятся конфигурации. Серверный поток считывает их и стартует на том порту, который взят из настроек. Если порт уже занят, поток завершает работу, впрочем, как и при любой ошибке запуска.

Серверных потоков может быть сколько угодно. Каждый из них подобно главному потоку ждет соединения по сокету. Как только оно поступило, создается объект Client с информацией о сокете и другой необходимой информацией, который тут же записывается в очередь клиентов. Обязанность считывать эту очередь возложена на третий тип потоков — рабочие потоки. Эти потоки независимы относительно сервера, поэтому любой освободившийся рабочий поток может обработать любого клиента. Но, так как клиент содержит информацию о сервере, поймавшем его соединение, то работа его ведется с учетом настроек этого сервера. В отличие от серверных потоков рабочие потоки создаются главным потоком сразу. Их количество берется из основного файла настроек.

Ну а для тех, кто ничего из этого не понял, я просто отвечу на один простой вопрос: «Для чего нужны серверные потоки?». Дело в том, что одна и та же организация может использовать разные настройки. Например, школа использует один сервер — это правильно, учитывая общее кэширование. Но в различных классах могут использовать разные настройки. Например, в одном классе может использоваться NTLM-аутентификация, в другом — базовая; в одном нужна разборка HTML, в другом — нет; в старших классах могут быть разрешены сайты со «взрослыми картинками», в младших запрещены. Кроме того, в классах могут повторяться имена пользователей.

Универсальность программы обеспечивается благодаря системе модулей. Модуль — это библиотека, загружаемая программой при загрузке нового сервера, если она не загружалась ранее. Написать собственный модуль для MIProxy можно благодаря абстрактному классу, описанному в заголовочном файле ‘MiModule.h’. Класс, наследующий этот абстрактный класс, и является модулем. Работа с модулем ведется рабочими потоками, вызывающими его функции (методы) по правилам полиморфизма. Методы вызываются программой от начала работы с клиентом до конца.

Например, основная программа подает пользователю лишь окно аутентификации, а для проверки введенных имени пользователя и пароля, обращается к модулям. Если же ни в одном модуле не определен метод ‘check_auth’, то программа будет считать, что проверка не удалась, как если бы она была (например, с помощью модуля БД) и пароль был бы неверным. Вообще методы вызываются с самого начала соединения клиента, с метода reset, который может быть необходим модулям для отчистки старых данных и подготовки к обработке нового клиента, далее вызывается метод get_auth, который может совершить проверку без ввода имени и пароля (таковым является модуль MI-Ident), в случае удачной проверки метод check_auth запрашиваться уже не будет.

Есть также метод init_auth, в котором модуль может произвести инициализацию статуса пользователя, например администратор или обычный пользователь, или произвести откат аутентификации, если его данные противоречат данным другого модуля. Также вызываются методы для проверки переадресации, доступа к URL, разборки HTML и др.

Одно из главных преимуществ прокси-сервера — это, конечно, кэширование. Кэширование относится не только к содержанию URL-ов. Кэшируются и сессии. Так, например, если браузер уже проходил авторизацию, то он имеет зашифрованную строку, посылаемую на прокси в каждом запросе. Обнаружив эту строку, прокси ищет эту сессию в списке сессий, и если таковая имеется, то принимает ее параметры, пропустив вызов многих функций. Ускоряет работу также кэширование названий URL, запрашиваемых пользователем. Каждая сессия имеет список разрешенных URL. Если в таком списке находится запрашиваемый URL, то пропускается вызов функции check_url. Классы Cache, Session, URL являются производными от абстрактного класса TimeOut, соответственно, если объект не отвечает больше некоторого времени, он уничтожается. В случае с классом Cache при уничтожении объекта удаляется и файл.

Одно из самых интересных преимуществ MIProxy — разборка HTML. Благодаря настройкам можно определить правила разборки. Так, можно определить, файлы каких расширений нужно вырезать или заменять, например, можно навсегда разрешить загрузку файлов .css, .js для правильного запуска скриптов, или вместо запрещенных рисунков, определяемых по расширениям .jpg, .gif, .xpm, показывать другой рисунок. Также можно заменить или вырезать запрещенные ссылки.

Кроме самой программы MIProxy, для нее разрабатываются специальные утилиты. Например, утилиты startserver и stopserver соединяются с главным потоком программы, посылая команду запуска или останова серверов.

Клиентская часть разрабатывается стандартными средствами: html, xml, php, perl. Но основной характер работы системы все же определяется серверной частью. Главная программа MIProxy пишется, конечно же, на C++, как и все его модули.

Предполагается, что клиентские машины в основном будут работать под Windows, а сервера под AIX от IBM и различные Linux: RedHat, Mandrake, Debian. Вы не поверите, но на Linux ставится моя система «Pages Windows Menus». Некоторые утилиты написаны на моем языке pwmsh, который входит в систему. Кстати, к новому году я думаю выпустить «Pages Windows Menus 2 Euro Release», которую думаю подарить Главпочтамту Ташкента (с неограниченной лицензией).

Популярность системы MyInternet растет с каждым днем, и у нее уже немало Заказчиков. Например, буквально за одну неделю ноября прибавилось около 25 школ. Знаю также, что, кроме учебных заведений, клиентами уже являются участки полиции, библиотеки.

От редакции. Надеемся, что в одном из следующих номеров мы сможем узнать от нашего автора о продолжении развития этого интересного проекта.

Orphus system
В Telegram
В Одноклассники
ВКонтакте