
Одноранговый зашифрованный мессенджер на Rust с Noise IK и пробросом UDP NAT
Peer-to-peer чат с сквозным шифрованием через UDP. Без аккаунтов, без центрального сервера, ретранслирующего/хранящего сообщения, без посредников. Только два пира, прямое соединение и шифрование протоколом Noise.
https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05
Два человека запускают punchline connect <peer> на своих машинах. Punchline пробивается через их NAT, выполняет зашифрованное рукопожатие и погружает их в приватный чат — всё за несколько миллисекунд. Входящие в комплект серверы STUN и сигнальный сервер выполняют обнаружение, после чего уходят с пути.

cargo build --release
Запустите серверы (на машине, доступной обоим пирам) или используйте мои публичные, размещённые на 64.225.107.28 (STUN: порт 3478, сигнальный: порт 8743):
punchline-stund # STUN-сервер — сообщает пирам их внешний IP
punchline-signald # Сигнальный сервер — сопоставляет пиров, желающих общаться
На машине каждого пира:
# Создайте свою идентичность (пара ключей X25519)
punchline keygen
# Поделитесь своим открытым ключом с пиром
punchline pubkey
# Сохраните их ключ
punchline peers add alice a1b2c3d4...64_hex_chars
# Подключитесь (оба пира запускают это, указывая друг друга)
punchline connect alice --stun <server>:3478 --signal <server>:8743
TUI запускается с живым отображением прогресса подключения:
Обнаружение STUN — определение вашего внешнего адреса через punchline-stund
Сигнальный сервер — подключение к punchline-signald
Ожидание пира — сигнальный сервер сопоставляет обоих пиров
Hole punch — установление прямого UDP-пути
Рукопожатие Noise — зашифрованный обмен ключами
После завершения вы в чате. Вводите текст и нажимайте Enter. Нажмите Esc для выхода.
Вся система состоит из трёх исполняемых файлов, все включены в этот репозиторий:
| Бинарный файл | Роль | Когда используется |
|---|---|---|
punchline-stund | STUN-сервер (UDP) — отвечает внешним IP:портом клиента | Только при настройке |
punchline-signald | Сигнальный сервер (WebSocket) — сопоставляет пиров и обменивается адресами | Только при настройке |
punchline | Сам мессенджер — CLI, TUI, криптография, hole punching | Всегда |
После первоначальной настройки серверы STUN и сигнальный больше не используются. Всё происходит напрямую между пирами.
punchline| Команда | Описание |
|---|---|
keygen [--force] [-i path] | Сгенерировать новую пару ключей идентичности X25519. Используйте --force для перезаписи без запроса. Используйте -i для указания пути вывода. |
pubkey [-i path] | Вывести ваш открытый ключ (64 шестнадцатеричных символа). Используйте -i для получения из конкретного файла ключа. |
connect <peer> [-i path] [--stun addr] [--signal addr] | Подключиться к пиру по псевдониму или шестнадцатеричному ключу. Используйте -i для указания ключа идентичности. Запускает TUI. |
peers | Список всех известных пиров. |
peers add <name> <key> | Сохранить открытый ключ пира под псевдонимом. |
peers remove <name> | Удалить пира по псевдониму. |
config path | Показать путь к конфигурационному файлу. |
config show | Показать текущие значения конфигурации. |
status | Показать идентичность, конфигурацию, доступность серверов и количество пиров. |
completions <shell> | Сгенерировать автодополнение для оболочки (bash, zsh или fish). |
Глобальные флаги:
| Флаг | Описание |
|---|---|
-v | Увеличить подробность логов (-v = debug, -vv = trace). |
-q, --quiet | Подавить весь вывод логов. |
punchline-stund| Флаг | Описание |
|---|---|
--address <addr> | Адрес привязки (по умолчанию: 0.0.0.0). |
--port <port> | Порт привязки (по умолчанию: 3478). |
-v / -vv | Логирование отладки / трассировки. |
-q | Тихий режим. |
punchline-signald| Флаг | Описание |
|---|---|
--address <addr> | Адрес привязки (по умолчанию: 0.0.0.0). |
--port <port> | Порт привязки (по умолчанию: 8743). |
-v / -vv | Логирование отладки / трассировки. |
-q | Тихий режим. |
Вместо передачи --stun и --signal каждый раз создайте ~/.config/punchline/config.toml:
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"
punchline peers # список всех
punchline peers add alice a1b2c3d4... # добавить
punchline peers remove alice # удалить
Псевдонимы хранятся в ~/.punchline/known_peers.toml. Вы также можете подключиться напрямую, используя 64-символьный шестнадцатеричный ключ.
punchline status
Показывает вашу идентичность, конфигурацию, доступность серверов (отправляет реальный STUN-запрос и TCP-подключение) и количество пиров.
Оба сервера поддерживают -v (debug), -vv (trace), -q (quiet), --address и --port:
punchline-stund -v --port 3478
punchline-signald -v --port 8743
Настройте TUI через ~/.config/punchline/style.toml
Стили, использованные в видео:
[colors]
my_text = "#ebdbb2"
peer_text = "#bdae93"
input_text = "#ebdbb2"
border = "#ebdbb2"
sidebar_key = "#ebdbb2"
sidebar_value = "#bdae93"
[padding]
chat_horizontal = 2
chat_vertical = 1
Все цвета указаны в шестнадцатеричном RGB. Если файл отсутствует, используются цвета терминала по умолчанию.
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish
Полное имя протокола: Noise_IK_25519_ChaChaPoly_SHA256