Введение в круг понятий. UNIX/Linux  
  Мессенджеры  


Эти материалы являются объектом авторского права и защищены законами РФ и международными соглашениями о защите авторских прав. Перед использованием материалов вы обязаны принять условия лицензионного договора на использование этих материалов, или же вы не имеете права использовать настоящие материалы

Авторская площадка "Наши орбиты" состоит из ряда тематических подразделов, являющихся моими лабораторными дневниками, содержащими записи за разное, иногда продолжительно отличающееся, время. Эти материалы призваны рассказать о прошедшем опыте, они никого ни к чему не призывают и совершенно не обязательно могут быть применимы кем-то ещё. Это только лишь истории о прошлом


Мессенджеры, которые мы можем сконфигурировать для себя, вошли в нашу жизнь давно. В первую очередь это, конечно, Jabber (XMPP). Который замечательно заменил централизованную "аську", но тут же уступил тем централизованным сервисам, которые предоставляли аудио и видеосвязь. Ну не умеет джаббер в VoIP по нормальному. Долгое время альтернатив не было, пока не появился стандарт Matrix, который так и не стал стандартом де юре, но стали им фактически. А также эталонные реализации сервера matrix - Synapse, и кльента - Element. А также ряда других клиентов и серверов. Сбоку к этому майнстримовому решению подползают и различные федерированные сервисы, типа Мастодонта, Плерому и т.п., но здесь хватит сил расписать только опыты по развёртывапнию Matrix

1. развёрнут пакет синапса из репозитария

2. сразу не стартовал, конфиг файл скопировал, пробовал по полученным ошибкам через pip обновлять компоненты Питона - не взлетело

3. пошёл в утилиты, сгенерировал все файлы и стартовал сервер, после чего добавил имена в DNS и пересоздал файлы конфигурации, сервер взлетел

---
/usr/lib/matrix-synapse/generate_config --config-dir /etc/synapse --data-dir /opt/synapse \
   --server-name mtx.zerot.local --report-stats yes --generate-secrets > /etc/synapse/homeserver.yaml
/usr/lib/matrix-synapse/generate_log_config -o /etc/synapse/log_config.yaml -f /opt/synapse/my_logfile.log
/usr/lib/matrix-synapse/generate_signing_key.py -o /etc/synapse/mtx.zerot.local.signing.key
/usr/lib/matrix-synapse/generate_log_config -o /etc/synapse/mtx.zerot.local.log.config -f /opt/synapse/my_logfile.log
/usr/lib/matrix-synapse/synctl start /etc/synapse/homeserver.yaml
/usr/lib/matrix-synapse/register_new_matrix_user -u admin1 -a -c /etc/synapse/homeserver.yaml http://mtx.zerot.local:8008
/usr/lib/matrix-synapse/register_new_matrix_user -u test1 --no-admin -c /etc/synapse/homeserver.yaml http://mtx.zerot.local:8008
/usr/lib/matrix-synapse/register_new_matrix_user -u test2 --no-admin -c /etc/synapse/homeserver.yaml http://mtx.zerot.local:8008
---

4. попробовал мобильных клиентов - не взлетело. Элемент вообще смотрит только в сторону матрикса, а флафи не видит сервера

5. развернул WEB клиента Элемент - он позволил подключиться к матриксу, но локальный сервер не видит, а точнее говорит, что недоверенный сертификат. Здесь притормозили, по результату настроили работу сервера matrix через nginx

6. для чего сделали самоподписанный сертификат

---
echo -e "
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%
DNS.2 = *.%%DOMAIN%%" > v3.ext

#!/bin/bash
# генерячим корневой
openssl genrsa -out rootCA.key 2048 ; openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 9999 -out rootCA.pem
# генерячим обычный
if [ -z "$1" ]; then   echo "имя_скрипта FQDN_сертификата" ; exit; fi
if [ -f device.key ]; then KEY_OPT="-key" ; else KEY_OPT="-keyout" ; fi

DOMAIN=$1
COMMON_NAME=${2:-$1}
SUBJECT="/C=RU/ST=Moscow/L=Moscow/O=MXT/CN=$COMMON_NAME"
NUM_OF_DAYS=9999

openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csr
cat v3.ext | sed s/%%DOMAIN%%/$COMMON_NAME/g > /tmp/__v3.ext
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.ext

mv device.csr $DOMAIN.csr
cp device.crt $DOMAIN.crt

# remove temp file
rm -f device.crt;
---

7. и добавили модуль сайта матрикса в конфигурации nginx

---
server {
    listen 443 ssl http2;
    listen 8448 ssl default_server;

    server_name mtx.zerot.local ;

    access_log /var/log/nginx/matrix_access.log;
    error_log /var/log/nginx/matrix_error.log;

    ssl_certificate /var/letencrypt/hands/mtx.zerot.local.crt;
    ssl_certificate_key /var/letencrypt/hands/device.key;

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

этим самым обернули http:8008 в https:443
---

8. По результату клиент всё равно выперндривается, что homeserver устарел. Методом подбора определились, что версия v1.11.1 работает корректно, и более старые 10, а вот v1.11.34 - уже не работает с нуля, но работает по v1.11.39 если ключи созданы в 10 релизе клиента. В v1.11.40 заявлена совместимость с matrix 1.1 Вероятно старый synapse от Alt более стар. Более того, внутри локальной сети работают и голосовые звонки, но всё работает только после приёма сертификата самого домашнего сервера матрикс - он самоподписанный и просто так не принимается. на этом остановились второй раз статьи: - хабр - https://tavda.net/matrix - про самоподписанный обновил память https://habr.com/ru/articles/352722/

9. Далее работа продолжена 20. Настроено ещё одно имя, ресолвящееся в Инетах - mtx, и проведена настройка основного сервера Apace на обратное проксирование запросов с этого имени на сервер Матрик. Подороге пришлось настроить сертификаты для домена mtx... настройка не давалась долго, пришлось переконфигурировать сервер на более корректную работу с виртуальными хостами, настроить прямой проброс без двойного https, но самая важная причина некорректной работы проброса - в закрытых сетевим фильтром возможностях проброса, из за чего сервер переводил запросы не по конфигурации виртуального хоста, а на дефолтный путь

В результате получена и работает следующая конфигурация проброса

---

    ServerName [FQDN_нашего_сервера]:443

    ServerAdmin webmaster@oracle.zerot.local
    ErrorLog logs/mtx_ourorbits_ru-error_log
    TransferLog logs/mtz_ourorbits_ru-access_log

    ProxyPreserveHost On
    ProxyPass "/" "http://192.168.0.207:8008/"
    ProxyPassReverse "/" "http://192.168.0.207:8008/"

    SSLEngine on
    SSLCertificateFile /etc/httpd/conf.d/mtx_certs/[FQDN_нашего_сервера].crt
    SSLCertificateKeyFile /etc/httpd/conf.d/mtx_certs/[FQDN_нашего_сервера].key
#SSLCACertificateFile /etc/httpd/conf.d/mtx_certs/rootCA.pem

    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
    
        SSLOptions +StdEnvVars
    
    BrowserMatch "MSIE [2-5]" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    CustomLog logs/mtx_ourorbits_ru-ssl_request_log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"




    ServerName [FQDN_нашего_сервера]:80

    ServerAdmin webmaster@oracle.zerot.local
    ErrorLog logs/mtx_ourorbits_ru-error_log
    TransferLog logs/mtz_ourorbits_ru-access_log

    ProxyPreserveHost On
    ProxyPass "/" "http://192.168.0.207:8008/"
    ProxyPassReverse "/" "http://192.168.0.207:8008/"


---

10. Далее проверена работа между клиентами - звонки без TURN возможны только внутри одной сети, и даже с включением его, т.к. он от другого домашнего серверак - не фурычит. Особенностью является то, что на телефоне WEB не отдаёт микрофон хрому, а камеру - Firefox'у. Также нужно каждый раз подтверждать сертификаты клиента и сервера в браузерах

Опыты с matrix - сервер и клиент - из ALT Linux 11

Примечательно, что для каждой версии сервера Synapse и клиентов есть свои рабочие и нерабочие варианты комбинаций. Например комбинация сервера и WEB клиента из репозитария АЛЬТ 11 версии прекрасно работают с текстом практически из коробки, но не пробрасывают звук даже в локальной сети. Возможно их нужно как то по особенному готовить. Но для находящейся в репозитарии версии Синаспа в качестве клиентов, в т.ч. со звуком, у меня заработали WEB кльент версии v1.11.109 и GiotHUB для рабочей станции под управлением Linux, и Черепаха (SchildiChat) актуальной версии для Андроида. А вот ElementX отказался работать с голосовыми и видеозвонками, выдав некое сообщение, которое может и дало бы нужный функционал,Ю после сурпулёзного изучения документации на эту ошибку и настройку, но из коробки не взлетело. Старый Element вообще не позволял выбрать другой домашний сервер, на чем эксперименты с ним и закончились при подходе к 10 версии репозитария АЛЬТов. Также не заработал FluffyChat под Android

Установка и базовое конфигурирование тут не сильно отличаются. Сначала устанавливаем пакеты и настраиваем сам синапс:

---
apt-get install matrix-synapse element-web coturn

/usr/bin/generate_config --config-dir /etc/synapse --data-dir /opt/synapse --server-name [FQDN_нашего_сервера] \
  --report-stats yes --generate-secrets > /etc/synapse/homeserver.yaml
/usr/bin/generate_signing_key -o /etc/synapse/[FQDN_нашего_сервера].signing.key
/usr/bin/generate_log_config -o /etc/synapse/[FQDN_нашего_сервера].log.config -f /opt/synapse/[FQDN_нашего_сервера]_logfile.log
/usr/bin/synctl start /etc/synapse/homeserver.yaml

# https будет сделан через локальный NGNX, через него же /.well-known/matrix/client
/usr/bin/register_new_matrix_user -u admin -p pwadmin -a -c /etc/synapse/homeserver.yaml http://127.0.0.1:8008
/usr/bin/register_new_matrix_user -u user1 -p pwuser1 --no-admin -c /etc/synapse/homeserver.yaml http://127.0.0.1:8008
/usr/bin/register_new_matrix_user -u user2 -p pwuser2 --no-admin -c /etc/synapse/homeserver.yaml http://127.0.0.1:8008
/usr/bin/register_new_matrix_user -u user3 -p pwuser3 --no-admin -c /etc/synapse/homeserver.yaml http://127.0.0.1:8008
/usr/bin/register_new_matrix_user -u user4 -p pwuser4 --no-admin -c /etc/synapse/homeserver.yaml http://127.0.0.1:8008
---

Далее настраиваем NGINX. Сертификаты выпускаются также, как в разделе про 10 платформу выше. Кроме этого нужно настроить DNS для внешних и внутренних зон, и настроить проброс портов 443, 8448 на сервер из внешнего мира. Конфиг NGINX примерно такой:

---
server {
    listen 192.168.0.101:443 ssl ;
    http2 on ;
    listen 192.168.0.101:8448 ssl default_server ;
    server_name [FQDN_нашего_сервера] ;
    access_log /var/log/nginx/matrix_access.log;
    error_log /var/log/nginx/matrix_error.log;

    ssl_certificate /etc/synapse/conf_cert/FIRST_[FQDN_нашего_сервера]/[FQDN_нашего_сервера].crt;
    ssl_certificate_key /etc/synapse/conf_cert/FIRST_[FQDN_нашего_сервера]/[FQDN_нашего_сервера].key;

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

    location /.well-known/matrix/client {
        return 200 '{"m.homeserver": {"base_url": "https://[FQDN_нашего_сервера]"}}';
        default_type application/json;
        add_header Access-Control-Allow-Origin *;
    }
}
---

Для работы с текстовыми из локальной сети и интернет этого достаточно. А вот голосовые и видеозвонки в этой точке работают только в локальной сети. В этом месте мы настраиваем coturn

---
# файл /etc/coturn/turnserver.conf
use-auth-secret
static-auth-secret=[ключ сделан утилитой pwgen -s 64 1]
realm=[FQDN_нашего_сервера]

syslog
no-tcp-relay

denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=172.16.0.0-172.31.255.255

allowed-peer-ip=192.168.0.208

user-quota=16
total-quota=1200

external-ip=35.27.45.67
listening-ip=192.168.0.208

cert=/etc/synapse/conf_cert/[FQDN_нашего_сервера]/rootCA.pem
pkey=/etc/synapse/conf_cert/[FQDN_нашего_сервера]/[FQDN_нашего_сервера].key

---

Файл конфигурации самого синапса /etc/synapse/homeserver.yaml приобретает вид ниже. Теперь работает и из за NAT голос и видео

---
файл /etc/synapse/homeserver.yaml

turn_uris: [ "turn:[FQDN_нашего_сервера]?transport=udp", "turn:[FQDN_нашего_сервера]?transport=tcp" ]
turn_shared_secret: "секрет из опции static-auth-secret файла /etc/coturn/turnserver.conf"
turn_user_lifetime: 86400000
turn_allow_guests: false

server_name: "[FQDN_нашего_сервера]"
pid_file: /opt/synapse/homeserver.pid
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['127.0.0.1','192.168.0.208']
    resources:
      - names: [client]
        compress: false
database:
  name: sqlite3
  args:
    database: /opt/synapse/homeserver.db
log_config: "/etc/synapse/[FQDN_нашего_сервера].log.config"
media_store_path: /opt/synapse/media_store
registration_shared_secret: "соответствующее значение, сгенерированное начальной командой генерации конфига"
report_stats: true
macaroon_secret_key: "соответствующее значение, сгенерированное начальной командой генерации конфига"
form_secret: "соответствующее значение, сгенерированное начальной командой генерации конфига"
signing_key_path: "/etc/synapse/[FQDN_нашего_сервера]signing.key"
trusted_key_servers:
  - server_name: "[FQDN_нашего_сервера]"
---

Белонин С.С. (С)

(даты последующих модификаций не фиксируются)


 
        
   
    Нравится     

(C) Белонин С.С., 2000-2026. Дата последней модификации страницы:2025-12-09 23:21:12