- Go 99.8%
- Shell 0.2%
| cmd | ||
| configs | ||
| docs | ||
| internal/pkg | ||
| logger | ||
| scripts | ||
| .dockerignore | ||
| .gitignore | ||
| .woodpecker.yml | ||
| Dockerfile.server | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| README.md | ||
SOCKS5 Сервер и Клиент
Реализация SOCKS5 прокси-сервера и клиента с аутентификацией и возможностями логирования.
Возможности
Сервер
- Соответствие протоколу SOCKS5 (RFC 1928)
- Аутентификация по имени пользователя/паролю
- Настройка через переменные окружения или флаги командной строки
- Логирование подключений с статистикой сессий
- Обработка параллельных подключений (многопоточность)
- Поддержка разрешения DNS через прокси (DNS through proxy)
- Поддержка UDP трафика через команду UDP ASSOCIATE (метод 0x03)
- Метрики производительности в формате Prometheus (экспорт через HTTP)
- Поддержка удаленного логирования через Syslog (на Unix-системах) или альтернативный логгер (на Windows)
- Поддержка форматов логирования: Plain и JSON
- Кроссплатформенная сборка (Linux, Windows, macOS)
Клиент
- Поддержка TCP CONNECT через SOCKS5 прокси
- Поддержка UDP ASSOCIATE через SOCKS5 прокси
- Аутентификация по имени пользователя/паролю (если требуется)
- Установка таймаутов подключения
- Простой в использовании API
Настройка
Сервер может быть настроен с использованием конфигурационных файлов, переменных окружения или флагов командной строки. Приоритет конфигурации (от высшего к низшему):
- Флаги командной строки
- Переменные окружения
- Конфигурационный файл
- Значения по умолчанию
Конфигурационные файлы
Сервер поддерживает загрузку конфигурации из JSON и YAML файлов с помощью флага --config:
Пример JSON файла (config.json):
{
"username": "myuser",
"password": "mypass",
"port": 1080,
"logfile": "/var/log/socks5.log",
"loglevel": "info",
"logaddr": "",
"logformat": "plain",
"silent": false
}
Пример YAML файла (config.yaml):
username: myuser
password: mypass
port: 1080
logfile: /var/log/socks5.log
loglevel: info
logaddr: ""
logformat: plain
silent: false
Использование конфигурационных файлов
# Использование JSON файла
./socks5-server --config config.json
# Использование YAML файла
./socks5-server --config config.yaml
# Использование JSON файла с ограничениями по IP и скорости
./socks5-server --config config_with_iprestrict.json
# Использование YAML файла с ограничениями по IP и скорости
./socks5-server --config config_with_iprestrict.yaml
Пример JSON файла с IP-ограничениями и ограничениями по скорости (config_with_iprestrict.json):
{
"username": "myuser",
"password": "mypass",
"port": 1080,
"logfile": "/var/log/socks5.log",
"loglevel": "info",
"logaddr": "",
"logformat": "plain",
"silent": false,
"incoming_whitelist": ["192.168.1.0/24", "10.0.0.1"],
"incoming_blacklist": ["1.2.3.4"],
"outgoing_whitelist": ["8.8.8.8", "1.1.1.0/24"],
"outgoing_blacklist": ["192.168.2.0/24"],
"connection_rate_limit": 10.0,
"max_connections": 1000,
"max_connections_per_ip": 10,
"max_transfer_speed": 1048576,
"min_transfer_speed": 1024
}
Пример YAML файла с IP-ограничениями и ограничениями по скорости (config_with_iprestrict.yaml):
username: myuser
password: mypass
port: 1080
logfile: /var/log/socks5.log
loglevel: info
logaddr: ""
logformat: plain
silent: false
incoming_whitelist:
- "192.168.1.0/24"
- "10.0.0.1"
outgoing_whitelist:
- "8.8.8.8"
- "1.1.1.0/24"
incoming_blacklist:
- "1.2.3.4"
outgoing_blacklist:
- "192.168.2.0/24"
connection_rate_limit: 10.0
max_connections: 1000
max_connections_per_ip: 10
max_transfer_speed: 1048576 # 1 MB/s
min_transfer_speed: 1024 # 1 KB/s
Горячая перезагрузка конфигурации
Сервер поддерживает горячую перезагрузку конфигурации без остановки сервиса. Для этого:
- Через изменение файла: Сервер автоматически отслеживает изменения в файле конфигурации и применяет новые настройки (если указан флаг
--config). - Через сигнал: Сервер принимает сигнал SIGHUP для ручной перезагрузки конфигурации:
# Найти PID процесса и отправить сигнал kill -HUP <pid> # или если вы запускаете как демон: # pkill -HUP -f socks5-server
Поддерживаются следующие изменения конфигурации без перезапуска:
- Изменение учетных данных аутентификации (имя пользователя/пароль)
- Изменение параметров логирования (уровень, формат, файл)
- Изменение IP-ограничений (whitelist/blacklist)
- Изменение параметров ограничения по скорости (connection rate, max connections, transfer speeds)
- Изменение прочих параметров (кроме порта, для изменения порта требуется перезапуск)
Переменные окружения
SOCKS5_USERNAME: Имя пользователя для аутентификации SOCKS5 (необязательно)SOCKS5_PASSWORD: Пароль для аутентификации SOCKS5 (необязательно)SOCKS5_PORT: Порт для прослушивания (по умолчанию: 1080)SOCKS5_LOGFILE: Путь к файлу лога (по умолчанию: stdout)SOCKS5_LOGLEVEL: Уровень логирования (debug, info, warn, error) (по умолчанию: info)SOCKS5_LOGADDR: Адрес удаленного логирования в формате host:port (необязательно)SOCKS5_LOGFORMAT: Формат логирования (plain, json) (по умолчанию: plain)SOCKS5_SILENT: Запуск в тихом режиме (без вывода в консоль) (по умолчанию: false)
Ограничения по IP-адресам
Сервер поддерживает настройку ограничений по IP-адресам для входящих и исходящих подключений:
SOCKS5_INCOMING_WHITELIST: Список IP-адресов или подсетей (CIDR), которым разрешено подключаться к серверу. Если указан, соединения только с этих адресов будут разрешены.SOCKS5_INCOMING_BLACKLIST: Список IP-адресов или подсетей (CIDR), которым запрещено подключаться к серверу. Эти адреса будут заблокированы даже если попадают в whitelist.SOCKS5_OUTGOING_WHITELIST: Список IP-адресов или подсетей (CIDR), к которым сервер может перенаправлять трафик. Если указан, соединения только с этих адресов будут разрешены.SOCKS5_OUTGOING_BLACKLIST: Список IP-адресов или подсетей (CIDR), к которым серверу запрещено перенаправлять трафик. Эти адреса будут заблокированы даже если попадают в whitelist.
Примеры значений
SOCKS5_INCOMING_WHITELIST=192.168.1.0/24,10.0.0.0/8,127.0.0.1SOCKS5_OUTGOING_BLACKLIST=192.168.2.0/24,172.16.0.0/12
Ограничения по скорости подключений и трафика
Сервер поддерживает настройку различных ограничений по скорости для защиты от DDoS-атак и abuse:
SOCKS5_CONNECTION_RATE_LIMIT: Максимальное количество новых подключений в секунду (0 = без ограничений)SOCKS5_MAX_CONNECTIONS: Максимальное общее количество одновременных подключений (0 = без ограничений)SOCKS5_MAX_CONNECTIONS_PER_IP: Максимальное количество одновременных подключений на один IP-адрес (0 = без ограничений)SOCKS5_MAX_TRANSFER_SPEED: Максимальная скорость передачи данных в байтах в секунду (0 = без ограничений)SOCKS5_MIN_TRANSFER_SPEED: Минимальная скорость передачи данных в байтах в секунду (0 = без ограничений). При низкой скорости соединение будет разорвано.SOCKS5_MAX_CONNECT_REQUESTS_PER_SECOND: Максимальное количество CONNECT-запросов в секунду на один IP-адрес (0 = без ограничений)SOCKS5_MAX_UDP_ASSOCIATIONS_PER_SECOND: Максимальное количество UDP-ассоциаций в секунду на один IP-адрес (0 = без ограничений)SOCKS5_SESSION_TIMEOUT_SECONDS: Максимальное время жизни сессии в секундах (0 = без ограничений)SOCKS5_IDLE_TIMEOUT_SECONDS: Время бездействия сессии в секундах до завершения (0 = без ограничений)SOCKS5_MAX_CONNECTIONS_PER_TIME_WINDOW: Максимальное количество подключений в заданном временном окне для анализа поведения (0 = без ограничений)SOCKS5_TIME_WINDOW_SECONDS: Временное окно в секундах для анализа поведения (по умолчанию: 300)SOCKS5_ENABLE_DNS_RESOLUTION: Включение/отключение разрешения доменных имен (по умолчанию: true)SOCKS5_ENABLE_UDP_SUPPORT: Включение/отключение поддержки UDP (по умолчанию: true)
Примеры значений
SOCKS5_CONNECTION_RATE_LIMIT=10.0- не более 10 новых подключений в секундуSOCKS5_MAX_CONNECTIONS=1000- не более 1000 одновременных подключенийSOCKS5_MAX_CONNECTIONS_PER_IP=5- не более 5 подключений с одного IPSOCKS5_MAX_TRANSFER_SPEED=1048576- не более 1 МБ/с на соединениеSOCKS5_MIN_TRANSFER_SPEED=1024- минимальная скорость 1 КБ/с, иначе соединение закрываетсяSOCKS5_MAX_CONNECT_REQUESTS_PER_SECOND=5.0- не более 5 CONNECT-запросов в секунду с одного IPSOCKS5_SESSION_TIMEOUT_SECONDS=3600- максимальное время жизни сессии 1 часSOCKS5_IDLE_TIMEOUT_SECONDS=300- завершать сессии после 5 минут бездействияSOCKS5_MAX_CONNECTIONS_PER_TIME_WINDOW=50- не более 50 подключений с одного IP за заданное времяSOCKS5_TIME_WINDOW_SECONDS=600- анализировать подключения в течение 10-минутного окнаSOCKS5_ENABLE_DNS_RESOLUTION=false- отключить разрешение доменных именSOCKS5_ENABLE_UDP_SUPPORT=false- отключить поддержку UDP
Флаги командной строки
--config: Путь к конфигурационному файлу (JSON или YAML)--username: Имя пользователя для аутентификации SOCKS5--password: Пароль для аутентификации SOCKS5--port: Порт для прослушивания (по умолчанию: 1080)--incoming-whitelist: Список IP-адресов или подсетей (через запятую), которым разрешено подключаться к серверу--incoming-blacklist: Список IP-адресов или подсетей (через запятую), которым запрещено подключаться к серверу--outgoing-whitelist: Список IP-адресов или подсетей (через запятую), к которым сервер может перенаправлять трафик--outgoing-blacklist: Список IP-адресов или подсетей (через запятую), к которым серверу запрещено перенаправлять трафик--connection-rate-limit: Максимальное количество новых подключений в секунду (0 = без ограничений)--max-connections: Максимальное общее количество одновременных подключений (0 = без ограничений)--max-connections-per-ip: Максимальное количество одновременных подключений на один IP-адрес (0 = без ограничений)--max-transfer-speed: Максимальная скорость передачи данных в байтах в секунду (0 = без ограничений)--min-transfer-speed: Минимальная скорость передачи данных в байтах в секунду (0 = без ограничений). При низкой скорости соединение будет разорвано.--max-connect-requests-per-second: Максимальное количество CONNECT-запросов в секунду на один IP-адрес (0 = без ограничений)--max-udp-associations-per-second: Максимальное количество UDP-ассоциаций в секунду на один IP-адрес (0 = без ограничений)--session-timeout-seconds: Максимальное время жизни сессии в секундах (0 = без ограничений)--idle-timeout-seconds: Время бездействия сессии в секундах до завершения (0 = без ограничений)--max-connections-per-time-window: Максимальное количество подключений в заданном временном окне для анализа поведения (0 = без ограничений)--time-window-seconds: Временное окно в секундах для анализа поведения (по умолчанию: 300)--enable-dns-resolution: Включение разрешения доменных имен (по умолчанию: true)--enable-udp-support: Включение поддержки UDP (по умолчанию: true)--logfile: Путь к файлу лога--loglevel: Уровень логирования (debug, info, warn, error)--logaddr: Адрес удаленного логирования в формате host:port--logformat: Формат логирования (plain, json)--silent: Запуск в тихом режиме (без вывода в консоль)
Вывод логов
Сервер логирует информацию о сессиях, включая:
- Начало сессии: IP клиента, адрес назначения, ID сессии
- Окончание сессии: IP клиента, адрес назначения, продолжительность сессии, переданные байты (входящие и исходящие)
- Попытки аутентификации: IP клиента, имя пользователя, статус успеха/неудачи
Метрики
Сервер экспортирует метрики в формате Prometheus на порту, который равен SOCKS5_PORT + 1000 (например, если SOCKS5_PORT=1080, то метрики будут доступны на порту 2080 по пути /metrics):
socks5_connections_total: Общее количество соединений (с метками: status="success" или status="error")socks5_bytes_transferred: Общее количество переданных байт (с метками: direction="upload" или direction="download")
Примеры использования
Сервер
С использованием переменных окружения
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_PORT=1080 ./socks5-server
С использованием флагов командной строки
./socks5-server --username=myuser --password=mypass --port=1080
С логированием
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_LOGFILE=/var/log/socks5.log SOCKS5_LOGLEVEL=info ./socks5-server
С удаленным логированием через Syslog
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_LOGADDR=remote.example.com:514 ./socks5-server
С JSON форматом логирования
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_LOGFORMAT=json ./socks5-server
С метриками Prometheus
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_PORT=1080 ./socks5-server
# Метрики будут доступны по адресу http://localhost:2080/metrics
Клиент
Клиентская библиотека предоставляется как часть проекта и может быть использована в других Go приложениях. При необходимости можно собрать примеры использования:
# Использование клиента в собственных приложениях
import "git.ymnuktech.ru/ymnuk/go-socks5/client"
Примеры использования клиента
TCP соединение через прокси:
package main
import (
"fmt"
"io"
"net/http"
"time"
client "git.ymnuktech.ru/ymnuk/go-socks5/client"
)
func main() {
// Создание клиента
client := client.NewClient("localhost:1080")
// Установка аутентификации (если требуется)
// client.SetAuth("username", "password")
// Установка таймаута
client.SetTimeout(30 * time.Second)
// Подключение к целевому серверу через прокси
conn, err := client.Connect("httpbin.org:80")
if err != nil {
panic(err)
}
defer conn.Close()
// Использование соединения
fmt.Fprintf(conn, "GET /ip HTTP/1.0\r\nHost: httpbin.org\r\n\r\n")
response, _ := io.ReadAll(conn)
fmt.Printf("Response: %s", response)
}
UDP через прокси:
package main
import (
"fmt"
"net"
"time"
client "git.ymnuktech.ru/ymnuk/go-socks5/client"
)
func main() {
// Создание клиента
client := client.NewClient("localhost:1080")
// Установка аутентификации (если требуется)
// client.SetAuth("username", "password")
// Установка таймаута
client.SetTimeout(30 * time.Second)
// Установка UDP ассоциации через прокси
udpConn, proxyAddr, err := client.UDPAssociate()
if err != nil {
panic(err)
}
defer udpConn.Close()
// Использование UDP соединения через прокси
// Пример: отправка DNS запроса на 8.8.8.8:53
targetAddr, _ := net.ResolveUDPAddr("udp", "8.8.8.8:53")
// Отправка данных
_, err = udpConn.WriteTo([]byte("dns_query_data"), targetAddr)
if err != nil {
panic(err)
}
// Чтение ответа
buffer := make([]byte, 1024)
n, _, err := udpConn.ReadFrom(buffer)
if err != nil {
panic(err)
}
fmt.Printf("Получено %d байт данных\n", n)
}
Цепочка из нескольких прокси:
package main
import (
"fmt"
"io"
"time"
client "git.ymnuktech.ru/ymnuk/go-socks5/client"
)
func main() {
// Создание клиента
client := client.NewClient("any_proxy_addr_for_defaults") // Адрес не важен для цепочки
// Установка таймаута
client.SetTimeout(30 * time.Second)
// Создание цепочки из нескольких SOCKS5 прокси
servers := []client.ChainServer{
{
Address: "proxy1.example.com:1080",
Username: "user1", // Укажите, если требуется аутентификация
Password: "pass1", // Укажите, если требуется аутентификация
},
{
Address: "proxy2.example.com:1080",
Username: "user2", // Укажите, если требуется аутентификация
Password: "pass2", // Укажите, если требуется аутентификация
},
{
Address: "proxy3.example.com:1080",
Username: "", // Пустые строки, если аутентификация не требуется
Password: "",
},
}
// Подключение через цепочку прокси к целевому серверу
conn, err := client.ChainConnect("target.server.com:80", servers)
if err != nil {
panic(err)
}
defer conn.Close()
// Использование соединения как обычного net.Conn
fmt.Fprintf(conn, "GET / HTTP/1.0\r\nHost: target.server.com\r\n\r\n")
response, _ := io.ReadAll(conn)
fmt.Printf("Response: %s", response)
}
// Пример двунаправленной передачи данных через цепочку прокси
func exampleBidirectional() {
client := client.NewClient("127.0.0.1:1080")
client.SetTimeout(30 * time.Second)
servers := []client.ChainServer{
{Address: "proxy1.example.com:1080"},
{Address: "proxy2.example.com:1080"},
{Address: "proxy3.example.com:1080"},
}
conn, err := client.ChainConnect("echo.server.com:80", servers)
if err != nil {
panic(err)
}
defer conn.Close()
// Отправка данных
conn.Write([]byte("Hello, proxy chain!"))
// Получение ответа
response := make([]byte, 1024)
n, err := conn.Read(response)
if err != nil {
panic(err)
}
fmt.Printf("Получен ответ: %s\n", string(response[:n]))
}
Сборка
### Кроссплатформенная сборка
Приложение поддерживает сборку для различных операционных систем:
#### Linux
```bash
GOOS=linux GOARCH=amd64 go build -o socks5-server-linux ./cmd/server
Windows
GOOS=windows GOARCH=amd64 go build -o socks5-server.exe ./cmd/server
macOS
GOOS=darwin GOARCH=amd64 go build -o socks5-server-macos ./cmd/server
Примечание: Функциональность удаленного логирования через Syslog доступна только на Unix-системах (Linux, macOS). На Windows системах используется альтернативный механизм логирования.
Вспомогательные инструменты
Checker (утилита проверки SOCKS5 серверов)
В проекте также включена утилита checker для проверки состояния SOCKS5 серверов. Она может проверять время подключения, поддержку DNS и UDP, измерять скорость передачи данных и максимальное количество одновременных подключений.
Сборка checker
go build -o checker ./cmd/checker
Использование checker
# Проверка сервера с выводом в plain формате (по умолчанию)
./checker --target=localhost:1080
# Проверка сервера с аутентификацией
./checker --target=localhost:1080 --username=myuser --password=mypass
# Проверка с выводом в JSON формате
./checker --target=localhost:1080 --output=json
# Проверка с выводом в YAML формате
./checker --target=localhost:1080 --output=yaml
# Проверка с сохранением результата в файл
./checker --target=localhost:1080 --output=json --output-file=check_result.json
# Проверка с настройками таймаута и максимального количества соединений
./checker --target=localhost:1080 --timeout=15 --max-conns=50
# Альтернативный способ указания целевого адреса через аргумент командной строки
./checker localhost:1080 --output=plain
# Проверка списка серверов с использованием 10 параллельных рабочих процессов
./checker --list=proxy_list.txt --workers=10
# Проверка одного сервера с использованием 5 параллельных рабочих процессов (для нагрузочного тестирования)
./checker --target=localhost:1080 --workers=5 --output=json
# Проверка списка серверов с выводом результата в файл и отображением прогресса в консоли
./checker --list=proxy_list.txt --output=json --output-file=results.json
# Проверка списка серверов с 5 параллельными рабочими процессами, выводом в файл и прогресс-баром в консоли
./checker --list=proxy_list.txt --workers=5 --output=json --output-file=results.json
# Проверка сервера с настройкой таймаута подключения (30 секунд по умолчанию)
./checker --target=localhost:1080 --conn-timeout=30
# Проверка списка серверов с немедленной записью результатов в файл (без накопления в памяти)
./checker --list=large_proxy_list.txt --output=json --output-file=results.json
# Проверка сервера с анализом скорости по временным окнам (окно 10 секунд)
./checker --target=localhost:1080 --speed-test-window=10s
# Проверка сервера с анализом скорости по временным окнам и минимальным порогом скорости (1MB/s)
./checker --target=localhost:1080 --speed-test-window=10s --speed-threshold=1048576
# Проверка списка серверов с анализом скорости и порогом 500KB/s, результаты в файл
./checker --list=proxy_list.txt --speed-test-window=5s --speed-threshold=512000 --output=json --output-file=speed_analysis.json
# Проверка сервера с использованием удаленного URL для теста пропускной способности
./checker --target=localhost:1080 --bandwidth-url=https://httpbin.org/bytes/1048576
# Проверка сервера с использованием удаленного URL и анализом скорости по окнам
./checker --target=localhost:1080 --bandwidth-url=https://httpbin.org/bytes/1048576 --speed-test-window=10s --speed-threshold=1048576
# Проверка сервера на подмену сертификата (MITM)
./checker --target=localhost:1080 --output=json
# Пример вывода результата с полем MITM:
# {
# "connect_time": "1.234ms",
# "can_udp": true,
# "can_dns": true,
# "upload_speed": 1048576.0,
# "download_speed": 2097152.0,
# "max_concurrent_conns": 100,
# "mitm": false,
# ...
# }
Параметры checker
--target: Адрес (IP или домен) SOCKS5 сервера для проверки--list: Путь к файлу, содержащему список серверов для проверки (один на строку)--output: Формат вывода результата (plain, json, yaml) (по умолчанию: plain)--output-file: Файл для сохранения результата (по умолчанию: stdout). При указании этого параметра вместе с--listв консоли будет отображаться прогресс-бар проверки серверов.--username: Имя пользователя для аутентификации (необязательно)--password: Пароль для аутентификации (необязательно)--timeout: Таймаут для проверки в секундах (по умолчанию: 10)--max-conns: Максимальное количество одновременных соединений для теста (по умолчанию: 100)--workers: Количество параллельных рабочих процессов для проверки (по умолчанию: 1)--conn-timeout: Таймаут соединения в секундах (по умолчанию: 30)--speed-test-window: Временное окно для анализа скорости (например, 10s, 1m) - если не установлено, анализ по окнам не выполняется--speed-threshold: Минимальный порог скорости в байтах в секунду для анализа по окнам - если не установлено, порог не применяется--bandwidth-url: URL удаленного сервера для тестирования пропускной способности (только для скачивания). Если не указан, используется локальный тестовый сервер.--mitm: Проверка на подмену сертификата (MITM) - если установлен, проверяет подмену сертификатов популярных сайтов
Пример использования checker с проверкой списка серверов
# Проверка списка серверов из файла
./checker --list=proxy_list.txt
# Проверка списка серверов с выводом в JSONL формате (один JSON объект на строку)
./checker --list=proxy_list.txt --output=json
# Проверка списка серверов с выводом в plain формате (одна строка на сервер)
./checker --list=proxy_list.txt --output=plain
# Проверка списка серверов с сохранением результата в файл
./checker --list=proxy_list.txt --output=json --output-file=batch_results.json
Формат файла списка серверов
Файл списка серверов должен содержать по одному адресу сервера на строку в следующих форматах:
address:port— для серверов без аутентификацииaddress:port:username— для серверов с аутентификацией по имени пользователяaddress:port:username:password— для серверов с аутентификацией по имени пользователя и паролю[IPv6_address]:port— для IPv6 адресов (в квадратных скобках)[IPv6_address]:port:username— IPv6 с аутентификацией[IPv6_address]:port:username:password— IPv6 с полной аутентификацией
Пример содержимого файла proxy_list.txt:
# Комментарии начинаются с #
# Формат: address:port[:username[:password]]
# Сервера без аутентификации
127.0.0.1:1080
localhost:1080
[::1]:1080
# Сервера с аутентификацией
192.168.1.1:8080:username:password
socks5.example.com:1080:testuser:testpass
[2001:db8::1]:1080:ipv6user:ipv6pass
Пример вывода checker в plain формате (одиночный сервер):
SOCKS5 Server Check Results for localhost:1080 (127.0.0.1:1080)
============================
Start Time: 2023-12-09 14:30:15
End Time: 2023-12-09 14:30:16
Duration: 1.234567s
Performance Metrics:
Connect Time: 12.456ms
Upload Speed: 25000000.00 bytes/sec (24414.06 KB/sec)
Download Speed: 18000000.00 bytes/sec (17578.13 KB/sec)
Max Concurrent Connections: 100
Feature Support:
DNS Resolution: true
UDP Association: true
TCP Connectivity: true
Speed Window Analysis:
Window 0 (upload): 25000000.00 bytes/sec (24414.06 KB/sec)
Window 0 (download): 18000000.00 bytes/sec (17578.13 KB/sec)
Slow by window: false
Speed Warnings: []
Status: OK
Пример вывода checker в JSON формате (одиночный сервер):
{
"Server": "localhost:1080",
"IP": "127.0.0.1",
"Port": "1080",
"Result": {
"ConnectTime": 12456789,
"CanUDP": true,
"CanDNS": true,
"HasTCPConnectivity": true,
"UploadSpeed": 25000000.0,
"DownloadSpeed": 18000000.0,
"MaxConcurrentConns": 100,
"Error": null,
"StartTime": "2023-12-09T14:30:15.123456789Z",
"EndTime": "2023-12-09T14:30:16.345678901Z",
"WindowSpeedResults": [
{
"start_time": "2023-12-09T14:30:15.123456789Z",
"end_time": "2023-12-09T14:30:16.123456789Z",
"duration": 10000000000,
"data_type": "upload",
"bytes": 250000000,
"speed": 25000000.00,
"window_index": 0
},
{
"start_time": "2023-12-09T14:30:15.123456789Z",
"end_time": "2023-12-09T14:30:16.123456789Z",
"duration": 10000000000,
"data_type": "download",
"bytes": 180000000,
"speed": 18000000.00,
"window_index": 0
}
],
"IsSlowByWindow": false,
"SpeedWarnings": []
}
}
Пример вывода checker в plain формате (пакетная проверка):
При пакетной проверке (использование флага --list) формат plain вывода изменяется на одну строку на сервер:
localhost:1080 (127.0.0.1:1080) ConnectTime=12.456ms UploadSpeed=24414.06KB/s DownloadSpeed=17578.13KB/s MaxConns=100 DNS=true UDP=true TCP=true Status=OK
proxy.example.com (93.184.216.34:1080) ConnectTime=45.678ms UploadSpeed=12345.67KB/s DownloadSpeed=9876.54KB/s MaxConns=50 DNS=false UDP=true TCP=true SpeedSlow=false Status=OK
[2001:db8::1]:1080 ([2001:db8::1]:1080) ConnectTime=23.456ms UploadSpeed=34567.89KB/s DownloadSpeed=23456.78KB/s MaxConns=75 DNS=true UDP=false TCP=true SpeedSlow=false Status=OK
Пример вывода checker в JSON формате (пакетная проверка):
При пакетной проверке с JSON форматом используется формат JSONL (один JSON объект на строку):
{"server":"localhost:1080","ip":"127.0.0.1","port":"1080","result":{"connectTime":12456789,"canUDP":true,"canDNS":true,"hasTCPConnectivity":true,"uploadSpeed":25000000,"downloadSpeed":18000000,"maxConcurrentConns":100,"error":null,"startTime":"2023-12-09T14:30:15.123456789Z","endTime":"2023-12-09T14:30:16.345678901Z"}}
{"server":"proxy.example.com","ip":"93.184.216.34","port":"1080","result":{"connectTime":45678901,"canUDP":true,"canDNS":false,"hasTCPConnectivity":true,"uploadSpeed":12345678,"downloadSpeed":9876543,"maxConcurrentConns":50,"error":null,"startTime":"2023-12-09T14:30:16.345678902Z","endTime":"2023-12-09T14:30:17.345678903Z"}}
{"server":"[2001:db8::1]:1080","ip":"2001:db8::1","port":"1080","result":{"connectTime":23456789,"canUDP":false,"canDNS":true,"hasTCPConnectivity":true,"uploadSpeed":34567890,"downloadSpeed":23456789,"maxConcurrentConns":75,"error":null,"startTime":"2023-12-09T14:30:17.345678904Z","endTime":"2023-12-09T14:30:18.345678905Z"}}
Сервер
Сборка сервера
go build -o socks5-server ./cmd/server
Примеры использования сервера
С использованием переменных окружения
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_PORT=1080 ./socks5-server
С использованием флагов командной строки
./socks5-server --username=myuser --password=mypass --port=1080
С логированием
SOCKS5_USERNAME=myuser SOCKS5_PASSWORD=mypass SOCKS5_LOGFILE=/var/log/socks5.log SOCKS5_LOGLEVEL=info ./socks5-server
Примечание: Функциональность удаленного логирования через Syslog доступна только на Unix-системах (Linux, macOS). На Windows системах используется альтернативный механизм логирования.
Тестирование
Запуск модульных и интеграционных тестов:
# Все тесты
go test ./...
# Тесты для конкретного пакета
go test ./internal/pkg/checker/ -v
# Интеграционные тесты для checker
go test ./internal/pkg/checker/ -run Integration -v
Соответствие протоколу
Эта реализация поддерживает:
- Рукопожатие SOCKS5 с согласованием метода аутентификации
- Аутентификацию по имени/паролю (метод 0x02)
- Метод без аутентификации (метод 0x00) как резервный
- Команду CONNECT (0x01) для TCP-соединений
- Команду UDP ASSOCIATE (0x03) для UDP-соединений
- Типы адресов IPv4, IPv6 и доменные имена
- Правильные ответы об ошибках для неподдерживаемых команд
- Правильную обработку доменных имен в запросах CONNECT для поддержки "DNS через прокси"