Введение
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
- Проверьте все директивы listen в
С веб-сервером на том же компьютере (без прозрачного прокси-сервера)
Отредактируйте файл конфигурации /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.