🎯 Цель работы
Освоить принципы проксирования, туннелирования и скрытия сетевого трафика на примере приложения для анонимного обмена сообщениями.
📋 Задание
Реализовать серверное приложение для анонимного обмена сообщениями (например, “Тайный Санта”, “Валентинки” или “Анонимный фидбек”).
В классической игре “Тайный поклонник” группа людей обменивается анонимными комплиментами, пожеланиями или признаниями. Каждый участник пишет сообщение, которое должно быть доставлено получателю анонимно. Организатор (ведущий) знает, кто кому писал, но участники — нет. В конце игра может раскрывать авторов или нет.
Реализовать клиентское приложение с 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, скорость.|