SimpleX – первый мессенджер без идентификаторов пользователей, настройка сервера на Debian 12
Что такое SimpleX
SimpleX – не только один из немногих мессенджеров, который не собирает данные пользователей, но и единственный на сегодняшний день мессенджер, который не использует идентификаторы для профилей пользователей, даже случайные числа.
Для доставки сообщений вместо идентификаторов пользователей SimpleX имеет идентификаторы очередей сообщений, отдельные для каждого из контактов. В текущей версии приложения каждая очередь используется до тех пор, пока контакт не будет удален или пока адрес получения сообщений не будет изменен пользователем вручную. Позже команда проекта планирует автоматизировать этот процесс, а также добавить ротацию очередей в клиентский протокол, чтобы даже разговоры не имели долгосрочных идентификаторов, видимых в сети. Такая конструкция предотвращает утечку метаданных пользователей на уровне приложения.
Вы, как пользователь мессенджера, можете самостоятельно определить, какой сервер(ы) использовать для получения сообщений, а ваши контакты – серверы, которые вы используете для отправки им сообщений. Это означает, что в каждом разговоре, будут использоваться два разных сервера – по одному для каждого направления сообщений.
Только клиентские устройства хранят профили пользователей, контакты, группы и сообщения, отправленные с двухуровневым сквозным шифрованием.
Итак, разработчики SimpleX создали свой протокол для передачи сообщений:
- SimpleX Messaging Protocol (SMP) – это протокол для отправки сообщений в одном направлении получателю, используя промежуточный сервер. Сообщения доставляются через однонаправленные очереди, создаваемые получателями.
- SMP работает через транспортный протокол, который обеспечивает целостность, аутентификацию сервера, конфиденциальность и привязку транспортного канала.
- Сервер SimpleX – это один из таких серверов.
- Сеть SimpleX – это термин, используемый для обозначения группы серверов SimpleX, которые способствуют работе SMP.
- Библиотеки SimpleX Client говорят на языке SMP с SimpleX Servers и предоставляют низкоуровневый API, не предназначенный для использования приложениями.
С помощью функции Netzwerk & Server SimpleX можно настроить мессенджер таким образом, чтобы все коммуникации направлялись через сеть Tor. В сочетании с отсутствующим (уникальным) идентификатором и протоколом Simplex Messaging Protocol (SMP) возможно анонимное использование, что затрудняет или делает невозможным определить, кто с кем контактирует по метаданным. И еще: в отличие от Briar, например, контакт или устройство не обязательно должны быть постоянно онлайн, чтобы иметь возможность получить сообщение. Они временно хранятся на серверах ретрансляции SimpleX до тех пор, пока не будут получены.
Как работает сеть SimpleX
Сеть SimpleX по своей структуре напоминает P2P–сети, но в отличие от большинства P2P–сетей она состоит из клиентов и серверов, не зависящих от какого–либо централизованного компонента. По сравнению с более традиционными приложениями для обмена сообщениями (например, WhatsApp, Signal, Telegram) ключевыми отличиями сети SimpleX являются:
Участникам не нужно иметь глобально уникальные адреса для общения, вместо этого они используют избыточные однонаправленные (симплексные) очереди обмена сообщениями, с отдельным набором очередей для каждого контакта.
Запросы на соединение передаются вне сети, не обязательно защищая обмен ключами от атаки MITM (человек посередине).
Простые очереди сообщений, предоставляемые серверами сети, используются клиентами для создания более сложных сценариев коммуникации, таких как дуплексное общение один на один, передача файлов, групповая коммуникация без центральных серверов, каналы контент/коммуникации.
Серверы не хранят никакой пользовательской информации (ни профилей пользователей, ни контактов, ни сообщений после их доставки), и в основном используют персистентность в памяти.
Пользователи могут менять серверы с минимальными перебоями – даже после исчезновения используемого сервера, просто изменив конфигурацию, на каких серверах создаются новые очереди.
Особенности SimpleX
- Сквозное шифрование в каждой очереди сообщений с использованием NaCl cryptobox. Это добавлено для обеспечения избыточности в будущем (прохождение каждого сообщения через несколько серверов), чтобы избежать наличия одного и того же шифротекста в разных очередях (который будет виден злоумышленнику только в случае компрометации TLS). Ключи шифрования, используемые для этого шифрования, не вращаются, вместо этого мы планируем вращать очереди. Для согласования ключей используются ключи Curve25519.
- Начиная с версии 2 протокола SMP (текущая версия – v4) все метаданные сообщения, включая время получения сообщения сервером (с округлением до секунды), отправляются получателям в зашифрованном виде
- Для соединений клиент–сервер разрешены только TLS 1.2/1.3, ограниченные криптографические алгоритмы: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
- Для защиты от атак повторного воспроизведения серверы SimpleX требуют привязки канала tlsunique в качестве идентификатора сессии в каждой клиентской команде, подписанной эфемерным ключом per–queue.
- Для защиты вашего IP–адреса все клиенты SimpleX Chat поддерживают доступ к серверам обмена сообщениями через Tor.
- Шифрование локальной базы данных с помощью парольной фразы – ваши контакты, группы и все отправленные и полученные сообщения хранятся в зашифрованном виде. Если вы использовали SimpleX Chat до версии 4.0, вам необходимо включить шифрование в настройках приложения.
Развертываем сервер SimpleX-Chat на Debian 12
После установки на сервер Debian 12 (Minimal) (x86_64) 2Gb RAM, 2 CPU, 20Gb SSD, приступаем к подготовке сервера.
Официальный репозиторий SimpleX-chat: https://github.com/simplex-chat/simplexmq
Официальный сайт: https://simplex.chat/docs/server.html
https://github.com/simplex-chat/simplexmq?tab=readme-ov-file#smp-server
Подготовка сервера
Задаем права пользователю Debian:
su apt install sudo su - root adduser username sudo reboot
* где username имя пользователя под которым зашли в систему.
sudo apt-get update sudo apt-get upgrade
Подключаем SSH доступ для пользователя root на Debian
Для начала, необходимо создать пароль пользователю root следующей командой:
passwd root
Теперь открываем настройки SSH-сервера:
sudo nano /etc/ssh/sshd_config
И отредактируйте в нем следующую строку:
PermitRootLogin yes
После этого перезагрузите SSH сервис:
sudo systemctl restart ssh || sudo systemctl restart sshd
Устанавливаем недостающие библиотеки:
apt install curl gnupg2 ufw libssl-dev -y sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
Устанавливаем SMP и XFTP сервер с Docker на Debian 12 (Вариант №1 с Docker)
# Add Docker's official GPG key: sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources: echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install docker from repo (~450MB,2Min) sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo apt install docker.io docker-compose
# Install SimpleX from Docker Hub (~300MB,30Min) mkdir -p $HOME/simplex/{xftp,smp}/{config,logs} && mkdir -p $HOME/simplex/xftp/files git clone https://github.com/simplex-chat/simplexmq cd simplexmq git checkout stable DOCKER_BUILDKIT=1 docker build -t local/smp-server --build-arg APP="smp-server" --build-arg APP_PORT="5223" . # For xmp-server DOCKER_BUILDKIT=1 docker build -t local/xftp-server --build-arg APP="xftp-server" --build-arg APP_PORT="443" . # For xftp-server
На этом этапе я ждал примерно 30 минут пока выполнятся 2-е команды выше.
Далее запускаем докер с нужными нам настройками
docker run -d \ --name smp-server \ --restart always \ -e "ADDR=smp.putyato.pro" \ -p 5223:5223 \ -v $HOME/simplex/smp/config:/etc/opt/simplex:z \ -v $HOME/simplex/smp/logs:/var/opt/simplex:z \ simplexchat/smp-server:latest
* где smp.putyato.pro домен нашего SMP, задаем свой.
docker run -d \ --name xftp-server \ --restart always \ -e "ADDR=xftp.putyato.pro" \ -e "QUOTA=50gb" \ -p 443:443 \ -v $HOME/simplex/xftp/config:/etc/opt/simplex-xftp:z \ -v $HOME/simplex/xftp/logs:/var/opt/simplex-xftp:z \ -v $HOME/simplex/xftp/files:/srv/xftp:z \ simplexchat/xftp-server:latest
* где xftp.putyato.pro домен нашего XFTP, задаем свой, 50gb - допустимое место для файлов.
Проверяем как запустились Докеры.
docker ps
Смотрим ID докера и вставляем его в команду ниже:
#docker exec -it ------ContainerID------ sh -c "smp-server start" docker exec -it 8077fbd502b4 sh -c "smp-server start"
Получаем нужную ссылку SMP-servera для установки в телефон:
# smp://YnnfZurIMWt0CmEFY8kiZbldDteRA9JWlCHyVYKfo-U=@smp.putyato.pro
Повторяем данную операцию для XFTP-servera:
Смотрим ID докера и вставляем его в команду ниже:
#docker exec -it ------ContainerID------ sh -c "xftp-server start" docker exec -it 3598af7c4d35 sh -c "xftp-server start"
Получаем нужную ссылку XFTP-servera для установки в телефон:
# xftp://DZfGTKj-dfJTPLF7MJUvO-EFFE4Vncz9v2eXjbIxKGE=@xftp.putyato.pro
Делаем чтобы докеры после перезапуска сервера автоматически поднимались.
systemctl enable docker
Устанавливаем SMP и XFTP сервер без Docker на Debian 12 (Вариант №2 без Docker)
Устанавливаем SMP сервер.
Установить бинарный файл:
curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/smp-server && chmod +x /usr/local/bin/smp-server
Создайте пользователя и группу для smp-server:
sudo useradd -m smp
Создайте необходимые каталоги и назначьте разрешения:
sudo mkdir -p /var/opt/simplex /etc/opt/simplex sudo chown smp:smp /var/opt/simplex /etc/opt/simplex
Разрешить smp-serverпорт в брандмауэре:
sudo ufw allow 5223/tcp
Необязательно — если вы используете дистрибутив с systemd, создайте /etc/systemd/system/smp-server.service файл со следующим содержимым:
nano /etc/systemd/system/smp-server.service
И вставляем следующий текст:
[Unit] Description=SMP server systemd service [Service] User=smp Group=smp Type=simple ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"' LimitNOFILE=65535 KillSignal=SIGINT TimeoutStopSec=infinity [Install] WantedBy=multi-user.target
И выполнить:
sudo systemctl daemon-reload
Установка Тора
Настройте официальный репозиторий Tor PPA:
CODENAME="$(lsb_release -c | awk '{print $2}')" echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list
Импортировать ключ репозитория:
curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
Обновить индекс репозитория:
apt update
Установить torпакет:
apt install -y tor deb.torproject.org-keyring
Настройте тор:
Конфигурация файла:
Откройте конфигурацию Tor:
nano /etc/tor/torrc
И вставьте следующие строки в конец конфигурации. Обратите внимание на строки, начинающиеся с #: это комментарии к каждой отдельной опции.
# Enable log (otherwise, tor doesn't seemd to deploy onion address) Log notice file /var/log/tor/notices.log # Enable single hop routing (2 options below are dependencies of third). Will reduce latency in exchange of anonimity (since tor runs alongside smp-server and onion address will be displayed in clients, this is totally fine) SOCKSPort 0 HiddenServiceNonAnonymousMode 1 HiddenServiceSingleHopMode 1 # smp-server hidden service host directory and port mappings HiddenServiceDir /var/lib/tor/simplex-smp/ HiddenServicePort 5223 localhost:5223
Создайте каталоги:
mkdir /var/lib/tor/simplex-smp/ && chown debian-tor:debian-tor /var/lib/tor/simplex-smp/ && chmod 700 /var/lib/tor/simplex-smp/
Запустить тор:
Включите systemdсервис и запустите Tor. Offical torнемного ненадежен при первом запуске и может не создать луковый адрес хоста, поэтому на всякий случай перезапускаем его.
systemctl enable tor && systemctl start tor && systemctl restart tor
Отображение лукового хоста:
Выполните следующую команду, чтобы отобразить адрес вашего лукового хоста:
cat /var/lib/tor/simplex-smp/hostname
WebRTC ICE в SimpleX Chat Развертывание сервера STUN/TURN
Установите coturn пакет из основного репозитория.
apt update && apt install coturn
Раскомментировать TURNSERVER_ENABLED=1 из /etc/default/coturn:
sed -i '/TURN/s/^#//g' /etc/default/coturn
Настроить coturnв /etc/turnserver.conf:
# Also listen to 443 port for tls alt-tls-listening-port=443 listening-port=3478 tls-listening-port=5349 # Use fingerprints in the TURN messages fingerprint # Use long-term credentials mechanism lt-cred-mech # Your credentials user=$YOUR_LOGIN:$YOUR_PASSWORD # Your server domain server-name=turn.putyato.pro # The default realm to be used for the users when no explicit origin/realm relationship was found realm=turn.putyato.pro # Path to your certificates. Make sure they're readable by cotun process user/group cert=/etc/letsencrypt/live/turn.putyato.pro/cert.pem pkey=/etc/letsencrypt/live/turn.putyato.pro/privkey.pem cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384" # Use 2066 bits predefined DH TLS key dh2066 # Log to journalctl syslog # User/group which will be running coturn service proc-user=turnserver proc-group=turnserver no-loopback-peers no-multicast-peers # Disable weak encryption no-tlsv1 no-tlsv1_1 no-tlsv1_2
* user=$YOUR_LOGIN:$YOUR_PASSWORD - вписываем логин и пароль без кавычек и без $. turn.putyato.pro -это наш сервер.
Запустите и включите coturnслужбу:
systemctl enable coturn && systemctl start coturn
Зарегистрируйте сертификаты Let’s Encrypt.
Мы будем использовать certbot от EFF для сертификатов Let's Encrypt.
apt-get install snapd snap install --classic certbot ln -s /snap/bin/certbot /usr/bin/certbot
Установив certbot, вы можете создать свой сертификат.
certbot certonly --standalone --rsa-key-size 4096 -m admin@putyato.pro -d turn.putyato.pro
За 30 (и 7) дней до истечения срока действия сертификатов вы получите электронное письмо на адрес admin@putyato.pro .
При необходимости откройте соответствующие порты:
sudo apt-get install ufw sudo ufw allow 3478 && \ sudo ufw allow 443 && \ sudo ufw allow 5349 && \ sudo ufw allow 49152:65535/tcp && \ sudo ufw allow 49152:65535/udp
Настройка мобильных приложений
Чтобы настроить мобильное приложение для использования вашего сервера:
Откройте Settings / Network & Servers / WebRTC ICE serversи переключите переключатель Configure ICE servers.
Введите в поле все адреса серверов, по одному в строке, например, если ваши серверы находятся на порту 5349:
stun:stun.putyato.pro:3478 turn:username:password@turn.putyato.pro:3478
или
stun:stun.putyato.pro:5349 turn:username:password@turn.putyato.pro:5349
Вот и все: теперь вы можете совершать аудио- и видеозвонки через свой собственный сервер, не передавая какие-либо данные нашим серверам (кроме обмена ключами с вашим контактом в зашифрованных сообщениях E2E).
Проверка подключения STUN/TURN :
Зайдите в IceTest . https://icetest.info/
В разделе «Создание списка серверов ICE» добавьте:
STUN: stun:<your_ip_or_domain>:<port>и ударилAdd STUN TURN: turn:<your_ip_or_domain>:<port>, Username: <your_login>, Credential: <your_pass>и ударилAdd TURN
Настройка записей DNS
Настойку делаем у доменного провайдера. NIC.RU
turn.example.com. 14400 IN A 37.226.5.44 turn.example.com. 14400 IN AAAA 2001:db8:1234::1 stun.example.com. 14400 IN A 37.226.5.44 stun.example.com. 14400 IN AAAA 2001:db8:1234::1 @ IN NAPTR 10 0 "s" "RELAY:turn.udp" "" _turn._udp.example.com _stun._udp.example.com. 14400 IN SRV 5 0 3478 turn.example.com _stun._tcp.example.com. 14400 IN SRV 5 0 3478 turn.example.com _stuns._tcp.example.com. 14400 IN SRV 5 0 5349 turn.example.com _turn._udp.example.com. 14400 IN SRV 5 0 3478 turn.example.com _turn._tcp.example.com. 14400 IN SRV 5 0 3478 turn.example.com _turns._tcp.example.com. 14400 IN SRV 5 0 5349 turn.example.com
Установка Тора
smp-сервер также можно развернуть для обслуживания из сети Tor . Выполните следующие команды от имени rootпользователя.
Установить Тор:
Мы предполагаем, что вы используете дистрибутивы на основе Ubuntu/Debian. Если нет, обратитесь к официальной документации Tor или к руководству по распространению.
Настройте официальный репозиторий Tor PPA:
CODENAME="$(lsb_release -c | awk '{print $2}')" echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list
Импортировать ключ репозитория:
curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
Обновить индекс репозитория:
apt update
Установить torпакет:
apt install -y tor deb.torproject.org-keyring
Настройте тор:
Конфигурация файла:
Откройте конфигурацию Tor в выбранном вами редакторе ( nano, vim, emacsи т. д.):
nano /etc/tor/torrc
И вставьте следующие строки в конец конфигурации. Обратите внимание на строки, начинающиеся с #: это комментарии к каждой отдельной опции.
# Enable log (otherwise, tor doesn't seemd to deploy onion address) Log notice file /var/log/tor/notices.log # Enable single hop routing (2 options below are dependencies of third). Will reduce latency in exchange of anonimity (since tor runs alongside smp-server and onion address will be displayed in clients, this is totally fine) SOCKSPort 0 HiddenServiceNonAnonymousMode 1 HiddenServiceSingleHopMode 1 # smp-server hidden service host directory and port mappings HiddenServiceDir /var/lib/tor/simplex-smp/ HiddenServicePort 5223 localhost:5223
Создайте каталоги:
mkdir /var/lib/tor/simplex-smp/ && chown debian-tor:debian-tor /var/lib/tor/simplex-smp/ && chmod 700 /var/lib/tor/simplex-smp/
Запустить тор:
Включите systemdсервис и запустите Tor. Offical torнемного ненадежен при первом запуске и может не создать луковый адрес хоста, поэтому на всякий случай перезапускаем его.
systemctl enable tor && systemctl start tor && systemctl restart tor
Отображение лукового хоста:
Выполните следующую команду, чтобы отобразить адрес вашего лукового хоста:
cat /var/lib/tor/simplex-smp/hostname
Скрипт устанавливает сервер SimpleX без Docker на Ubuntu 22.04
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/install.sh -o simplex-server-install.sh \ && if echo 'b8cf2be103f21f9461d9a500bcd3db06ab7d01d68871b07f4bd245195cbead1d simplex-server-install.sh' | sha256sum -c; then chmod +x ./simplex-server-install.sh && ./simplex-server-install.sh; rm ./simplex-server-install.sh; else echo "SHA-256 checksum is incorrect!" && rm ./simplex-server-install.sh; fi
Использование вашего дистрибутива
Установите Haskell GHCup , GHC 8.10.7 и кабал:
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh ghcup install ghc 8.10.7 ghcup install cabal ghcup set ghc 8.10.7 ghcup set cabal
Постройте проект:
git clone https://github.com/simplex-chat/simplexmq cd simplexmq git checkout stable # On Ubuntu. Depending on your distribution, use your package manager to determine package names. apt-get update && apt-get install -y build-essential libgmp3-dev zlib1g-dev cabal update cabal install
- Инициализируйте SMP-сервер с помощью smp-server init [-l] -n <fqdn>или smp-server init [-l] --ip <ip>— в зависимости от того, как вы его инициализируете, в качестве адреса сервера будет использоваться полное доменное имя или IP-адрес.
- Запустите smp-server start, чтобы запустить SMP-сервер, или вы можете настроить диспетчер служб для запуска его как службы.
- При желании smp-serverможно настроить наличие лукового адреса в torсети. Видеть: scripts/tor. В этом случае адрес сервера может иметь как общедоступное, так и луковое имя хоста, указывающее на один и тот же сервер, чтобы позволить двум людям подключаться, когда только один из них использует Tor. Адрес сервера будет:smp://<fingerprint>@<public_hostname>,<onion_hostname>
Дополнительную информацию смотрите в этом разделе . Запустите smp-server -hи smp-server init -hдля объяснения команд и опций.