In deus ex machine we trust.
Arcanoid

Установка и настройка корпоративного Jabber-сервера

Установка и настройка корпоративного Jabber-сервера

Вступление

Вот и назрела потребность в Jabber сервере. Их представлено множество, но выбор пал на ejabberd. Почему именно eJabber?

Ну, во-первых, простота настройки: по сравнению со всеми XML-конфигурируемыми серверами, конфиги на языке "erlang" выглядят более-менее прилично. Я люблю писать XML конфиги, это, конечно, удобно, когда во всём разбираешься. Но, когда всё это видишь впервые, хочется только одного: поймать разработчиков, и как следует допросить их, почему был невозможен секционный конфиг. Зато конфиг на erlang'е исповедует именно секционность, правда слегка непривычно организованную в виде фигурных скобочек:

Пример конфига ejabberd:

{listen,
    %% Jabber ICQ Transport
    {5347, ejabberd_service, [
        {ip, {127, 0, 0, 1}},
        {access, local},
        {hosts, ["icq.demlabs.ru", "sms.icq.demlabs.ru"]},
    ]},
},

Если абстрагироваться от синтаксиса erlang'а, то перед нами всё тот же секционный конфиг с неограниченной вложенностью элементов и дефолтными конструкциями. Тот же XML только более понятный.

Итого: ejabberd — это то, что нам подходит.

Установка

Открываем рутовую консоль и там пишем:

# aptitude install ejabberd

Теперь ejabberd установился. Так же нам понадобиться пакет openssl:

# aptitude install openssl

С помощью него генерируем самоподписанный сертификат x509:

# cd /tmp
# openssl req -new -x509 -nodes -newkey rsa:2048  \
   -keyout privkey.pem -out  /etc/ejabberd/ejabberd.pem
# cat privkey.pem >> /etc/ejabberd/ejabberd.pem
# rm privkey.pem

Без этой штуки не заработает TLS шифрование, что повлечёт за собой игнорирование большинства известных Джаббер-серверов, того же gmail'а. По-хорошему, конечно, самоподписанный сертификат не то, на чём стоит остановливаться. На сайте сообщества XMPP можно получить сертификат, подписанный корневым сертификатом сообщества. Тогда Jabber-клиент не будет ругаться, что сертификат "неизвестной породы".

Для того, чтобы работал шлюз в сеть ICQ, нужно установить программу-транспорт. Программисты компании Google (а так же программисты коммьюнити) в поте лица создавали PyICQt, грех не воспользоваться им.

# aptitude install pyicqt

Настройка ejabberd

Открываем /etc/ejabberd и находим конфиг ejabberd.cfg.

И начинаем его редактировать. Для начала ищем override_acls и раскоментируем его:

%% Override local options (specific for this particular ejabberd node).
override_acls

Этим мы разрешаем перезапись дефолтных политик безопасности.

Далее прописываем имя хоста, в нашем случае это, конечно, demlabs.ru:

%% Hostname
{ hosts, ["demlabs.ru"] }.

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

Ищем ключевое слово route_subdomains:

{route_subdomains, s2s}.

И снимаем комментарий перед ним. Без этой директивы Джаббер будет "вещью в себе", без возможности поболтать с пользователями XMPP с других серверов.

Переходим к секции {listen,, в ней описаны сетевые сервисы, предоставляемые сервером. Надо заметить, что модульность в джаббер-серверах делается именно с помощью сетевых сервисов. Пользовательские директории, внешние транспорты и прочие необязательные "фишки" описываются там же, где и прослушка клиентских соединений.

Маленькая ремарка: стандарт XMPP различает два типа соединений:

  • s2s — server-to-server, соединение между двумя серверами
  • c2s — client-to-server, соединение между клиентом и сервером

Для начала убедимся, что у нас всё в порядке с портом, прослушивающим c2s соединения:

%% слушаем порт 5222 и разрешаем доступ всем:
{5222. ejabberd_c2s, [ { access,c2s},      
%% устанавливаем ограничение по ширине канала
{shaper,c2s_shaper}, 
%% максимальный размер кэша
{max_stanza_size,65536},
%% включаем возможность SSL и указываем путь к сертификату
tls,{certfile, "/etc/ejabberd/ejabberd.pem"}
]},

делаем такую же запись для порта 5223 (старый порт для SSL соединений):

%% слушаем порт 5223 и разрешаем доступ всем
{5223. ejabberd_c2s, [ { access,c2s},
%% устанавливаем ограничение по ширине канала
{shaper,c2s_shaper},
%% максимальный размер кэша
{max_stanza_size,65536},
%% включаем возможность SSL и указываем путь к сертификату
tls,{certfile, "/etc/ejabberd/ejabberd.pem"}
]},

Снимаем комментарии с сервиса входящих s2s соединений:

{5259. ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},

Самое главное — убедиться в наличие строчки "tls-бла-бла-бла" и правильном пути к файлу с сертификатами. Остальное должно по дефолту быть в порядке.

Далее снимаем комментарии с секции ICQ Transport'а:

%% Jabber ICQ Transport
%% слушаем порт 5347:
{ 5347, ejabberd_service, [ 
%% на локальном IP адресе: 
{ip, {127.0.0.1}},
%% и разрешаем доступ только локальный
{access, local },
{hosts, ["icq.demlabs.ru". "sms.icq.demlabs.ru"], 
        [{password,"verystrongpassword"}]}   
%% имя хостов шлюза, если указать что-то что резолвится 
%% только локально, то гейт не будет доступен снаружи
]},

И последняя, интересующая нас подсекция — listen — но не последняя по значению!

Секция web админки:

%% Слушаем порт 5280 и на нём висит админко:
{5280, ejabberd_http, [
http_poll,                          
web_admin
]}

далее снимаем комментарий с s2s_user_starttls и с s2s_certfile, убеждаемся, что путь указывает на наш файл с сертефикатом:

{s2s_use_starttls, true}.
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.

утверждаем правила по-умолчанию для всех:

{s2s_defaulkt_policy, allow}.

Проверим конфиг на предмет открытой регистрации для всех:

{access, register, [{allow, all}]}.

Выставим язык по умолчанию для сообщений сервера:

{language, "ru"}.

Идём в секцию `{modules', ищем упоминание mod_register и вбиваем туда свой текст регистрации:

{mod_register, [
{welcome_message, {"Добро пожаловать!",
    "Добро пожаловать на XMPP сервер компании DEM Labs."}
{access, register}
]},

С этим вроде всё.

Теперь идём в файл /etc/ejabberd/inetrc и приводим его к следующему виду(если нет зарегистрированного домена):

{file,hosts, "/etc/hosts"}.

или, если такой есть,

{file, resolv, "/etc/resolv.conf"}

Этим мы избавляем себя от необходимости содержания мастер-зоны на своём сервере с нужными записями.

Не забудьте прописать в /etc/hosts все ваши доменные имена, если у вас нет зарегистрированного интернет домена.

Настройка PyICQt

Открываем файл /etc/pyicqt.conf.xml — - XML конфиг! Но прежде, чем застрелиться от ужаса, необходимо привести его к божескому виду.

Для начала выставим Jabber Identificator (сокращённо JID):

<jid>icq.demlabs.ru</jid>

Далее установим адрес аплинк-сервера (в нашем случае это локальный адрес нашего eJabberd) и краткое его описание:

<mainServer>127.0.0.1</mainServer>
<mainServerJID>demlabs.ru</mainServerJID>
<website>http://demlabs.ru</website>

Укажем порт прослушивания и пароль. Проверьте, эти данные должны совпадать с теми, которые указаны в секции ICQ transport в конфигурационном файле ejabberd.

<port>5347</port>

<secret>strongpassword</secret>

Укажем русский языком сообщений по умолчанию.

<lang>ru</lang>

Важный момент! Кодировкой для ICQ сетей является CP1251.

<encoding>cp1251</encoding>

Так же напишем свой текст приветствия при соединении (заносим в комментарии, если такого не требуется)

<sessionGreeting> Добро пожаловать в ICQ гейт компании 
    DeM Labs. Если вы это видите, значит, ICQ уже работает 
</sessionGreeting>

и текст для новых зарегистрированных клиентов:

<registerMessage>Вас только что с превеликим удовольствием
    зарегистрировал ICQ шлюз PyICQt!</registerMessage>

Укажем администраторов шлюза:

<admins>
<jid>admin@demlabs.ru</jid>

</admins>

Важный момент! Для ОС семейства Linux следующая опция кардинально улучшает производительность сервера:

<reactor>epoll</reactor>

Заключение

Перегружаем сервисы (обычно они автоматически стартуют сразу же после установки).

# /etc/init.d/pyicqt restart
# /etc/init.d/ejabberd restart

Подключаемся своим любимым Jabber-клиентом(в моём случае это Psi), регистрируем пользователя, регистрируем номер "аси" на ICQ-шлюзе(для этого надо зайти в список сервисов и поискать в выпадающем меню пункт "Registration") — и забываем навсегда про ICQ-клиенты и необходимость их обновлять из-за причуд Mirabilis.

Теперь этим будет заниматься администратор шлюза ;)