No description
  • Go 99.8%
  • Shell 0.2%
Find a file
2025-12-10 16:10:27 +03:00
cmd Разделение на несколько файлов checker 2025-12-10 14:47:19 +03:00
configs Добавление progressbar для checker-а 2025-12-09 21:23:33 +03:00
docs Проверка прокси-серверов на mitm (и такие тоже бывают) 2025-12-10 16:10:27 +03:00
internal/pkg Проверка прокси-серверов на mitm (и такие тоже бывают) 2025-12-10 16:10:27 +03:00
logger Логгер под Linux и Wondows 2025-12-04 23:36:25 +03:00
scripts Добавление progressbar для checker-а 2025-12-09 21:23:33 +03:00
.dockerignore Логгер под Linux и Wondows 2025-12-04 23:36:25 +03:00
.gitignore Добавление многопоточности в checker 2025-12-09 20:31:12 +03:00
.woodpecker.yml Сборка checker-а через CI/CD 2025-12-09 20:36:31 +03:00
Dockerfile.server Fix Dockerfile 2025-12-04 21:07:50 +03:00
go.mod Добавление progressbar для checker-а 2025-12-09 21:23:33 +03:00
go.sum Добавление progressbar для checker-а 2025-12-09 21:23:33 +03:00
LICENSE first commit 2025-12-04 13:08:10 +03:00
README.md Проверка прокси-серверов на mitm (и такие тоже бывают) 2025-12-10 16:10:27 +03:00

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

Настройка

Сервер может быть настроен с использованием конфигурационных файлов, переменных окружения или флагов командной строки. Приоритет конфигурации (от высшего к низшему):

  1. Флаги командной строки
  2. Переменные окружения
  3. Конфигурационный файл
  4. Значения по умолчанию

Конфигурационные файлы

Сервер поддерживает загрузку конфигурации из 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

Горячая перезагрузка конфигурации

Сервер поддерживает горячую перезагрузку конфигурации без остановки сервиса. Для этого:

  1. Через изменение файла: Сервер автоматически отслеживает изменения в файле конфигурации и применяет новые настройки (если указан флаг --config).
  2. Через сигнал: Сервер принимает сигнал 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.1
  • SOCKS5_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 подключений с одного IP
  • SOCKS5_MAX_TRANSFER_SPEED=1048576 - не более 1 МБ/с на соединение
  • SOCKS5_MIN_TRANSFER_SPEED=1024 - минимальная скорость 1 КБ/с, иначе соединение закрывается
  • SOCKS5_MAX_CONNECT_REQUESTS_PER_SECOND=5.0 - не более 5 CONNECT-запросов в секунду с одного IP
  • SOCKS5_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 через прокси"