20 февраля 2013 г. Erlang Jabber XMPP

FreeBSD. Установка и настройка сервера ejabber 2

Для внутренних нужд, понадобилось организовать защищенный обмен сообщениями между пользователями, был выбран протокол XMPP и сервер ejabber 2. Так как имелся свободный сервер на FreeBSD, было решено развернуть всё именно там.

ejabber написан на замечательном языке Erlang, в том числе и его конфигурационный файл, однако знаний языка для редактирования конфигурационного файла не требуется, он достаточно читабельный.

Сервер ejabberd является лидером среди Jabber-серверов. Его использует Facebook, Vkontakte, Yandex, Google и многие другие компании для своих сервисов. Часто используется для обмена данными по XMPP для всевозможных онлайн игр и т.д.

Для примера мы будем использовать домен для jabber-сервера jabber.example.org, а домен для конференций будет conference.jabber.example.org. IP-адрес сервера будет 203.0.113.42.

Установка

Обновим дерево портов:

cd /usr/ports
portsnap fetch update

И установим ejabberd:

cd /usr/ports/net-im/ejabberd
make install clean
echo 'ejabberd_enable="YES"' >> /etc/rc.conf

Генерация ключей

Для защиты трафика будем использовать SSL, создадим подкаталог для хранения ключей ejabberd:

mkdir /usr/local/etc/ejabberd/certs
cd /usr/local/etc/ejabberd/certs

openssl req -new -x509 -nodes -newkey rsa:1024 -days 3650 -keyout privkey.key -out ssl.pem \
-subj "/C=RU/ST=/L=/O=/OU=/CN=jabber.example.org/emailAddress=info@example.org"

cat privkey.key >> ssl.pem
rm privkey.key
chown ejabberd:ejabberd ssl.pem
chmod 600 ssl.pem

Где:

  • C - Country Name (2 letter code);
  • ST - State or Province Name (full name);
  • L - Locality Name (eg, city);
  • O - Organization Name (eg, company);
  • OU - Organizational Unit Name (eg, section);
  • CN - Common Name (eg, YOUR name). В нашем случае "jabber.example.org";
  • emailAddress - Email Address. В нашем случае "info@example.org".

Теперь перейдем к настройке.

Настройка

Необходимо войти в каталог настроек /usr/local/etc/ejabberd и скопировать примеры в реальные конфигурационные файлы:

cd /usr/local/etc/ejabberd
cp inetrc.example inetrc
cp ejabberdctl.cfg.example ejabberdctl.cfg
cp ejabberd.cfg.example ejabberd.cfg

После чего отредактируйте файл ejabberd.cfg (строки начинающиеся с символа "%" это комментарий):

%% Ищем {hosts, ["localhost"]}... заменяем на наш домен:
{hosts, ["jabber.example.org"]}.

%% Ищем {listen, [{5222, ejabberd_c2s}... и добавляем путь до сгенерированного ранее файла сертификата:
{certfile, "/usr/local/etc/ejabberd/certs/ssl.pem"}, starttls,

%% Далее ищем "{acl, admin, {user, "ermine", "example.org"}}." и указываем пользователя как админа:
{acl, admin, {user, "adw0rd", "jabber.example.org"}}.

%% Можете сменить "{access, max_user_sessions, [{10, all}]}.", для увеличения
%% количества одновременных пользовательских сессий (но это не обязательно):
{access, max_user_sessions, [{100, all}]}.

%% Для увеличения максимального количества офлайн сообщений, надо изменить 
%% "{access, max_user_offline_messages, [{5000, admin}, {100, all}]}." на (это тоже не обязательно):
{access, max_user_offline_messages, [{5000, admin}, {1000, all}]}.

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

Создание конференций (они же чаты)

За это отвечает протокол MUC (Multi-users conference), который дает возможность создавать комнаты для группового общения пользователей. В ejabberd за это отвечает модуль muc_module, ну и все остальные модули с префиксом "muc_".

Одна из проблем, с которой вы можете столкнуться это ограничение на количество сообщений, которое хранится пока пользователь находится в офлайне. По умолчанию это 20 сообщений, т.е. если вы отсутствовали более чем 20 сообщений в чате, то вам достануться только последние 20. Можно указать другое значение, для этого измените опцию history_size, в конечном итоге это будет выглядить так:

{mod_muc,      [
              {host, "conference.@HOST@"},
              {access, muc},
              {access_create, muc_create},
              {access_persistent, muc_create},
              {access_admin, muc_admin},
              {history_size, 1000}
             ]},

Также, мы расскоментировали строку {host, "conference.@HOST@"}, которая регистрирует имя домена для конференций, т.е. у нас получится "conference.jabber.example.org".

Настройка DNS для домена example.org

Необходимо добавить следующие A и SRV-записи. В качестве примера DNS-сервера выступает Bind9, но вы можете использовать любой другой, совместимый с его конфигурационным файлом:

jabber                  A       203.0.113.42
conference.jabber       A       203.0.113.42
_xmpp-server._tcp.jabber.example.org. IN SRV 0 0 5269 jabber.example.org.
_jabber._tcp.jabber.example.org.      IN SRV 0 0 5269 jabber.example.org.
_xmpp-client._tcp.jabber.example.org. IN SRV 0 0 5222 jabber.example.org.

Применяем настройки:

named-checkconf
rndc reload

После чего можете проверить записи с помощью утилиты dig, пример:

dig -t srv _xmpp-server._tcp.jabber.example.org

В результате должны получить ANSWER-секцию следующего содержания:

;; ANSWER SECTION:
_xmpp-server._tcp.jabber.example.org. 3600 IN SRV 0 0 5269 jabber.example.org.

Запуск сервера

Запустите ejabberd:

/usr/local/etc/rc.d/ejabberd start

Если запуск не удался, то возможно у вас проблема с .erlang.cookie, укажите нужные права на файл /var/spool/ejabberd/.erlang.cookie (т.е. в домашнем каталоге должен храниться этот файл, посмотреть домашний каталог можно так pw usershow ejabberd). Устанавливаем права:

chown ejabberd:ejabberd /var/spool/ejabberd/.erlang.cookie
chmod 400 /var/spool/ejabberd/.erlang.cookie

Если сервер никак не запускается (у меня такое было однажды), то я просто ребутнул сервак и после ребута все само поднялось.

Административный веб-интерфейс и добавление пользователей

После старта ejabberd у нас станет доступен TCP-порт 5280, по которому будет отвечать веб-сервер ejabberd, войдите в него:

http://jabber.example.org:5280/admin/

Можно также создать Nginx-конфиг и проксировать на порт 5280, прикрутив дополнительно поддержку SSL:

server {
    ssl_protocols SSLv3 TLSv1;
    ssl_certificate /path/to/certs/jabber.pem;
    ssl_certificate_key /path/to/certs/jabber.key;

    listen 443 ssl;
    server_name jabber.example.org;

    location / {
        proxy_pass http://localhost:5280;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Не забываем сгенерировать сертификат для веб-интерфейса:

cd /path/to/certs/
openssl req -new -x509 -nodes -newkey rsa:1024 -days 3650 -keyout jabber.key -out jabber.pem \
-subj "/C=RU/ST=/L=/O=/OU=/CN=jabber.example.org/emailAddress=info@example.org"

Пользователей можно добавлять в консоли, через ejabberdctl. Первого пользователя (которого мы указали в качестве админа в конфигурационном файле) вам придется обязательно добавить таким способом, так как вам надо пройти авторизацию в веб-интерфейсе, а без учетной записи это не получится сделать:

ejabberdctl register adw0rd jabber.example.org <PASSWORD>

Далее вы можете добавлять пользователей прямо в веб-интерфейсе http://jabber.example.org:5280/admin/server/jabber.example.org/users/.

Общение голосом и видео

Сервер ejabberd напрямую не предоставляет таких услуг. Это реализуется за счет протокола Jingle и конкретных реализаций на стороне клиента. Данные обменивают по принципу P2P и поэтому могут встречаться проблемы у пользователй, которые работают из-под NAT. Для этих целей следует использовать STUN-сервер.

Я не настраивал Jingle, но если это когда-нибудь сделаю, то обязательно напишу об этом. А пока смотрите:

Настройка клиента

Для примера возьмем Pidgin, так как это простой для настроек клиент и доступен на многих платформах. Установите этот клиент, после чего нажмите на Accounts -> Manage Accounts -> Add.... И примерно так заполните форму Add Account:

Pidign

После чего пробуйте подключиться, все у вас должно получиться!

Что еще почитать?

Комментарии

Подсказали как сделать общие группы ростера, надо подключить "mod_shared_roster". После чего, в веб-админке вашего виртуально хоста появится меню "Shared Roster Groups", в котором вы можете заводить группы, пользователи которых будут видны всем участникам вашего хоста

Оставьте свой комментарий

Markdown