Союз
тети Аси и дяди Джаббера
Сегодня как никогда
популярны различные системы мгновенного
обмена сообщениями, вроде ICQ, Jabber, AOL,
MSN, Yahoo, где общение происходит в реальном
времени. Если ранее во многих организациях
администраторы просто блокировали
такой трафик, чтобы перекрыть возможный
канал утечки информации, то сейчас
неоспоримым является тот факт, что
применение IM-систем часто повышает
производительность. Так давай на
учебе/работе установим свой собственный
Jabber и/или ICQ-сервер.
Jabber vs ICQ
Несмотря на то что
пользователи больше знают об ICQ, самым
популярным среди открытых проектов по
разработке IM-сервера, является Jabber.
Jabber использует открытый протокол XMPP
(eXtensible Messaging and Presence Protocol), применяющий
для быстрого обмена сообщениями и
информацией о присутствии между любыми
двумя абонентами не plain-текст, а XML. Хотя
это и несколько увеличивает объем
сообщения и требует наличия XML-парсеров,
которые потребляют некоторую часть
ресурсов, но взамен Jabber дает гибкость
и расширяемость. Благодаря гибкости
протокола jabber-сервер способен поддерживать
ICQ, IRC, MSN, RSS, Yahoo и др. Да, если ICQ - это только
обмен сообщениями между двумя
пользователями, то Jabber включает и
возможности IRC. Поэтому вместо двух
серверов (ICQ и IRC) вполне возможно обойтись
и одним. Так будет гораздо удобнее и
администраторам, и пользователям. В
Jabber изначально используется Unicode, поэтому
проблем с кодировками не существует.
Также Jabber отличает продуманная система
защиты информации. Все реализации
серверов поддерживают SSL, клиенты -
шифрование с помощью PGP/GPG. Пароли не
передаются в открытом виде, а используются
md5-хеши. Протокол XMPP, в отличие от ICQ,
стандартизирован и открыт, поэтому
список серверов, реализующих его, на
порядок больше, чем у ICQ.
Серверы Jabber
Вероятно, самый полный
список серверов, реализующих Jabber, можно
найти по адресу www.jabber.org/software/servers.shtml.
После просмотра столбцов Feature Score и
License=Gnu GPL из всех присутствующих можно
отобрать лишь четыре: jabberd 1.x и 2.x, OpenFire
и ejabberd. Список поддерживаемых операционных
систем у всех одинаков: AIX, *BSD, HP-UX, Linux,
MacOS X, Solaris, Windows. Поэтому смотрим
функциональность и удобство.
Первые два - очень
хорошие серверы, отличаются стабильностью
в работе, написаны на языке С. По
возможностям эти серверы являются лишь
базой, поскольку большая их часть (вроде
конференций, поиска пользователей и
некоторых других) реализована посредством
плагинов. Чтобы заставить работать
некоторые комбинации, придется изрядно
попотеть. К тому же версия 1.x уже
практически не развивается.
Сервер OpenFire (до февраля
2007 года - WildFire) - самый простой в установке,
так как для его запуска требуется лишь
наличие Java Runtime Environment. Да, он написан на
Java, но сегодня это никого уже пугать не
должно. Для тех, кто не хочет использовать
внешнюю базу данных (MySQL, Postgres, Microsoft SQL
Server, DB2), в наличии есть встроенная HSQLDB.
Все настройки осуществляются через
удобный веб-интерфейс. В установке по
умолчанию OpenFire имеет большое количество
возможностей, остальное (Asterisk,
широковещательные сообщения, IM-шлюз,
контент-фильтр и прочее) реализуется
посредством плагинов.
Последний названный
нами сервер - ejabberd.
Практически все его возможности,
заложенные в протоколе, реализованы из
коробки. Написан он на языке Erlang,
в качестве базы данных используется
Mnesia (поддерживаются и другие: MySQL,
PostgreSQL). Язык Erlang предназначен для создания
отказоустойчивых распределенных
приложений. Результат - ejabberd может
работать в кластере, когда один домен
физически могут обслуживать несколько
серверов, синхронизируя информацию
через единую базу данных. Откомпилированные
приложения выполняются в Erlang (JAM) emulator,
этим он несколько похож на Java. Этот
сервер и выбираем для установки.
Установка ejabberd
На странице закачки
проекта ejabberd
можно найти ссылки на установочные
файлы для Windows, Mac OS X (PowerPC и Intel), Linux и
исходные тексты. В репозитариях
дистрибутивов Debian, Ubuntu, Mandriva, OpenSUSE,
Fedora, FreeBSD имеются пакеты для установки
ejabberd. Для компиляции, помимо make и gcc,
понадобятся библиотеки OpenSSL и Zlib, а также
Erlang/OTP. Установка последнего несколько
необычна, но проста.
Скачиваем дистрибутив:
$ wget –c
http://erlang.org/download/otp_src_R11B-4.tar.gz
Создаем каталог для
установки:
$ sudo mkdir /usr/local/erlang
$ cd /usr/local/erlang
$ sudo mkdir otp_r11b
$ cd otp_r11b
Распаковываем дистрибутив:
$ sudo gunzip -c
/home/grinder/otp_src_R11B-4.tar.gz | tar xfp -
Запускаем установочный
скрипт:
$ sudo ./Install
/usr/local/erlang/otp_r11b
Скрипт начнет задавать
вопросы, в большинстве случаев достаточно
оставлять значение по умолчанию, просто
нажимая «Enter». По окончании установки
для удобства создаем символическую
ссылку на исполняемый файл:
$ sudo ln -s
/usr/local/erlang/otp_r11b/bin/erl /usr/bin/erl
Установка ejabberd из
исходных текстов стандартна:
./configure; make; sudo make install
В Ubuntu и других
дистрибутивах, имеющих в репозитарии
ejabberd, процесс установки выглядит на
порядок проще:
$ sudo apt-get update
$ sudo apt-get install ejabberd
В результате будет
установлен не только сервер ejabberd, но и
все зависимости, включая erlang. Пакет с
расширением bin для Linux и exe для Windows
предлагают графический инсталлятор,
позволяющий по ходу установки произвести
основные настройки.
Конфигурационный
файл ejabberd
Все настройки находятся
в конфигурационном файле
/etc/ejabberd/ejabberd.cfg. При загрузке демон
считывает этот файл, анализирует и
сохраняет в базу данных. Конфигурационный
файл содержит последовательность
условий Erlang. Все строки, начинающиеся
со знака «%», считаются комментариями
и игнорируются. Любое условие состоит
из названия параметра, которое находится
на первом месте, а далее идет одно или
несколько его возможных значений. В
конце условия обязательно ставится
точка. Также следует помнить, что в
условиях не должно быть разрывов, то
есть лишних строк, для правки желательно
использовать редактор, умеющий ставить
Unix'овый одиночный символ окончания
строки.
Если какое-либо из
условий не будет определено в
конфигурационном файле, используются
значения, сохраненные в базе данных.
Чтобы их аннулировать, применяются
конструкции override_global, override_local,
override_acls. Обычно условия сразу вставляют
в конфигурационный файл, чтобы не
путаться в том, какие настройки сервер
знает, а какие нет. При установке, как с
использованием исходных текстов, так
и с помощью пакетов, создается шаблон,
остается его лишь немного подправить:
override_acls.
%
Список домена(ов), который обслуживает
сервер
{hosts,
["grinder.com", "localhost"]}.
%
Язык сообщений сервера
{language, "ru"}.
%
Пользователи с привилегиями администратора
{acl, admin,
{user, "grinder"}}.
{acl, admin,
{user, "sergej"}}.
%
Список заблокированных пользователей
{acl, blocked,
{user, "test"}}.
%
Разрешаем локальных пользователей
{acl, local,
{user_regexp, ""}}.
%
Разрешаем использовать конфигурационный
интерфейс
только
администраторам
{access,
configure, [{allow, admin}]}
%
Разрешаем регистрацию пользователей
{access,
register, [{allow, all}]}.
%
Так можно запретить самостоятельную
регистрацию
пользователей,
сделав сервер закрытым
%{access,
register, [{deny, all}]}.
%
Сообщение при регистрации, можно
использовать
буквы
русского алфавита
{welcome_message,
{"Welcome!",
"Welcome Grinder Jabber Service."}}.
%
Кому отсылать сообщения о регистрации
новых пользователей
{registration_watchers,
["grinder@grinder.com"]}.
%
Разрешаем только админам отсылать
многоадресные
объявления
{access,
announce, [{allow, admin}]}.
%
Только незаблокированные пользователи
могут соединяться с севером
{access, c2s,
[{deny, blocked}, {allow, all}]}.
%
Администраторы сервера являются и
администраторами
MUC (Multi User
Chat)
{access,
muc_admin, [{allow, admin}]}.
%
Разрешаем всем пользователям подключаться
к MUC
{access, muc,
[{allow, all}]}.
%
Используем встроенную базу данных
{auth_method,
internal}.
%
Порты, на которых будут работать сервисы
ejabberd
{listen,
%
Обычный сервис client-2-server
[{5222,
ejabberd_c2s, [{access, c2s},
starttls,
{certfile, "/etc/ssl/certs/ejabberd.pem"},
{shaper,
c2s_shaper}]},
%
Сервис client-2-server с использованием SSL
{5223,
ejabberd_c2s, [{access, c2s},
tls, {certfile,
"/etc/ssl/certs/ejabberd.pem"},
{shaper,
c2s_shaper}]},
%
Порт для работы server-2-server
{5269,
ejabberd_s2s_in, [{shaper, s2s_shaper}]},
{outgoing_s2s_port,
5269}.
%
Транспорт Jabber <-> ICQ
{5347,
ejabberd_service, [{ip, {127, 0, 0, 1}}, {access, local},
{host,
["icq.grinder.com", "sms.localhost"], [{password,
"secret"}]}]},
%
Веб-интерфейс
{5280,
ejabberd_http, [http_poll, web_admin]}]}.
%
Используемые модули и параметры
{modules,
[
{mod_announce,
[{access, announce}]},
...
]}.
В принципе, конфигурационный
файл понятен, но при его заполнении
следует быть внимательным.
Настраиваем DNS, заводим
администраторов
В этом же каталоге
находится еще один важный файл - inetrc,
отвечающий за работу со службой DNS. Если
сервер ejabberd применяется в локальной
сети, где нет смысла настраивать
DNS-сервер, необходимо указать на
использование /etc/hosts:
{file, hosts,
"/etc/hosts"}.
{file, resolv,
"/etc/resolv.conf"}.
%
сначала ищем записи в hosts, а затем
обращаемся к DNS
{lookup, [file,
dns]}.
В файле /etc/hosts должна
быть запись, указывающая на соответствие
IP-адреса и имени компьютера:
127.0.0.1 localhost
192.168.1.158 grinder.com
Теперь запускаем/перезапускаем
сервер. Это можно сделать двумя способами.
Стандартным:
$ sudo /etc/init.d/ejabberd restart
Или с использованием
утилиты ejabberdctl:
$ sudo ejabberdctl restart
Проверяем статус работы
сервера:
$ sudo ejabberd acl status
Node ejabberd@grinder is started.
Status: started
Если в ответ мы получаем
другое сообщение, то просматриваем
вывод netstat -na. Если в выводе нет открытых
портов, указанных в конфигурационном
файле, значит, сервис не запустился (или
запустился частично). Останавливаем
его работу и проверяем ejabberd.cfg. Если же
порты в списке есть, то начинать следует
с разрешения имен.
Теперь необходимо
завести пользователей, имеющих права
администратора. В нашем случае это
grinder и sergej:
$ sudo ejabberdctl register sergej
grinder.com super_password
Проверяем, что пользователь
успешно создан:
$ sudo ejabberdctl registered-users
sergej@grinder.com
Все нормально, аналогично
заводим и второго админа. Теперь, если
был разрешен веб-интерфейс, вызываем
веб-браузер и заходим на страницу
http://grinder.com:5280/admin. На запрос имени
пользователя и пароля вводим параметры
учетной записи администратора. Только
к имени добавляем и домен, то есть вместо
sergej вводим sergej@grinder.com. Веб-интерфейс
позволяет в удобной форме настраивать
списки управления доступом, заводить
и удалять пользователей, просматривать
статистику. Следует помнить, что все
настройки, произведенные через
веб-интерфейс, в конфигурационном файле
не сохраняются. При наличии записей
override_* они будут действительны до первой
перезагрузки. Все, сервер к работе готов,
можно зазывать пользователей.
Транспорт ICQ <->
Jabber
Некоторые пользователи,
вероятно, не захотят отказываться от
ICQ. Для них можно настроить транспорт
ICQ <-> Jabber. Организуется он с помощью
PyICQt, для работы
которого дополнительно потребуются
библиотеки Twisted, PyCrypto и PyOpenSSL.
В Ubuntu/Debian их очень просто установить
одной командой:
$ sudo apt-get install python-twisted
python-crypto python-pyopenssl
Так мы установим Python и
прочие недостающие программы и библиотеки.
Теперь скачиваем и распаковываем PyICQt.
Переименовываем шаблон конфигурационного
файла config_example.xml в config.xml и редактируем:
<pyicqt>
<jid>icq.grinder.com</jid>
<!—
здесь указан текущий каталог,
ejabberd
должен
иметь право на запись в него -->
<spooldir>.</spooldir>
<pid>PyICQt.pid</pid>
<mainServer>127.0.0.1</mainServer>
<mainServerJID>ejabberd.localhost</mainServerJID>
<!—
веб-интерфейс нужен nevow
(www.nevow.org) -->
<website>http://jabber.localhost/</website>
<webport>12345</webport>
<port>5347</port>
<!— пароль
для доступа к ejabberd;
должен совпадать с ejabberd.cfg -->
<secret>secret</secret>
<!— язык
для сообщений об ошибках -->
<lang>en</lang>
<encoding>cp1251</encoding>
<icqServer>login.icq.com</icqServer>
<icqPort>5190</icqPort>
<!—
блокируем регистрацию (по
желанию) -->
<disableRegister/>
<enableAutoInvite/>
<!--
<disableXHTML/> -->
<!--
<disableMailNotifications/> -->
<disableDefaultAvatar/>
<admins>
<jid>grinder@localhost</jid>
</admins>
</pyicqt>
Теперь запускаем шлюз
командой python PyICQt.py. Открываем Jabber-клиент,
в браузере ресурсов находим icq.grinder.com и
вводим свой UIN и пароль. Если все настроено
правильно, то в списке должен появиться
агент с именем ICQ Transport или подобный.
После этого можно добавлять контакты
ICQ в форме UIN@grinder.com.
Настройка IServerd
Эту часть статьи посвятим
приверженцам протокола ICQ. Выбор
ICQ-сервера упрощается практическим
отсутствием альтернатив. Единогласно
на всех ресурсах рекомендуется один
сервер - IServerd (ICQ server daemon, iserverd.khstu.ru).
Он исходно работает только под
Unix-совместимыми системами, но автор
говорит, что, возможно, он скомпилируется
при помощи cygwin под Windows. На настоящий
момент существуют две ветви проекта:
стабильная (2.x.x или stable) и версия для
разработчиков (3.x.x). Для установки будем
использовать последний на момент
написания статьи IServerd-stable (2.5.5). Также
для хранения информации обо всех
зарегистрированных пользователях,
включая пароли, записей о подключенных
пользователях, отложенных сообщениях
и т.д. потребуется PostgreSQL. Установка
IServerd стандартна:
./configure --prefix=/usr
--with-russian; make; make install
Запускаем PostgreSQL.
$ sudo /etc/init.d/postgresql start
В подкаталоге script архива
с исходными текстами находим файл
db_manage, который поможет создать все
необходимые базы:
$ sudo chmod +x ./db_manage
$ su postgres
$ ./db_manage.sh create
Скрипт спросит имя
новой базы (users_db), пользователя для
доступа (iserverd) и пароль. Переходим в
каталог /etc/iserverd и копируем:
$ sudo cp iserv.conf.default iserv.conf
C остальными файлами,
имеющими префикс «default», поступаем
аналогично. Основной конфигурационный
файл называется iserv.conf. Необходимо
подправить в нем ряд параметров:
# по
умолчанию IServerd будет ожидать
соединения
на всех интерфейсах
Bind interface =
0.0.0.0/32
# файл
трансляции из каталога translate,
чтобы все
данные в БД были в общепринятой
для указанного
языка кодировке
Translate table =
RUSSIAN_WIN
# кому
отправлять сообщения
Admin email =
grinder@localhost
Info Password =
super_password
#
параметры подключения к БД
database user =
iserver
database password
= password
database addr =
127.0.0.1
database port =
5432
users db name =
users_db
#
подключаем файлы с описанием
протоколов
Include =
etc/v3_proto.conf
Include =
etc/v5_proto.conf
Include =
etc/v7_proto.conf
Чтобы клиенты могли
регистрироваться самостоятельно, в
файле v3_proto.conf устанавливаем следующие
параметры (в файлах v5_proto.conf и v7_proto.conf
есть аналогичный параметр):
V3 auto registration = Yes
V3 post-register info =
etc/texts/post_reg_auto.txt
Пользователей можно
заводить и вручную. Для этой цели в
комплекте имеется утилита icquser:
$ su pgsql
$ cd /etc/iserverd/db
$ ./icquser add UIN
Для автоматического
запуска сервера в каталоге script подготовлены
два скрипта: iserverd.sh и iserverd.sh.asp. Второй
ориентирован на RedHat и производные от
него дистрибутивы. В общем случае
копируем iserverd.sh в /etc/init.d и создаем
символическую ссылку на нужный уровень
запуска:
$ sudo script/iserverd.sh
/etc/init.d/iserverd
$ sudo ln –s /etc/init.d/iserverd
/etc/rc3.d/S98iserverd
Стартуем:
$ sudo /etc/init.d/iserverd start
Также стоит обратить
внимание на наличие веб-интерфейса для
IServerd - isdwm (iserverd.khstu.ru/isdwm/index_r.html). C его
помощью можно легко найти и просмотреть
параметры, добавить, блокировать и
удалить учетную запись, очистить список
отложенных сообщений и т.д. Будет полезен
и набор скриптов для сбора статистики
iserverd.khstu.ru/download/IServerd-stat.tar.gz.
Надеюсь, теперь установка
своего ICQ или Jabber-сервера не должна
вызвать проблем. Успехов. Статья взята с www.xakep.ru
|