🎯 Цель работы

Освоить принципы проксирования, туннелирования и скрытия сетевого трафика на примере приложения для анонимного обмена сообщениями.

📋 Задание

Реализовать серверное приложение для анонимного обмена сообщениями (например, “Тайный Санта”, “Валентинки” или “Анонимный фидбек”).

В классической игре “Тайный поклонник” группа людей обменивается анонимными комплиментами, пожеланиями или признаниями. Каждый участник пишет сообщение, которое должно быть доставлено получателю анонимно. Организатор (ведущий) знает, кто кому писал, но участники — нет. В конце игра может раскрывать авторов или нет.

Реализовать клиентское приложение с GUI на JavaFX, позволяющее выбирать уровень защиты клиента:

Уровень 0: Без защиты (прямое соединение).
Уровень 1: Прокси (скрытие IP-адреса отправителя).
Уровень 2: Туннель (использование протокола ProtoBuf).
Уровень 3: Прокси + туннель (полное скрытие).

Обеспечить передачу сообщений согласно выбранному уровню защиты и проанализировать видимость трафика в Wireshark.

🏗️ Теория

В сетях передача данных может быть уязвима для перехвата. Для защиты используются разные подходы.

Метод Что скрывает Как работает Пример
Прокси IP-адрес отправителя Клиент отправляет запрос прокси-серверу, а тот перенаправляет его получателю от своего имени. Получатель видит IP прокси, а не клиента. Корпоративный прокси, анонимайзеры
Туннель (шифрование) Содержимое сообщения Данные шифруются перед отправкой. Перехватчик видит только нечитаемый набор байт. HTTPS, VPN
Прокси + туннель И IP, и содержимое Клиент → зашифрованный трафик → прокси → зашифрованный трафик → сервер. XXX

Сервер всегда знает IP того, кто к нему подключился (это техническая неизбежность TCP).

Но с помощью прокси можно сделать так, чтобы сервер видел IP прокси, а не реального клиента.

С помощью туннеля (шифрования) можно скрыть от наблюдателя содержимое сообщений.

Комбинация прокси+туннель скрывает и IP (от сервера), и содержимое (от всех).

Для игры “Тайный поклонник” этого достаточно, поскольку сервер (организатор) может знать IP прокси, но не знать реальный IP участника. А наблюдатель в сети не может прочитать сообщения.

📋 Cценарий работы приложения

Основной сценарий игры

Шаг 1. Регистрация

Клиент (Алиса) подключается к серверу и отправляет команду: REGISTER|Алиса Сервер сохраняет Алису в списке участников. Ответ: OK|Алиса зарегистрирована.

Шаг 2. Отправка анонимного сообщения

Клиент (Боб) хочет отправить сообщение Алисе.

Боб отправляет команду: SEND|Алиса|Ты сегодня прекрасно выглядишь!

Сервер проверяет, что Алиса зарегистрирована.

Сохраняет сообщение в “ящике” Алисы (например, в Map<String, Queue>).

Сервер не хранит, кто отправил. Только получателя и текст.

Ответ Бобу: OK|Сообщение отправлено.

Шаг 3. Получение сообщений

Алиса, желая прочитать свои сообщения, отправляет команду: INBOX

Сервер возвращает все накопленные для Алисы сообщения, (каждое сообщение на отдельной строке)

После прочтения сообщения можно удалять или помечать прочитанными.

Шаг 4. (Опционально) Раскрытие авторов

В конце игры администратор (или по команде REVEAL) может раскрыть, кто кому писал. Но в базовом варианте авторы остаются неизвестными.

Сценарий с прокси (скрыть IP от сервера)

Клиент (Алиса) подключается не к серверу, а к прокси-серверу.

Прокси устанавливает соединение с основным сервером от своего имени.

Сервер видит IP прокси, а не IP Алисы.

Алиса отправляет команды через прокси.

Прокси пересылает команды серверу, подставляя свой IP.

Критерии оценки и индивидуальные варианты

Реализация индивидуального варианта по основному сценарию - 3 балла, +1 балл дедлайн, +1 балл за сценарий с прокси

🎯 Варианты заданий

Группа 1: Праздничные и развлекательные

Название Суть Команды Почему нужна защита
1 Тайный Санта Анонимное назначение, кто кому дарит подарок REGISTER, ASSIGN, WHO, WISH, REVEAL Сохранить интригу, никто не должен знать пары
2 Валентинки Анонимная отправка валентинок REGISTER, SEND, INBOX, LIKE Отправитель остаётся неизвестным до определённого момента
3 Анонимные лайки Лайки без привязки к отправителю REGISTER, LIKE, TOP, HIDE Нельзя узнать, кто поставил лайк
4 Пожелания на день рождения Коллеги отправляют пожелания имениннику анонимно REGISTER, WISH, INBOX, REVEAL Сохранить сюрприз, кто что пожелал
5 Тайный друг Вариант Тайного Санты, но для дружеских встреч REGISTER, ASSIGN, HINT, GUESS Участники угадывают, кто их “тайный друг”
6 Капсула времени Анонимные сообщения, которые открываются в определённую дату REGISTER, STORE, OPEN, NOTIFY Сообщения должны быть скрыты до даты
7 Сюрприз-челлендж Участники анонимно назначают друг другу простые задания REGISTER, CHALLENGE, DONE, REVEAL Сохранить интригу, кто кому задание дал

Группа 2: Обратная связь и опросы

Название Суть Команды Почему нужна защита
8 Анонимный фидбек Сотрудники оставляют отзывы о работе коллег REGISTER, FEEDBACK, VIEW, REPORT Честная обратная связь без страха
9 Вопросы руководителю Анонимные вопросы для руководства REGISTER, ASK, ANSWER, FAQ Сотрудники могут спросить о сложном
10 Жалобы и предложения Анонимная подача жалоб REGISTER, COMPLAINT, SUGGEST, STATUS Безопасная среда для критики
11 Оценка мероприятий Анонимная оценка корпоративов REGISTER, RATE, COMMENT, RESULTS Честная оценка без давления
12 Книга жалоб (анонимная) Анонимные записи в книгу жалоб REGISTER, ENTRY, READ, RESOLVE Защита от репрессий
13 360 градусов Анонимная оценка коллег по разным критериям REGISTER, RATE_COLLEAGUE, SUMMARY, AVOID Честная обратная связь без опасений

Группа 3: Социальные и игровые

Название Суть Команды Почему нужна защита
14 Тайный поклонник Анонимные комплименты REGISTER, COMPLIMENT, INBOX, THANK Можно выражать симпатию без неловкости
15 Голосование за лучшего сотрудника Анонимное голосование REGISTER, NOMINATE, VOTE, RESULTS Честное голосование без лобби
16 Кто я? (игра) Анонимные подсказки, кто скрывается за ником REGISTER, HINT, GUESS, REVEAL Сохранить интригу игры
17 Мафия (анонимная роль) Распределение ролей в игре “Мафия” REGISTER, ASSIGN_ROLE, ACTION, REVEAL Никто не знает роли других
18 Турнирная таблица Анонимные ставки на победителей REGISTER, BET, STANDINGS, PAYOUT Нельзя связать ставку с игроком
19 Эмодзи-реакции Анонимные реакции на посты/события REGISTER, REACT, STATS, HIDE_REACT Нельзя узнать, кто как отреагировал

Группа 4: Организационные и деловые

Название Суть Команды Почему нужна защита
20 Анонимный коуч Анонимные сессии с наставником REGISTER, ASK, RESPOND, RATING Сотрудник может спросить о карьере без страха
21 Ментор-подопечный Анонимное назначение менторов REGISTER, ASSIGN, ASK, FEEDBACK Сохранить анонимность при обращении
22 Корпоративный психолог Анонимные обращения к психологу REGISTER, APPOINTMENT, MESSAGE, FEEDBACK Конфиденциальность обращений
23 Анонимное выдвижение Выдвижение кандидатур на премию REGISTER, NOMINATE, SECOND, VOTE Избежать “голосования по знакомству”
24 Анонимный пульс Регулярные анонимные опросы удовлетворённости REGISTER, PULSE, TREND, SKIP Честная оценка настроения в коллективе
25 Идеи и инновации Анонимная подача идей с вознаграждением REGISTER, SUBMIT_IDEA, VOTE_IDEA, REWARD Идеи оцениваются по содержанию, а не по автору

Продвинутые варианты*

|№| Название варианта| Описание| | – | —| –| |1| Цепочка прокси |Реализовать два последовательных прокси-сервера. Клиент → Прокси1 → Прокси2 → Сервер. Проанализировать, кто какую информацию видит.| |2| Смешивание сообщений (миксер)| Прокси накапливает N сообщений, перемешивает их и отправляет на сервер в случайном порядке. Усложняет связывание отправителя и сообщения.| |3 |Шифрование для сервера (асимметричное)| Сообщение шифруется публичным ключом сервера. Прокси не может его прочитать. Реализовать с java.security.* (RSA).| |4| Обфускация под HTTP| Все сообщения (даже шифрованные) оборачиваются в HTTP-заголовки, чтобы выглядеть как обычный веб-трафик.| |5 |Stealth-адреса| Для каждого сообщения генерируется одноразовый адрес (или токен), чтобы нельзя было связать несколько сообщений с одним отправителем.| |6| Фиксированный размер пакетов| Все пакеты дополняются случайными байтами до фиксированного размера (например, 1024 байта), чтобы скрыть длину сообщения.| |7| DNS-туннель| Сообщения кодируются в поддоменах DNS-запросов (например, message123456789.server.com). Сервер извлекает сообщение из имени.| |8 |Стеганография (опционально)| Сообщение прячется в младшие биты изображения (PNG). Передаётся изображение, сервер извлекает сообщение.| |9 |Анонимная сеть (упрощённая)| Каждый узел (клиент, прокси1, прокси2) знает только следующий узел в цепочке. Никто не знает полного маршрута.| |10 |Сравнение форматов |Реализовать передачу сообщений в трёх форматах: текст, JSON, Protobuf. Сравнить размер пакета, читаемость в Wireshark, скорость.|