Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Установка и настройка XMPP сервера Prosody на Debian 9

profile picture
Author
Noah Seefried
Published
2019-03-07
Time to read
17 minutes reading time

Введение

Prosody это современный и широко известный xmpp-сервер, написанный на Lua. Это руководство поможет развернуть современный xmpp-сервер, который проходит все тесты совместимости на compliance.conversations.im и имеет некоторые дополнительные функции.

В этом руководстве используется последняя версия («trunk»). В ней содержится больше функций, и она довольно стабильна.

Если вы находитесь за межсетевым экраном, на котором разрешено прохождение трафика для ограниченного числа портов, пожалуйста, следуйте руководству внизу.

По соображениям конфиденциальности мы минимизируем хранящиеся метаданные и файлы журналов.

Вот минимальный набор для начала:

  • Небольшой виртуальный (облачный) сервер
  • Собственный домен (example.com в этом руководстве)
  • Базовые знания о Linux

Предположения

По умолчанию все команды выполняются от пользователя root.

Должна быть установлена базовая система с доступом по SSH. Убедитесь, что доступ по SSH защищен. В данном руководстве не затрагивается тема настройки межсетевого экрана. Если вы хотите ограничить доступ к открытым портам, то найти их можно при помощи netstat -tulpen.

Сервер будет доступен по адресу xmpp.example.com. Идентификаторы пользователей будут выглядеть так: user@example.com. Чтобы немного облегчить предстоящую работу мы также направим example.com на сервер. Вы не обязаны это делать, просто обратите внимание на действия во время создания сертификата.

Пример терминологии

  • Cервер IPv4: 10.0.0.1
  • Cервер IPv6: 2001:db8:1234::1
  • Ваш XMPP-ID (имя пользователя) будет holu
  • Загрузка файлов: xmpp.example.com
  • MUC (Multi User Chat — многопользовательский чат): conference.example.com (другие также используют muc. или chat.)
  • Pubsub: pubsub.example.com
  • Прокси: proxy.example.com
  • Каталог пользователей (VJUD): vjud.example.com
  • Адреса электронной почты или псевдонимы: abuse@example.com, support@example.com, security@example.com
  • Адрес электронной почты администратора: holu@example.com

Шаг 1 — Настройка DNS-записей

Настройте следующие DNS-записи:

example.com. 7200 IN A 10.0.0.1
example.com. 7200 IN AAAA 2001:db8:1234::1

xmpp.example.com. 7200 IN A 10.0.0.1
xmpp.example.com. 7200 IN AAAA 2001:db8:1234::1

conference.example.com. 7200 IN A 10.0.0.1
conference.example.com. 7200 IN AAAA 2001:db8:1234::1

pubsub.example.com. 7200 IN A 10.0.0.1
pubsub.example.com. 7200 IN AAAA 2001:db8:1234::1

proxy.example.com. 7200 IN A 10.0.0.1
proxy.example.com. 7200 IN AAAA 2001:db8:1234::1

vjud.example.com. 7200 IN A 10.0.0.1
vjud.example.com. 7200 IN AAAA 2001:db8:1234::1

_xmpp-client._tcp.example.com. 14400 IN  SRV 5 1 5222 xmpp.example.com.
_xmpps-client._tcp.example.com. 14400 IN SRV 10 1 5223 xmpp.example.com.

_xmpp-server._tcp.example.com. 14400 IN SRV 5 0 5269 xmpp.example.com.

_xmpp-server._tcp.conference.example.com. 14400 IN SRV 10 10 5269 xmpp.example.com.

Шаг 2 — Установка

Сначала добавьте официальный репозиторий, чтобы получить наиболее свежую версию («trunk»)

wget https://prosody.im/files/prosody-debian-packages.key -O- | gpg --dearmor | tee /etc/apt/trusted.gpg.d/prosody.gpg
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | tee -a /etc/apt/sources.list.d/prosody.list

а затем установите последнюю доступную сборку. Также надо установить gnupg, git и mercurial.

apt-get update && apt-get install prosody-trunk gnupg git mercurial

Не забудьте на время остановить prosody.

prosodyctl stop

После этого загрузите, так называемые, «модули сообщества», которые добавят больше возможностей в xmpp-сервер.

hg clone https://hg.prosody.im/prosody-modules/ /opt/prosody-modules

Измените владельца каталога с модулями для того, чтобы Prosody имел к нему доступ.

chown root:prosody -R /opt/prosody-modules/

Теперь добавим в cron задачу для периодического обновления репозитория: Для этого выполните команду crontab -e, спуститесь в нижнюю часть файла и создайте новую строку. Вставьте следующую строку:

0 18 * * 2 cd /opt/prosody-modules && hg pull --update && chown root:prosody -R /opt/prosody-modules/

Поскольку нам не нужны все модули сообщества, а также некоторые официальные модули все еще имеют старые версии в репозитории сообщества, мы символически связываем все необходимые модули.

mkdir /opt/prosody-modules-enabled/ && cd /opt/prosody-modules-enabled/
(Нажмите чтобы развернуть) Вы можете просто вставить следующие строки в командную строку
ln -s ../prosody-modules/mod_addressing/
ln -s ../prosody-modules/mod_auto_answer_disco_info/
ln -s ../prosody-modules/mod_bidi/
ln -s ../prosody-modules/mod_bob/
ln -s ../prosody-modules/mod_bookmarks/
ln -s ../prosody-modules/mod_cache_c2s_caps/
ln -s ../prosody-modules/mod_carbons_copies/
ln -s ../prosody-modules/mod_checkcerts/
ln -s ../prosody-modules/mod_cloud_notify/
ln -s ../prosody-modules/mod_csi_battery_saver/
ln -s ../prosody-modules/mod_default_bookmarks/
ln -s ../prosody-modules/mod_delay/
ln -s ../prosody-modules/mod_http_avatar/
ln -s ../prosody-modules/mod_http_upload/
ln -s ../prosody-modules/mod_idlecompat/
ln -s ../prosody-modules/mod_muc_limits/
ln -s ../prosody-modules/mod_muc_mam_hints/
ln -s ../prosody-modules/mod_presence_cache/
ln -s ../prosody-modules/mod_privacy_lists/
ln -s ../prosody-modules/mod_pubsub_feeds/
ln -s ../prosody-modules/mod_pubsub_text_interface/
ln -s ../prosody-modules/mod_smacks/
ln -s ../prosody-modules/mod_strict_https/
ln -s ../prosody-modules/mod_vcard_muc/
ln -s ../prosody-modules/mod_vjud/
ln -s ../prosody-modules/mod_watchuntrusted/
ln -s ../prosody-modules/mod_webpresence/

Для лучшей поддержки при последующем использовании клиента AstraChat мы дополнительно устанавливаем mod_img2url:

git clone https://github.com/lixmal/mod_img2url.git /opt/external-prosody-modules/mod_img2url
ln -s ../external-prosody-mod/mod_img2url/mod_img2url.lua

Шаг 3 — Настройка

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

mv /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.old

Публичная регистрация по умолчанию отключена, но вы можете включить ее, удалив -- перед строками в VirtualHost "example.com".

Добавьте в файл /etc/prosody/prosody.cfg.lua следующее содержимое.

(Нажмите чтобы развернуть) prosody.cfg.lua
pidfile = "/var/run/prosody/prosody.pid"

default_storage = "internal"
storage = {
    account_details = "none"
}

authentication = "internal_hashed"

admins = { "holu@example.com" }

contact_info = {
    abuse = { "mailto:abuse@example.com", "xmpp:holu@example.com" };
    admin = { "mailto:support@example.com", "xmpp:holu@example.com" };
    security = { "mailto:security@example.com" };
    support = { "mailto:support@example.com", "xmpp:support@conference.example.com" };
};

https_ssl = {
    key = "/usr/lib/prosody/cert/xmpp.example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/xmpp.example.com/fullchain.pem";
}

ssl = {
    key = "/usr/lib/prosody/cert/example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/example.com/fullchain.pem";
}

legacy_ssl_ports = 5223

c2s_require_encryption = true;
s2s_require_encryption = true;

s2s_secure_auth = true;

consider_bosh_secure = true

http_default_host = "xmpp.example.com"
http_external_url = "https://xmpp.example.com/"

plugin_paths = { "/opt/prosody-modules-enabled" }
modules_enabled = {

    "roster"; -- Разрешить пользователям хранить на сервере свой список контактов. Рекомендуется ;)
    "saslauth"; -- Проверка подлинности клиентов и серверов. Рекомендуется, если вы хотите войти в систему.
    "tls"; -- Добавить поддержку безопасного протокола TLS для c2s и s2s соединений
    "dialback"; -- Поддержка обратного вызова s2s
    "disco"; -- Обнаружение служб

-- custom
    "carbons"; -- Поддерживать синхронизацию для несколько клиентов
    "carbons_copies"; -- Копирование сообщений для старых клиентов
    "mam"; -- Хранить сообщения в архиве и разрешать пользователям доступ к нему
    "pep"; -- Позволяет пользователям публиковать свое настроение, активность, воспроизводимую музыку и многое другое
    "private"; -- Частное хранилище XML (для закладок комнат и т.д.)
    "default_bookmarks"; -- Закладки по умолчанию для всех пользователей
    "blocklist"; -- Разрешить пользователям блокировать связь с другими пользователями
    "privacy_lists";
    "bookmarks"; -- Закладки для каналов
    "vcard4";
    "vcard_legacy";
    "http_avatar"; -- обслуживает аватары от локальных пользователей
    "strict_https"; -- принудительный https для веба
    "offline"; -- Хранить сообщения в автономном режиме
    "version"; -- Ответы на запросы версии сервера
    "uptime"; -- Сообщить, как долго работает сервер
    "time"; -- Разрешает узнать время на сервере
    "ping"; -- Pong ответы на XMPP ping
    "admin_adhoc"; -- Позволяет администрирование через XMPP-клиент с поддержкой специальных команд
    "bosh"; -- Включить клиенты BOSH, он же Jabber поверх HTTP
    "watchregistrations"; -- Оповещение администраторов о регистрациях
    "cloud_notify"; -- позволяет клиентам регистрировать сервер приложений, который уведомляется о новых сообщениях в автономном режиме
    "legacyauth"; -- Старый способ аутентификации. Используется только некоторыми старыми клиентами и ботами
    "announce"; -- Отправить объявление всем подключенным пользователям
    "smacks"; --  разрешить клиенту возобновить отключенный сеанс, чтобы предотвратить потерю сообщений
    "csi"; -- https://modules.prosody.im/mod_csi.html
    "csi_battery_saver"; -- Использовать меньше батареи на мобильных телефонах
    "presence_cache"; -- сохраняет отметку времени последнего присутствия, полученного от контактов пользователей
    "checkcerts"; -- Сообщить администраторам до истечения срока действия сертификатов
    "websocket"; -- Включить mod_websocket
    "net_multiplex";
    "server_contact_info"; -- контактная информация
    "idlecompat";
    "auto_answer_disco_info";
    "bidi";
    "addressing";
    "webpresence";
    "img2url";
    "watchuntrusted"; -- уведомлять о незашифрованных s2s
-- отладка
--    "admin_telnet";
--    "rawdebug";
};

log = {
   warn = "/var/log/prosody/prosody.log";
}

checkcerts_notify = 7 -- в днях

registration_watchers = { "holu@example.com" } -- mod_watchregistrations будет использовать этот список пользователей, вместо списка админинистраторов
registration_notification = "$username registered on $host"

untrusted_fail_watchers = { "holu@example.com" }
untrusted_fail_notification = "Establishing a secure connection from $from_host to $to_host failed. Certificate hash: $sha1. $errors"

default_bookmarks = {
    { jid = "support@conference.example.com", name = "Support Room" };
}

hsts_header = "max-age=31556952"

archive_expires_after = "4w" -- настройка архива сообщений
max_archive_query_results = 20;
mam_smart_enable = true
default_archive_policy = "roster" -- архивирование сообщений только от пользователей, находящихся в вашем списке контактов

-- cloud_notify
push_notification_with_body = false -- Надо ли отправлять тело сообщения на удаленный pubsub узел
push_notification_with_sender = false -- Надо ли отправлять отправителя сообщения на удаленный pubsub узел
push_max_errors = 5 -- допускается постоянных push-ошибок до отключения уведомлений для данного идентификатора
push_max_devices = 5 -- количество разрешенных устройств на пользователя

VirtualHost "example.com"
  name = "Prosody"
  modules_enabled = {
--    "register"; -- Разрешить пользователям регистрироваться на сервере с помощью клиента и менять пароли
  }

--  allow_registration = true
--  min_seconds_between_registrations = 900
  http_host = "xmpp.example.com"

ssl = {
    key = "/usr/lib/prosody/cert/example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/example.com/fullchain.pem";
}

disco_items = {
    { "example.com", "Prosody" };
    { "conference.example.com", "example.com chatrooms" };
    { "proxy.example.com" };
    { "vjud.example.com" };
}

-- многопользовательский чат
Component "conference.example.com" "muc"
  name = "example.com chatrooms"
  restrict_room_creation = false
  ssl = {
     key = "/usr/lib/prosody/cert/conference.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/conference.example.com/fullchain.pem";
  }

  modules_enabled = {
    "muc_mam"; -- архив сообщений в muc
    "muc_mam_hints";
    "muc_limits";
    "vcard_muc"; -- Этот модуль добавляет возможность установить визитной карточки для muc-комнат.
    "bob";
  }

  muc_log_by_default = true;
  muc_log_all_rooms = false;
  max_history_messages = 20;

Component "xmpp.example.com" "http_upload"
  http_upload_path = "/opt/prosody_http_data"
  http_upload_file_size_limit = 10485760 -- в байтах (10 МБ)
  http_upload_expire_after = 60 * 60 * 24 * 3 -- 3 дня
  http_upload_quota = 104857600 -- максимум байт, загруженных одним пользователем (100 МБ)

  http_host = "xmpp.example.com"

  ssl = {
     key = "/usr/lib/prosody/cert/xmpp.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/xmpp.example.com/fullchain.pem";
  }

-- pubsub
Component "pubsub.example.com" "pubsub"
  modules_enabled = { "pubsub_feeds", "pubsub_text_interface" }

  ssl = {
     key = "/usr/lib/prosody/cert/pubsub.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/pubsub.example.com/fullchain.pem";
  }

-- прокси
Component "proxy.example.com" "proxy65"
  proxy65_address = "proxy.example.com"
  name = "SOCKS5 Bytestreams Service"

  ssl = {
     key = "/usr/lib/prosody/cert/proxy.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/proxy.example.com/fullchain.pem";
  }

-- vjud, каталог пользователей
Component "vjud.example.com" "vjud"

  ssl = {
     key = "/usr/lib/prosody/cert/vjud.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/vjud.example.com/fullchain.pem";
  }

Шаг 3.1 — Регистрация Let's Encrypt сертификатов

Примечание: Если example.com указывает на другой IP-адрес, сгенерируйте сертификат для example.com на другом сервере и скопируйте его, например, при помощи scp.

Для Let's Encrypt сертификатов будем использовать certbot от EFF.

apt-get install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d xmpp.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d conference.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d proxy.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d pubsub.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d vjud.example.com

За 30 (и 7) дней до истечения срока действия сертификатов вы получите электронное письмо на holu@example.com. Кроме этого, вы также получите уведомление через XMPP за 7 дней до истечения срока действия сертификатов.

Шаг 3.2 — Установка сертификатов

mkdir /usr/lib/prosody/cert/

mkdir /usr/lib/prosody/cert/example.com
cp -L /etc/letsencrypt/live/example.com/fullchain.pem /usr/lib/prosody/cert/example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/example.com/privkey.pem /usr/lib/prosody/cert/example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/xmpp.example.com
cp -L /etc/letsencrypt/live/xmpp.example.com/fullchain.pem /usr/lib/prosody/cert/xmpp.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/xmpp.example.com/privkey.pem /usr/lib/prosody/cert/xmpp.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/conference.example.com
cp -L /etc/letsencrypt/live/conference.example.com/fullchain.pem /usr/lib/prosody/cert/conference.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/conference.example.com/privkey.pem /usr/lib/prosody/cert/conference.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/proxy.example.com
cp -L /etc/letsencrypt/live/proxy.example.com/fullchain.pem /usr/lib/prosody/cert/proxy.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/proxy.example.com/privkey.pem /usr/lib/prosody/cert/proxy.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/pubsub.example.com
cp -L /etc/letsencrypt/live/pubsub.example.com/fullchain.pem /usr/lib/prosody/cert/pubsub.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/pubsub.example.com/privkey.pem /usr/lib/prosody/cert/pubsub.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/vjud.example.com
cp -L /etc/letsencrypt/live/vjud.example.com/fullchain.pem /usr/lib/prosody/cert/vjud.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/vjud.example.com/privkey.pem /usr/lib/prosody/cert/vjud.example.com/privkey.pem ;

chown root:prosody -R /usr/lib/prosody/cert/

Шаг 4 — Проверка настроек, запуск сервера prosody и создание пользователя с правами администратора

Запустите prosodyctl check чтобы автоматически проверить файл конфигурации на наличие проблем.

Можете безопасно игнорировать SRV target xmpp.example.com. contains unknown client port: 443 потому что мы используем SSLH для привязки к порту 443.

Если все проверки проходят, то можно снова запустить prosody и проверить статус.

prosodyctl start
prosodyctl status

Проверьте файл журнала на наличие других ошибок.

less /var/log/prosody/prosody.log

Теперь создадим администратора.

prosodyctl adduser holu@example.com

Теперь вы можете подключиться при помощи любого XMPP-клиента.

Раздел 5 — Проверка совместимости (опционально)

Так как для проведения тестов нужно предоставить данные для доступа к нашему XMPP-серверу, мы создадим отдельного пользователя.

prosodyctl adduser compliance@example.com

Введите учетные данные здесь. Должны пройти все тесты, кроме неофициального теста XEP-0156, который не учитывается при ранжировании и не влияет на корректность работы сервера. XEP-0077 будет проходить только если в файле конфигурации включен mod_register. Не включайте его на частном сервере, а для создания пользователей используйте prosodyctl. После отправки учетных данных в левом нижнем углу можно будет подписаться на периодические отчеты для этого сервера.

Дополнительная помощь и информирование об ошибках

XMPP-чат Prosody: prosody@conference.prosody.im через веб: Подключиться без учетной записи

Списки рассылки: https://prosody.im/discuss

Информирование об ошибках:

Вывод

Теперь у нас есть полнофункциональный современный XMPP-сервер. Начать общаться можно при помощи самого популярного клиента для компьютера Gajim или Conversations для смартфона. Новый и современный клиент это, например, Dino. Больше клиентов здесь.

Пожалуйста, не забудьте регулярно обновлять пакеты с помощью apt-get update && apt-get upgrade, иначе prosody не получит никаких обновлений. Вы также можете настроить cron-задачу для этого, если хотите: Выполните crontab -e и добавьте внизу @weekly apt-get update && apt-get upgrade.

Как замечено ниже, мы имеем все характеристики, которые необходимы для получения 100% в тестере соответствия https://compliance.conversations.im/.

Кроме этого, у нас есть дополнительные средства безопасности:

  • Принудительное шифрование транспорта
  • Push-уведомления с улучшенной конфиденциальностью из-за отключенного тела сообщения
  • Каталог пользователей с добавлением по согласию
  • Двунаправленные соединения сервер к серверу
  • HSTS заголовок для web
  • BOSH на https://xmpp.example.com:5281/http-bind/
  • Websocket на wss://xmpp.example.com:5281/xmpp-websocket или https://xmpp.example.com:5281/xmpp-websocket

Дополнительные возможности для администратора:

  • Уведомление о новых регистрациях
  • Объявления для всех пользователей сервера
  • Информационное сообщение при угрозе истечения срока действия сертификатов
  • Информационное сообщение при сбое незашифрованного соединения с другого XMPP-сервера

Опциональные дополнительные возможности

Доступ к prosody через порт 443 для подключения за межсетевым экраном

На публичных точках доступа часто не разрешено использовать порт 5222. В большинстве точек доступа работают только порты 53(DNS), 80(HTTP) и 443(HTTPS). Мы можем обойти эту блокировку настроив доступ к prosody по разрешенным портам.

Будем использовать мультиплексор прикладных протоколов SSLH.

Добавьте следующие DNS-записи:

_xmpp-client._tcp.example.com. 14400 IN  SRV 15 1 443 xmpp.example.com.
_xmpps-client._tcp.example.com. 14400 IN SRV 20 1 443 xmpp.example.com.

Нам также нужен SSLH

apt-get install sslh

Создайте каталог для настроек:

mkdir /etc/sslh/

Приведите файл /etc/default/sslh к следующему виду:

RUN=yes
DAEMON=/usr/sbin/sslh

DAEMON_OPTS="-F /etc/sslh/sslh.cfg"

Общие сведения при запуске веб-сервера на том же компьютере

Вы не можете привязать два сервиса к порту 443, и из-за этого для разделения http и xmpp трафика будем использовать SSLH.

Примечание: Веб-сервер должен быть привязан к localhost (127.0.0.1), это приведет к короткому простою ваших веб-сайтов, так к они будут недоступны до запуска SSLH. Вы также увидите 127.0.0.1 в файлах журналов доступа вашего веб-сервера. Проверьте руководство с прозрачным прокси, если вы хотите увидеть реальные IP-адреса.

  • Apache

    • Отредактируйте файл /etc/apache2/ports.conf изменив везде Listen 443 наListen 127.0.0.1:443
    • Проверьте все VirtualHosts в /etc/apache2/sites-available/ и измените <VirtualHost *:443> и <VirtualHost 10.0.0.1:443> на <VirtualHost 127.0.0.1:443>.
    • Перезапустите Apache командой systemctl restart apache2
  • nginx

    • Проверьте все директивы listen в /etc/nginx/sites-available/ и измените listen 443; и listen [::]:443; на listen 127.0.0.1:443;
    • Перезапустите nginx с помощью команды systemctl restart nginx

С веб-сервером на том же компьютере (без прозрачного прокси-сервера)

Отредактируйте файл конфигурации /etc/sslh/sslh.cfg

verbose: false;
foreground: false;
inetd: false;
numeric: false;
transparent: false;
timeout: 5;
log_level: 0;
user: "sslh";
pidfile: "/run/sslh/sslh.pid";

listen:
(
    { host: "xmpp.example.com"; port: "443"; }
);

protocols:
(
   { name: "tls"; host: "localhost"; port: "5223"; alpn_protocols: [ "xmpp-client" ]; log_level: 0;},
   { name: "tls"; host: "localhost"; port: "443";},
   { name: "xmpp";    host: "localhost"; port: "5222"; },
   { name: "timeout"; host: "localhost"; port: "443";}
);

on-timeout: "timeout";

И перезапустите SSLH, чтобы применить изменения: systemctl restart sslh.

С веб-сервером на том же компьютере (с прозрачным прокси-сервером)

Вы не можете привязать два сервиса к порту 443, и из-за этого для разделения http и xmpp трафика будем использовать SSLH.

Примечание: Веб-сервер должен быть привязан к localhost (127.0.0.1), это приведет к короткому простою ваших веб-сайтов, так к они будут недоступны до запуска SSLH.

Отредактируйте файл конфигурации /etc/sslh/sslh.cfg

verbose: false;
foreground: false;
inetd: false;
numeric: false;
transparent: true;
timeout: 5;
log_level: 0;
user: "sslh";
pidfile: "/run/sslh/sslh.pid";

listen:
(
    { host: "xmpp.example.com"; port: "443"; }
);

protocols:
(
   { name: "tls"; host: "localhost"; port: "5223"; alpn_protocols: [ "xmpp-client" ]; log_level: 0;},
   { name: "tls"; host: "localhost"; port: "443";},
   { name: "xmpp";    host: "localhost"; port: "5222"; },
   { name: "timeout"; host: "localhost"; port: "443";}
);

on-timeout: "timeout";

Отредактируйте файл /etc/sysctl.conf добавив в нижней части

net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.route_localnet = 1

Для применения изменений выполните команду sysctl -p

Установите iproute2 и iptables:

apt-get install iproute2 iptables

Создайте сценарий bash, который задает правила iptables для прозрачного прокси /usr/local/bin/sslh-transparent-proxy.sh.

#!/bin/bash

# Отбрасываем «марсианские» пакеты, так же как это сделало бы ядро при route_localnet имеющим значение 0
# Примечание: эти правила не затрагивают пакеты, не покидающие сервер, и, соответственно, sslh все равно будет работать
iptables -t raw -A PREROUTING ! -i lo -d 127.0.0.0/8 -j DROP
iptables -t mangle -A POSTROUTING ! -o lo -s 127.0.0.0/8 -j DROP

# Помечаем все соединения, сделанные ssl для специальной обработки (здесь sslh запускается от пользователя с именем «sslh»)
iptables -t nat -A OUTPUT -m owner --uid-owner sslh -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -j CONNMARK --set-xmark 0x01/0x0f

# Помечаем исходящие пакеты, которые должны были бы идти в sslh, но должны быть перемаршрутизированы (копирование через метку соединения)
iptables -t mangle -A OUTPUT ! -o lo -p tcp -m connmark --mark 0x01/0x0f -j CONNMARK --restore-mark --mask 0x0f

# Настройка маршрутизации для помеченных пакетов
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

Сделайте файл исполняемым при помощи команды chmod +x /usr/local/bin/sslh-transparent-proxy.sh

Источник: github.com/sslh#transparent-proxy-support

Отредактируйте /etc/rc.local и добавьте

bash /usr/local/bin/sslh-transparent-proxy.sh

в самый низ файла.

Без веб-сервера

Отредактируйте файл конфигурации /etc/sslh/sslh.cfg

verbose: false;
foreground: false;
inetd: false;
numeric: false;
transparent: false;
timeout: 5;
log_level: 0;
user: "sslh";
pidfile: "/run/sslh/sslh.pid";

listen:
(
    { host: "xmpp.example.com"; port: "443"; }
);

protocols:
(
   { name: "tls"; host: "localhost"; port: "5223"; alpn_protocols: [ "xmpp-client" ]; log_level: 0;},
   { name: "tls"; host: "localhost"; port: "5281";},
   { name: "xmpp";    host: "localhost"; port: "5222"; },
   { name: "timeout"; host: "localhost"; port: "5281";}
);

on-timeout: "timeout";

И перезапустите SSLH, чтобы применить изменения: systemctl restart sslh.

XEP-0156: Обнаружение Альтернативных Методов Подключения (HTTP)

Хотя XMPP определяет использование TCP в качестве метода подключения к XMPP-серверу, существуют альтернативные методы подключения, включая метод BOSH (XEP-0124) (для которого XMPP поверх BOSH (XEP-0206) является XMPP-профилем) и подпротокол websocket. Для некоторых из этих методов перед подключением необходимо получить дополнительные параметры, такие как HTTP URL альтернативного диспетчера соединений.

Общая информация

Мы создадим два файла host-meta и host-meta.json. Оба файла должны быть доступы по доменному имени example.com (нельзя использовать поддомен) в каталоге /.well-known. Если доменное имя example.com указывает на IP-адрес другого сервера, то файлы надо располагать на том сервере.

(Нажмите чтобы развернуть) Содержание host-meta
<?xml version='1.0' encoding='utf-8'?>
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
  <Link rel="urn:xmpp:alt-connections:xbosh"
        href="https://xmpp.example.com:5281/http-bind" />
  <Link rel="urn:xmpp:alt-connections:websocket"
        href="wss://xmpp.example.com:5281/xmpp-websocket" />
</XRD>
(Нажмите чтобы развернуть) Содержание host-meta.json
{
  "links": [
    {
      "rel": "urn:xmpp:alt-connections:xbosh",
      "href": "https://xmpp.example.com:5281/http-bind"
    },
    {
      "rel": "urn:xmpp:alt-connections:websocket",
      "href": "wss://xmpp.example.com:5281/xmpp-websocket"
    }
  ]
}

Если prosody работает без веб-сервера и самостоятельно прослушивает порт 443, то в обоих host-meta файлах можно удалить :5281.

В противном случае не меняйте файлы или разверните обратный прокси-сервер. В этом руководстве мы не будем объяснять, как это сделать.

С веб-сервером (nginx)

Добавьте оба файла в директорию .well-known. Если такой директории нет, то создайте ее, как показано ниже.

mkdir /var/www/example.com/.well-known

И измените разрешения для www-пользователя (по умолчанию www-data):

chown www-data:www-data -R /var/www/example.com/.well-known/

Также нужно установить заголовок Access-Control-Allow-Origin "*" в настройках для домена example.com. Настройки серверов находятся в файлах /etc/nginx/sites-available/*.

location /.well-known/host-meta {
    default_type 'application/xrd+xml';
    add_header Access-Control-Allow-Origin '*' always;
}
location /.well-known/host-meta.json {
    default_type 'application/jrd+json';
    add_header Access-Control-Allow-Origin '*' always;
}

Чтобы применить эти изменения, перезагрузите nginx с помощью команды systemctl reload nginx.

С веб-сервером (Apache)

Добавьте оба файла в директорию .well-known. Если такой директории нет, то создайте ее, как показано ниже.

mkdir /var/www/example.com/.well-known

И измените разрешения для www-пользователя (по умолчанию www-data):

chown www-data:www-data -R /var/www/example.com/.well-known/

Также нужно установить заголовок Access-Control-Allow-Origin "*" в настройках VirtualHost для домена example.com. Виртуальные хосты расположены в файлах /etc/apache2/sites-available/*

<Location ~ "/\.well-known/host-meta(\.json)?">
    Header set Access-Control-Allow-Origin "*"
</Location>

Чтобы применить эти изменения перезагрузите Apache с помощью команды systemctl reload apache2.

Без веб-сервера

В конфигурационном файле /etc/prosody/prosody.cfg.lua в массив modules_enabled = { } добавьте "http_files";. За пределами массива modules_enabled добавьте

http_files_dir = "/var/www/prosody/"

и сохраните файл конфигурации.

Теперь создайте директорию .well-known при помощи команды mkdir -p /var/www/prosody/.well-known и добавить оба файла в нее. Измените владельца с помощью команды chown root:prosody -R /var/www/prosody/ и перезагрузите prosoby с помощью команды prosodyctl restart.

IRC шлюз Biboumi

Biboumi это свободный, бесплатный и имеющий открытый код XMPP-шлюз, который подключается к IRC-серверам и осуществляет обмен между двумя протоколами. Его цель — позволить использовать ваш любимый XMPP-клиент для участия в обсуждениях в IRC.

Более подробную информацию о ходе установки можно найти в документации biboumi.

Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue
Try Hetzner Cloud

Get 20€ free credit!

Valid until: 31 December 2024 Valid for: 3 months and only for new customers
Get started
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more