6.0 KiB
6.0 KiB
WebSocket Log Proxy - Логирующий WebSocket прокси для анализа WebSocket соединений
WebSocket реверс-прокси на Go, который логирует все WebSocket соединения и сообщения для анализа WebSocket API.
Возможности
- ✅ Перехват и логирование WebSocket подключений (connect/disconnect)
- ✅ Логирование всех входящих сообщений (от клиента к серверу)
- ✅ Логирование всех исходящих сообщений (от сервера к клиенту)
- ✅ Поддержка текстовых и бинарных сообщений
- ✅ Автоматическое форматирование JSON в логах
- ✅ Красивый консольный вывод и JSON формат
- ✅ Сохранение оригинальных заголовков и путей
- ✅ Двунаправленная пересылка сообщений в реальном времени
Установка
go mod download
Использование
Способ 1: Через аргументы командной строки
go run main.go ws://echo.websocket.org
Способ 2: Через переменные окружения
export TARGET_URL=ws://echo.websocket.org
export PORT=8080 # опционально, по умолчанию 8020
go run main.go
Способ 3: Сборка и запуск
go build -o ws-log-proxy
./ws-log-proxy ws://echo.websocket.org
Примеры
Базовое использование
# Запуск прокси на порту 8020, перенаправление на ws://echo.websocket.org
go run main.go ws://echo.websocket.org
# В другом терминале подключаемся через прокси
# Используя wscat (npm install -g wscat)
wscat -c ws://localhost:8020
# Или используя Python
python3 -c "import websocket; ws = websocket.create_connection('ws://localhost:8020'); ws.send('Hello'); print(ws.recv())"
С кастомным портом
PORT=3000 go run main.go ws://echo.websocket.org
С защищенным WebSocket (WSS)
go run main.go wss://secure-websocket-server.com
Логирование в файл
go run main.go ws://echo.websocket.org 2>&1 | tee ws-logs.txt
Формат логов
Прокси выводит логи в двух форматах:
- Человекочитаемый формат - красивый вывод в консоль с разделителями
- JSON формат - структурированные данные для дальнейшей обработки
Каждая запись содержит:
- Временную метку
- События подключения/отключения
- Направление сообщений (incoming/outgoing)
- Тип сообщения (text/binary)
- Содержимое сообщений
- Заголовки HTTP запроса
Пример вывода
================================================================================
[2024-01-15 10:30:45] WebSocket CONNECT
Remote: 127.0.0.1:52341
URL: /echo
Headers:
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
================================================================================
--------------------------------------------------------------------------------
[2024-01-15 10:30:46] ← INCOMING Message (Text)
Remote: 127.0.0.1:52341
Message:
{
"type": "hello",
"message": "Hello, WebSocket!"
}
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
[2024-01-15 10:30:46] → OUTGOING Message (Text)
Remote: 127.0.0.1:52341
Message:
{
"type": "echo",
"message": "Hello, WebSocket!"
}
--------------------------------------------------------------------------------
================================================================================
[2024-01-15 10:30:50] WebSocket DISCONNECT
Remote: 127.0.0.1:52341
URL: /echo
================================================================================
JSON формат лога
В конце каждой сессии выводится полный JSON лог со всеми сообщениями:
{
"connection": {
"timestamp": "2024-01-15T10:30:45Z",
"event": "connect",
"remote_addr": "127.0.0.1:52341",
"url": "/echo",
"headers": {...}
},
"messages": [
{
"timestamp": "2024-01-15T10:30:46Z",
"direction": "incoming",
"message": "{\"type\":\"hello\"}",
"message_type": 1,
"remote_addr": "127.0.0.1:52341"
},
{
"timestamp": "2024-01-15T10:30:46Z",
"direction": "outgoing",
"message": "{\"type\":\"echo\"}",
"message_type": 1,
"remote_addr": "127.0.0.1:52341"
}
]
}
Примечания
- JSON сообщения автоматически форматируются для лучшей читаемости
- Бинарные сообщения отображаются как
[Binary: N bytes] - Все оригинальные заголовки сохраняются и передаются на целевой сервер
- Прокси поддерживает как обычные WebSocket (ws://), так и защищенные (wss://)
- Сообщения логируются в реальном времени по мере их передачи
Отличия от HTTP версии
- Логирует WebSocket соединения вместо HTTP запросов/ответов
- Поддерживает двунаправленный поток сообщений
- Логирует каждое сообщение отдельно
- Отслеживает события подключения и отключения