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, войдите в него:
Можно также создать 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 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>
Далее вы можете добавлять пользователей прямо в веб-интерфейсе .
Общение голосом и видео
Сервер ejabberd напрямую не предоставляет таких услуг. Это реализуется за счет протокола Jingle и конкретных реализаций на стороне клиента. Данные обменивают по принципу P2P и поэтому могут встречаться проблемы у пользователй, которые работают из-под NAT. Для этих целей следует использовать STUN-сервер.
Я не настраивал Jingle, но если это когда-нибудь сделаю, то обязательно напишу об этом. А пока смотрите:
Настройка клиента
Для примера возьмем Pidgin, так как это простой для настроек клиент и доступен на многих платформах. Установите этот клиент, после чего нажмите на Accounts -> Manage Accounts -> Add.... И примерно так заполните форму Add Account:

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