184 lines
6.0 KiB
Markdown
184 lines
6.0 KiB
Markdown
# WebSocket Log Proxy - Логирующий WebSocket прокси для анализа WebSocket соединений
|
||
|
||
WebSocket реверс-прокси на Go, который логирует все WebSocket соединения и сообщения для анализа WebSocket API.
|
||
|
||
## Возможности
|
||
|
||
- ✅ Перехват и логирование WebSocket подключений (connect/disconnect)
|
||
- ✅ Логирование всех входящих сообщений (от клиента к серверу)
|
||
- ✅ Логирование всех исходящих сообщений (от сервера к клиенту)
|
||
- ✅ Поддержка текстовых и бинарных сообщений
|
||
- ✅ Автоматическое форматирование JSON в логах
|
||
- ✅ Красивый консольный вывод и JSON формат
|
||
- ✅ Сохранение оригинальных заголовков и путей
|
||
- ✅ Двунаправленная пересылка сообщений в реальном времени
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
go mod download
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Способ 1: Через аргументы командной строки
|
||
|
||
```bash
|
||
go run main.go ws://echo.websocket.org
|
||
```
|
||
|
||
### Способ 2: Через переменные окружения
|
||
|
||
```bash
|
||
export TARGET_URL=ws://echo.websocket.org
|
||
export PORT=8080 # опционально, по умолчанию 8020
|
||
go run main.go
|
||
```
|
||
|
||
### Способ 3: Сборка и запуск
|
||
|
||
```bash
|
||
go build -o ws-log-proxy
|
||
./ws-log-proxy ws://echo.websocket.org
|
||
```
|
||
|
||
## Примеры
|
||
|
||
### Базовое использование
|
||
|
||
```bash
|
||
# Запуск прокси на порту 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())"
|
||
```
|
||
|
||
### С кастомным портом
|
||
|
||
```bash
|
||
PORT=3000 go run main.go ws://echo.websocket.org
|
||
```
|
||
|
||
### С защищенным WebSocket (WSS)
|
||
|
||
```bash
|
||
go run main.go wss://secure-websocket-server.com
|
||
```
|
||
|
||
### Логирование в файл
|
||
|
||
```bash
|
||
go run main.go ws://echo.websocket.org 2>&1 | tee ws-logs.txt
|
||
```
|
||
|
||
## Формат логов
|
||
|
||
Прокси выводит логи в двух форматах:
|
||
|
||
1. **Человекочитаемый формат** - красивый вывод в консоль с разделителями
|
||
2. **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 лог со всеми сообщениями:
|
||
|
||
```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 запросов/ответов
|
||
- Поддерживает двунаправленный поток сообщений
|
||
- Логирует каждое сообщение отдельно
|
||
- Отслеживает события подключения и отключения
|
||
|