Shadowsocks-rust

Anonymizers ★ Рекомендуемый v1.24.0 · 10.12.2025 активный

Быстрейшая реализация протокола Shadowsocks на Rust с поддержкой AEAD-шифрования (AES-256-GCM, ChaCha20-Poly1305). Трафик выглядит как случайный поток байт — DPI-системы провайдера не могут идентифицировать протокол и заблокировать соединение. Режимы: sslocal (клиент, SOCKS5/HTTP), ssserver (сервер), ssmanager (управление пулом). Поддерживает плагины obfuscation (v2ray-plugin, obfs) для дополнительной маскировки. Используется для обхода GFW (Китай), СОРМ (Россия) и других систем глубокой инспекции пакетов.

v1.24.0
10.12.2025 current
Добавлен 24.06.2026 · Обновлён 24.07.2026 · Anonymizers
Установка
# Установка
cargo install shadowsocks-rust
# или бинарники на GitHub Releases

# Конфиг клиента (config.json)
# {"server":"my.server.com","server_port":8388,
#  "password":"pass","method":"aes-256-gcm"}

sslocal -c config.json
# Теперь SOCKS5-прокси на 127.0.0.1:1080
переведено ИИ

shadowsocks

Лицензия Сборка и тесты Минимальная поддерживаемая версия Rust Сборка релизов Сборка ночных релизов Gurubase

crates.io Релиз shadowsocks-rust aur shadowsocks-rust-git NixOS snap shadowsocks-rust homebrew shadowsocks-rust MacPorts shadowsocks-rust

Это порт shadowsocks.

shadowsocks — это быстрый туннельный прокси, который помогает обходить фаерволы.

Библиотека Описание
shadowsocks crates.io docs.rs Ядро протокола shadowsocks
shadowsocks-service crates.io docs.rs Сервисы для предоставления shadowsocks
shadowsocks-rust crates.io Бинарные файлы для запуска распространённых сервисов shadowsocks

Связанные проекты:

Сборка и установка

Опциональные возможности

  • hickory-dns - Использует hickory-resolver как DNS-резолвер вместо встроенного в tokio.

  • local-http - Разрешает использовать HTTP-протокол для sslocal

  • local-http-native-tls - Поддержка HTTPS с помощью native-tls

  • local-http-rustls - Поддержка HTTPS с помощью rustls

  • local-tunnel - Разрешает использовать туннельный протокол для sslocal

  • local-socks4 - Разрешает использовать протокол SOCKS4/4a для sslocal

  • local-redir - Разрешает использовать протокол перенаправления (прозрачного прокси) для sslocal

  • local-dns - Разрешает использовать протокол DNS для sslocal, работает как DNS-сервер, проксируя запросы к локальным или удалённым DNS-серверам по правилам ACL

  • local-fake-dns - FakeDNS, выделяющий IP-адрес для каждого отдельного запроса из определённого пула IP-адресов

  • local-tun - Поддержка интерфейса TUN для sslocal

  • local-online-config - Онлайн-доставка конфигурации SIP008

  • stream-cipher - Включает устаревшие потоковые шифры. ВНИМАНИЕ: потоковые шифры НЕБЕЗОПАСНЫ!

  • aead-cipher-extra - Включает нестандартные AEAD-шифры

  • aead-cipher-2022 - Включает шифры AEAD-2022 (SIP022)

  • aead-cipher-2022-extra - Включает дополнительные шифры AEAD-2022 (нестандартные шифры)

Выделители памяти

Этот проект использует системный (libc) выделитель памяти (по умолчанию в Rust). Однако он также позволяет вам использовать другие известные выделители через возможности:

  • jemalloc - Использует jemalloc как глобальный выделитель памяти
  • mimalloc - Использует mi-malloc как глобальный выделитель памяти
  • tcmalloc - Использует TCMalloc как глобальный выделитель памяти. По умолчанию пытается связать с системным tcmalloc, используйте собственный из исходников с tcmalloc-vendored.
  • snmalloc - Использует snmalloc как глобальный выделитель памяти
  • rpmalloc - Использует rpmalloc как глобальный выделитель памяти

crates.io

Установка из crates.io:

# Install from crates.io
cargo install shadowsocks-rust

затем вы можете найти sslocal и ssserver в $CARGO_HOME/bin.

Установка с помощью Homebrew

Для macOS и Linux вы можете установить его с помощью Homebrew:

brew install shadowsocks-rust

Установка с помощью snap

# Install from snapstore
snap install shadowsocks-rust

# List services
snap services shadowsocks-rust

# Enable and start shadowsocks-rust.sslocal-daemon snap service
snap start --enable shadowsocks-rust.sslocal-daemon

# Show generated systemd service status
systemctl status snap.shadowsocks-rust.sslocal-daemon.service

# Override generated systemd service (configure startup options)
systemctl edit snap.shadowsocks-rust.sslocal-daemon.service

## NOTE: you can pass args to sslocal:
##  [Service]
##  ExecStart=
##  ExecStart=/usr/bin/snap run shadowsocks-rust.sslocal-daemon -b "127.0.0.1:1080" --server-url "ss://...."

# Restart generated systemd service to apply changes
systemctl restart snap.shadowsocks-rust.sslocal-daemon.service

# ... and show service status
systemctl status snap.shadowsocks-rust.sslocal-daemon.service

Путь к файлу конфигурации по умолчанию, вероятно, /var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json.

Загрузка релиза

Загрузите статически скомпонованные сборки здесь.

  • Большинство из них собраны с помощью cross. Подробности о среде сборки можно найти в его README, например, версия glibc.
  • x86_64-apple-darwin, aarch64-apple-darwin собраны в образе github macos-latest. Информацию можно найти здесь.
  • x86_64-pc-windows-msvc собран в образе github windows-latest. Информацию можно найти здесь.

Docker

Этот проект предоставляет Docker-образы для архитектур linux/i386, linux/amd64 и linux/arm64/v8.

:warning: Контейнеры Docker по умолчанию не имеют доступа к IPv6: Убедитесь, что вы отключили маршрут IPv6 на клиенте или включили доступ IPv6 к docker-контейнерам.

Получение из GitHub Container Registry

Docker автоматически скачает образ подходящей архитектуры из нашего GitHub Packages.

docker pull ghcr.io/shadowsocks/sslocal-rust:latest
docker pull ghcr.io/shadowsocks/ssserver-rust:latest

Сборка на локальной машине (Необязательно)

Если вы хотите собрать Docker-образ самостоятельно, вам нужно использовать BuildX.

docker buildx build -t shadowsocks/ssserver-rust:latest -t shadowsocks/ssserver-rust:v1.15.2 --target ssserver .
docker buildx build -t shadowsocks/sslocal-rust:latest -t shadowsocks/sslocal-rust:v1.15.2 --target sslocal .

Запуск контейнера

Вам необходимо смонтировать файл конфигурации в контейнер и создать внешнее отображение портов для контейнера для подключения к нему.

docker run --name sslocal-rust \
  --restart always \
  -p 1080:1080/tcp \
  -v /path/to/config.json:/etc/shadowsocks-rust/config.json \
  -dit ghcr.io/shadowsocks/sslocal-rust:latest

docker run --name ssserver-rust \
  --restart always \
  -p 8388:8388/tcp \
  -p 8388:8388/udp \
  -v /path/to/config.json:/etc/shadowsocks-rust/config.json \
  -dit ghcr.io/shadowsocks/ssserver-rust:latest

Развертывание в Kubernetes

В этом проекте предоставлены YAML-манифесты для развертывания в Kubernetes.

Вы можете использовать сервисы Kubernetes (Service) для вывода трафика наружу, например, LoadBalancer или NodePort, что обеспечивает более тонкую настройку по сравнению с фиксированным хостом или портом.

Для более интересного варианта использования вы можете использовать Ingress (Istio, nginx и т.д.), который маршрутизирует совпадающий трафик в Shadowsocks вместе с реальным веб-сервисом.

Использование kubectl

kubectl apply -f https://github.com/shadowsocks/shadowsocks-rust/raw/master/k8s/shadowsocks-rust.yaml

Вы можете изменить конфигурацию, отредактировав ConfigMap с именем shadowsocks-rust.

Для более тонкой настройки используйте helm.

Использование helm

helm install my-release k8s/chart -f my-values.yaml

Ниже приведены основные значения по умолчанию, которые вы можете изменить:

# This is the shadowsocks config which will be mount to /etc/shadowocks-rust.
# You can put arbitrary yaml here, and it will be translated to json before mounting.
servers:
- server: "::"
  server_port: 8388
  service_port: 80 # the k8s service port, default to server_port
  password: mypassword
  method: aes-256-gcm
  fast_open: true
  mode: tcp_and_udp
  # plugin: v2ray-plugin
  # plugin_opts: server;tls;host=github.com

# Whether to download v2ray and xray plugin.
downloadPlugins: false

# Name of the ConfigMap with config.json configuration for shadowsocks-rust.
configMapName: ""

service:
  # Change to LoadBalancer if you are behind a cloud provider like aws, gce, or tke.
  type: ClusterIP

# Bind shadowsocks port port to host, i.e., we can use host:port to access shawdowsocks server.
hostPort: false

replicaCount: 1

image:
  repository: ghcr.io/shadowsocks/ssserver-rust
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "latest"

Сборка из исходного кода

Используйте cargo для сборки. ВНИМАНИЕ: ОЗУ >= 2 ГиБ

cargo build --release

Затем sslocal и ssserver появятся в ./target/(debug|release)/, они работают аналогично двум исполняемым файлам в официальной реализации ShadowSocks.

make install TARGET=release

Затем sslocal, ssserver, ssmanager и ssurl будут установлены в /usr/local/bin (переменная PREFIX).

Для пользователей Windows, если у вас возникли проблемы при сборке, проверьте и обсудите их в #102.

Оптимизация для target-cpu

Если вы собираете для текущей платформы вашего ЦП (например, собираете и запускаете на своем персональном компьютере), рекомендуется установить функцию target-cpu=native, чтобы rustc генерировал и оптимизировал код для ЦП, выполняющего компиляцию.

export RUSTFLAGS="-C target-cpu=native"

Сборка автономных исполняемых файлов

Требования:

  • Docker
./build/build-release

Затем sslocal, ssserver, ssmanager, ssservice и ssurl будут упакованы в

  • ./build/shadowsocks-${VERSION}-stable.x86_64-unknown-linux-musl.tar.xz
  • ./build/shadowsocks-${VERSION}-stable.x86_64-pc-windows-gnu.zip

Подробности читайте в Cargo.toml.

Для Linux с низкими версиями GLIBC установите CROSS_CONFIG на образ на базе CentOS:

export CROSS_CONFIG=Cross-centos.toml

Начало работы

Сгенерируйте безопасный и защищенный пароль для конкретного метода шифрования (в примере aes-128-gcm) с помощью:

ssservice genkey -m "aes-128-gcm"

Создайте файл конфигурации ShadowSocks. Пример

{
    "server": "my_server_ip",
    "server_port": 8388,
    "password": "rwQc8qPXVsRpGx3uW+Y3Lj4Y42yF9Bs0xg1pmx8/+bo=",
    "method": "aes-256-gcm",
    // ONLY FOR `sslocal`
    // Delete these lines if you are running `ssserver` or `ssmanager`
    "local_address": "127.0.0.1",
    "local_port": 1080
}

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

:warning: Для установок через snap файл конфигурации, вероятно, находится в /var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json (см. https://github.com/shadowsocks/shadowsocks-rust/issues/621 / https://github.com/shadowsocks/shadowsocks-rust/issues/1146)

В shadowsocks-rust у нас также есть расширенный формат файла конфигурации, который позволяет определить более одного сервера. Вы также можете отключить отдельные серверы.

{
    "servers": [
        {
            "server": "127.0.0.1",
            "server_port": 8388,
            "password": "rwQc8qPXVsRpGx3uW+Y3Lj4Y42yF9Bs0xg1pmx8/+bo=",
            "method": "aes-256-gcm",
            "timeout": 7200
        },
        {
            "server": "127.0.0.1",
            "server_port": 8389,
            "password": "/dliNXn5V4jg6vBW4MnC1I8Jljg9x7vSihmk6UZpRBM=",
            "method": "chacha20-ietf-poly1305"
        },
        {
            "disabled": true,
            "server": "eg.disable.me",
            "server_port": 8390,
            "password": "mGvbWWay8ueP9IHnV5F1uWGN2BRToiVCAWJmWOTLU24=",
            "method": "chacha20-ietf-poly1305"
        }
    ],
    // ONLY FOR `sslocal`
    // Delete these lines if you are running `ssserver` or `ssmanager`
    "local_port": 1080,
    "local_address": "127.0.0.1"
}

sslocal автоматически выбирает лучший сервер с наименьшей задержкой и наибольшей доступностью.

Запустите клиент и сервер Shadowsocks с помощью:

sslocal -c config.json
ssserver -c config.json

Если вы собрали его с помощью Cargo:

cargo run --bin sslocal -- -c config.json
cargo run --bin ssserver -- -c config.json

Выведите все доступные аргументы с -h.

Использование

Запуск локального клиента с файлом конфигурации

# Read local client configuration from file
sslocal -c /path/to/shadowsocks.json

sslocal также поддерживает маршрутизацию исходящих TCP-соединений через прокси или цепочку прокси к серверу Shadowsocks с помощью ключа конфигурации outbound_proxy. Поддерживаемые типы хопов: socks5://, http:// и https:// с необязательными учетными данными user:pass@. Эта опция в настоящее время доступна через файл конфигурации для sslocal; ssserver поддерживает как файл конфигурации, так и многократные флаги командной строки --outbound-proxy.

{
    "server": "server.example.com",
    "server_port": 8388,
    "password": "hello-kitty",
    "method": "aes-256-gcm",
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "outbound_proxy": [
        "socks5://user:pass@127.0.0.1:1080",
        "https://proxy.example.com:443",
        "http://127.0.0.1:1081"
    ]
}

Локальный клиент Socks5

# Pass all parameters via command line
sslocal -b "127.0.0.1:1080" -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --plugin "v2ray-plugin" --plugin-opts "server;tls;host=github.com"

# Pass server with SIP002 URL
sslocal -b "127.0.0.1:1080" --server-url "ss://YWVzLTI1Ni1nY206cGFzc3dvcmQ@127.0.0.1:8388/?plugin=v2ray-plugin%3Bserver%3Btls%3Bhost%3Dgithub.com"

Локальный клиент HTTP

sslocal -b "127.0.0.1:3128" --protocol http -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty"

Все параметры аналогичны клиенту Socks5, за исключением --protocol http.

Локальный клиент-туннель

# Set 127.0.0.1:8080 as the target for forwarding to
sslocal --protocol tunnel -b "127.0.0.1:3128" -f "127.0.0.1:8080" -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty"
  • --protocol tunnel включает режим туннеля для локального клиента
  • -f "127.0.0.1:8080 устанавливает целевой адрес туннеля

Локальный клиент прозрачного прокси

ПРИМЕЧАНИЕ: В настоящее время он поддерживает только

  • Linux (с целями iptables REDIRECT и TPROXY)
  • BSD (с pf), такие как OS X 10.10+, FreeBSD и т.д.
sslocal -b "127.0.0.1:60080" --protocol redir -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --tcp-redir "redirect" --udp-redir "tproxy"

Перенаправляет соединения с помощью конфигураций iptables на порт, который слушает sslocal.

  • --protocol redir включает режим Redir для локального клиента
  • (необязательно) --tcp-redir устанавливает режим TCP в REDIRECT (Linux)
  • (необязательно) --udp-redir устанавливает режим UDP в TPROXY (Linux)

Пример iptables для Linux

Прозрачное перенаправление iptables должно указывать на слушатель redir. Не перенаправляйте трафик на слушатель socks или http, потому что REDIRECT/TPROXY отправляет исходный поток TCP/UDP без рукопожатия SOCKS или запроса CONNECT HTTP. Используйте --protocol socks или --protocol http только для приложений, которые могут напрямую работать с этими протоколами прокси.

Для минимальной настройки только TCP на локальной машине:

# Start sslocal in redir mode. The fwmark lets iptables skip sslocal's own
# outbound connection to the Shadowsocks server and avoid a proxy loop.
sudo sslocal -b "127.0.0.1:60080" --protocol redir \
    -s "server.example.com:8388" -m "aes-256-gcm" -k "hello-kitty" \
    --tcp-redir "redirect" --outbound-fwmark 255

# Redirect locally generated TCP connections to sslocal.
sudo iptables -t nat -N shadowsocks-redir
for addr in 0/8 10/8 100.64/10 127/8 169.254/16 172.16/12 192.168/16 224/4 240/4; do
    sudo iptables -t nat -A shadowsocks-redir -d "$addr" -j RETURN
done
sudo iptables -t nat -A shadowsocks-redir -m mark --mark 0xff/0xff -j RETURN
sudo iptables -t nat -A shadowsocks-redir -p tcp -j REDIRECT --to-ports 60080
sudo iptables -t nat -A OUTPUT -p tcp -j shadowsocks-redir

Для TCP+UDP, шлюза LAN, IPv6 или маршрутизации на основе ipset адаптируйте примеры в configs/iptables_mixed.sh или configs/iptables_tproxy.sh и запускайте sslocal с --tcp-redir "tproxy" --udp-redir "tproxy".

Если сам сервер Shadowsocks должен быть доступен через HTTP или SOCKS прокси, объедините режим redir с опцией конфигурации outbound_proxy. Это маршрутизирует исходящее TCP-соединение sslocal через этот прокси; трафик UDP не проксируется через outbound_proxy.

Клиент с интерфейсом Tun

ПРИМЕЧАНИЕ: В настоящее время он поддерживает только

  • Linux, Android
  • macOS, iOS
  • Windows

Linux

Создайте интерфейс Tun с именем tun0

ip tuntap add mode tun tun0
ifconfig tun0 inet 10.255.0.1 netmask 255.255.255.0 up

Запустите sslocal с --protocol tun и привяжитесь к tun0

sslocal --protocol tun -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --outbound-bind-interface lo0 --tun-interface-name tun0

macOS

sslocal --protocol tun -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --outbound-bind-interface lo0 --tun-interface-address 10.255.0.1/24

Это создаст интерфейс Tun с адресом 10.255.0.1 и маской подсети 255.255.255.0.

Windows

Скачайте wintun.dll с Wintun и поместите его в папку с исполняемыми файлами shadowsocks или в системный PATH.

sslocal --protocol tun -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --outbound-bind-interface "Ethernet 0" --tun-interface-name "shadowsocks"

Локальный клиент для службы Windows

Соберите его, включив --features "winservice" (не включено в сборку по умолчанию):

cargo build --release --bin "sswinservice" --features "winservice"

Установите его как службу Windows (PowerShell):

New-Service -Name "shadowsocks-local-service" `
            -DisplayName "Shadowsocks Local Service" `
            -BinaryPathName "<Path\to>\sswinservice.exe local -c <Path\to>\local_config.json"

Есть другие способы установить sswinservice как службу Windows, например, команда sc.

Как вы могли заметить, -BinaryPathName содержит не только sswinservice.exe, но и local -c local_config.json. Эти параметры командной строки будут использоваться как параметры по умолчанию при запуске службы Windows. Вы также можете запустить службу с настроенными параметрами.

Узнайте больше в документации Microsoft.

Параметры sswinservice работают точно так же, как и у ssservice. Он поддерживает подкоманды local, server и manager.

Сервер

# Read server configuration from file
ssserver -c /path/to/shadowsocks.json

# Pass all parameters via command line
ssserver -s "[::]:8388" -m "aes-256-gcm" -k "hello-kitty" --plugin "v2ray-plugin" --plugin-opts "server;tls;host=github.com"

# Route outbound TCP traffic through a proxy chain
ssserver -s "[::]:8388" -m "aes-256-gcm" -k "hello-kitty" \
  --outbound-proxy socks5://user:pass@127.0.0.1:1080 \
  --outbound-proxy https://proxy.example.com:443 \
  --outbound-proxy http://127.0.0.1:1081

Повторяйте --outbound-proxy в порядке хопов. Однократное упражнение сохраняет предыдущее поведение одного хопа. Поддерживаемые типы хопов: socks5://, http:// и https://. Та же настройка outbound_proxy может также использоваться в файлах конфигурации как для sslocal, так и для ssserver, но трафик UDP не проксируется.

Менеджер серверов

Поддерживаемый API Управление несколькими пользователями:

  • add - Запускает экземпляр сервера
  • remove - Удаляет существующий экземпляр сервера
  • list - Выводит список всех текущих запущенных серверов
  • ping - Выводит статистические данные всех серверов

ПРИМЕЧАНИЕ: Команда stat не поддерживается. Потому что серверы работают в том же процессе, что и сам менеджер.

# Start it just with --manager-address command line parameter
ssmanager --manager-address "127.0.0.1:6100"

# For *nix system, manager can bind to unix socket address
ssmanager --manager-address "/tmp/shadowsocks-manager.sock"

# You can also provide a configuration file
#
# `manager_address` key must be provided in the configuration file
ssmanager -c /path/to/shadowsocks.json

# Create one server by UDP
echo 'add: {"server_port":8388,"password":"hello-kitty"}' | nc -u '127.0.0.1' '6100'

# Close one server by unix socket
echo 'remove: {"server_port":8388}' | nc -Uu '/tmp/shadowsocks-manager.sock'

Для интерфейса менеджера проверьте подробности в проекте shadowsocks-manager.

Пример конфигурации:

{
    // Required option
    // Address that ssmanager is listening on
    "manager_address": "127.0.0.1",
    "manager_port": 6100,

    // Or bind to a Unix Domain Socket
    "manager_address": "/tmp/shadowsocks-manager.sock",

    "servers": [
        // These servers will be started automatically when ssmanager is started
    ],

    // Outbound socket binds to this IP address
    // For choosing different network interface on the same machine
    "local_address": "xxx.xxx.xxx.xxx",

    // Other options that may be passed directly to new servers
}

Конфигурация

{
    // LOCAL: Listen address. This is exactly the same as `locals[0]`
    // SERVER: Bind address for remote sockets, mostly used for choosing interface
    //         Don't set it if you don't know what's this for.
    "local_address": "127.0.0.1",
    "local_port": 1080,

    // Extended multiple local configuration
    "locals": [
        {
            // Basic configuration, a SOCKS5 local server
            "local_address": "127.0.0.1",
            "local_port": 1080,
            // OPTIONAL. Setting the `mode` for this specific local server instance.
            // If not set, it will derive from the outer `mode`
            "mode": "tcp_and_udp",
            // OPTIONAL. Authentication configuration file
            // Configuration file document could be found in the next section.
            "socks5_auth_config_path": "/path/to/auth.json",
            // OPTIONAL. Instance specific ACL
            "acl": "/path/to/acl/file.acl",
            // OPTIONAL. macOS launchd activate socket
            "launchd_tcp_socket_name": "TCPListener",
            "launchd_udp_socket_name": "UDPListener"
        },
        {
            // SOCKS5, SOCKS4/4a local server
            "protocol": "socks",
            // Listen address
            "local_address": "127.0.0.1",
            "local_port": 1081,
            // OPTIONAL. Enables UDP relay
            "mode": "tcp_and_udp",
            // OPTIONAL. Customizing the UDP's binding address. Depending on `mode`, if
            // - TCP is enabled, then SOCKS5's UDP Association command will return this address
            // - UDP is enabled, then SOCKS5's UDP server will listen to this address.
            "local_udp_address": "127.0.0.1",
            "local_udp_port": 2081,
            // OPTIONAL. macOS launchd activate socket
            "launchd_tcp_socket_name": "TCPListener",
            "launchd_udp_socket_name": "UDPListener"
        },
        {
            // Tunnel local server (feature = "local-tunnel")
            "protocol": "tunnel",
            // Listen address
            "local_address": "127.0.0.1",
            "local_port": 5353,
            // Forward address, the target of this tunnel
            // In this example, this will build a `127.0.0.1:5353` -> `8.8.8.8:53` tunnel
            "forward_address": "8.8.8.8",
            "forward_port": 53,
            // OPTIONAL. Customizing whether to start TCP and UDP tunnel
            "mode": "tcp_only",
            // OPTIONAL. macOS launchd activate socket
            "launchd_tcp_socket_name": "TCPListener",
            "launchd_udp_socket_name": "UDPListener"
        },
        {
            // HTTP local server (feature = "local-http")
            "protocol": "http",
            // Listen address
            "local_address": "127.0.0.1",
            "local_port": 3128,
            // OPTIONAL. macOS launchd activate socket
            "launchd_tcp_socket_name": "TCPListener",
            // OPTIONAL. Authentication configuration file
            // Configuration file document could be found in the next section.
            "http_auth_config_path": "/path/to/auth.json",
        },
        {
            // DNS local server (feature = "local-dns")
            // This DNS works like China-DNS, it will send requests to `local_dns` and `remote_dns` and choose by ACL rules
            "protocol": "dns",
            // Listen address
            "local_address": "127.0.0.1",
            "local_port": 53,
            // OPTIONAL. DNS local server uses `tcp_and_udp` mode by default
            "mode": "udp_only",
            // Local DNS address, DNS queries will be sent directly to this address
            "local_dns_address": "114.114.114.114",
            // OPTIONAL. Local DNS's port, 53 by default
            "local_dns_port": 53,
            // Remote DNS address, DNS queries will be sent through ssserver to this address
            "remote_dns_address": "8.8.8.8",
            // OPTIONAL. Remote DNS's port, 53 by default
            "remote_dns_port": 53,
            // OPTIONAL. dns client cache size for fetching dns queries.
            "client_cache_size": 5,
            // OPTIONAL. macOS launchd activate socket
            "launchd_tcp_socket_name": "TCPListener",
            "launchd_udp_socket_name": "UDPListener"
        },
        {
            // Tun local server (feature = "local-tun")
            "protocol": "tun",
            // Tun interface name
            "tun_interface_name": "tun0",
            // Tun interface address
            //
            // It has to be a host address in CIDR form
            "tun_interface_address": "10.255.0.1/24"
        },
        {
            // Transparent Proxy (redir) local server (feature = "local-redir")
            "protocol": "redir",
            // OPTIONAL: TCP type, may be different between platforms
            // Linux/Android: redirect (default), tproxy
            // FreeBSD/OpenBSD: pf (default), ipfw
            // NetBSD/macOS/Solaris: pf (default), ipfw
            "tcp_redir": "tproxy",
            // OPTIONAL: UDP type, may be different between platforms
            // Linux/Android: tproxy (default)
            // FreeBSD/OpenBSD: pf (default)
            "udp_redir": "tproxy"
        },
        {
            // FakeDNS local server (feature = "local-fake-dns")
            // FakeDNS is a DNS server that allocates an IPv4 / IPv6 address in a specific pool for each queries.
            // Subsequence requests from the other local interfaces that the target addresses includes those allocated IP addresses,
            // will be substituted back to their original domain name addresses.
            // This feature is useful mostly for transparent proxy, which will allow the proxied domain names to be resolved remotely.
            "protocol": "fake-dns",
            // Listen address
            "local_address": "127.0.0.1",
            "local_port": 10053,
            // IPv4 address pool (for A records)
            "fake_dns_ipv4_network": "10.255.0.0/16",
            // IPv6 address pool (for AAAA records)
            "fake_dns_ipv6_network": "fdf2:e786:ab40:9d2f::/64",
            // Persistent storage for all allocated DNS records
            "fake_dns_database_path": "/var/shadowsocks/fakedns.db",
            // OPTIONAL: Record expire duration in seconds, 10s by default
            "fake_dns_record_expire_duration": 10
        }
    ],

    // Server configuration
    // listen on :: for dual stack support, no need add [] around.
    "server": "::",
    // Change to use your custom port number
    "server_port": 8388,
    "method": "aes-256-gcm",
    "password": "your-password",
    "plugin": "v2ray-plugin",
    "plugin_opts": "mode=quic;host=github.com",
    "plugin_args": [
        // Each line is an argument passed to "plugin"
        "--verbose"
    ],
    "plugin_mode": "tcp_and_udp", // SIP003u, default is "tcp_only"
    // Server: TCP socket timeout in seconds.
    // Client: TCP connection timeout in seconds.
    // Omit this field if you don't have specific needs.
    "timeout": 7200,

    // Extended multiple server configuration
    // LOCAL: Choosing the best server to connect dynamically
    // SERVER: Creating multiple servers in one process
    "servers": [
        {
            // Fields are the same as the single server's configuration

            // Individual servers can be disabled
            // "disabled": true,
            "address": "0.0.0.0",
            "port": 8389,
            "method": "aes-256-gcm",
            "password": "your-password",
            "plugin": "...",
            "plugin_opts": "...",
            "plugin_args": [],
            "plugin_mode": "...",
            "timeout": 7200,

            // Customized weight for local server's balancer
            //
            // Weight must be in [0, 1], default is 1.0.
            // The higher weight, the server may rank higher.
            "tcp_weight": 1.0,
            "udp_weight": 1.0,

            // OPTIONAL. Instance specific ACL
            "acl": "/path/to/acl/file.acl",
        },
        {
            // Same key as basic format "server" and "server_port"
            "server": "0.0.0.0",
            "server_port": 8388,
            "method": "chacha20-ietf-poly1305",
            // Read the actual password from environment variable PASSWORD_FROM_ENV
            "password": "${PASSWORD_FROM_ENV}"
        },
        {
            // AEAD-2022
            "server": "::",
            "server_port": 8390,
            "method": "2022-blake3-aes-256-gcm",
            "password": "3SYJ/f8nmVuzKvKglykRQDSgg10e/ADilkdRWrrY9HU=",
            // For Server (OPTIONAL)
            // Support multiple users with Extensible Identity Header
            // https://github.com/Shadowsocks-NET/shadowsocks-specs/blob/main/2022-2-shadowsocks-2022-extensible-identity-headers.md
            "users": [
                {
                    "name": "username",
                    // User's password must have the same length as server's password
                    "password": "4w0GKJ9U3Ox7CIXGU4A3LDQAqP6qrp/tUi/ilpOR9p4="
                }
            ],
            // For Client (OPTIONAL)
            // If EIH enabled, then "password" should have the following format: iPSK:iPSK:iPSK:uPSK
            // - iPSK is one of the middle relay servers' PSK, for the last `ssserver`, it must be server's PSK ("password")
            // - uPSK is the user's PSK ("password")
            // Example:
            // "password": "3SYJ/f8nmVuzKvKglykRQDSgg10e/ADilkdRWrrY9HU=:4w0GKJ9U3Ox7CIXGU4A3LDQAqP6qrp/tUi/ilpOR9p4="
        },
        {
            "...": "Any other fields",

            // Some optional fields for this specific server

            // Outbound socket options
            // Linux Only (SO_MARK)
            "outbound_fwmark": 255,
            // FreeBSD only (SO_USER_COOKIE)
            "outbound_user_cookie": 255,
            // `SO_BINDTODEVICE` (Linux), `IP_BOUND_IF` (BSD), `IP_UNICAST_IF` (Windows) socket option for outbound sockets
            "outbound_bind_interface": "eth1",
            // Outbound socket bind() to this IP (choose a specific interface)
            "outbound_bind_addr": "11.22.33.44",
            // Outbound UDP socket allows IP fragmentation (default false)
            "outbound_udp_allow_fragmentation": false,
            // Route outbound TCP connections through a proxy or proxy chain
            // (TCP only; UDP is not proxied)
            // Works for both sslocal and ssserver
            // sslocal: configure in JSON; ssserver: JSON or repeated --outbound-proxy
            // Single hop:
            "outbound_proxy": "socks5://127.0.0.1:1080",
            // Single hop with username/password:
            // "outbound_proxy": "socks5://user:pass@127.0.0.1:1080",
            // Multi-hop:
            // "outbound_proxy": [
            //     "socks5://user:pass@127.0.0.1:1080",
            //     "https://proxy.example.com:443",
            //     "http://127.0.0.1:1081"
            // ],
        }
    ],

    // Global configurations for UDP associations
    "udp_timeout": 300, // Timeout for UDP associations (in seconds), 5 minutes by default
    "udp_max_associations": 512, // Maximum UDP associations to be kept in one server, unlimited by default

    // Options for Manager
    "manager_address": "127.0.0.1", // Could be a path to UNIX socket, /tmp/shadowsocks-manager.sock
    "manager_port": 5300, // Not needed for UNIX socket

    // DNS server's address for resolving domain names
    // For *NIX and Windows, it uses system's configuration by default
    //
    // Value could be IP address of DNS server, for example, "8.8.8.8".
    // DNS client will automatically request port 53 with both TCP and UDP protocol.
    //
    // - system, uses system provided API (`getaddrinfo` on *NIX)
    //
    // It also allows some pre-defined well-known public DNS servers:
    // - google (TCP, UDP)
    // - cloudflare (TCP, UDP)
    // - cloudflare_tls (TLS), enable by feature "dns-over-tls"
    // - cloudflare_https (HTTPS), enable by feature "dns-over-https"
    // - quad9 (TCP, UDP)
    // - quad9_tls (TLS), enable by feature "dns-over-tls"
    //
    // The field is only effective if feature "hickory-dns" is enabled.
    "dns": "google",
    // Configure `cache_size` for "hickory-dns" ResolverOpts. Set to "0" to disable DNS cache.
    "dns_cache_size": 0,

    // Mode, could be one of the
    // - tcp_only
    // - tcp_and_udp
    // - udp_only
    "mode": "tcp_only",

    // TCP_NODELAY
    "no_delay": false,

    // Enables `SO_KEEPALIVE` and set `TCP_KEEPIDLE`, `TCP_KEEPINTVL` to the specified seconds
    "keep_alive": 15,

    // Soft and Hard limit of file descriptors on *NIX systems
    "nofile": 10240,

    // Try to resolve domain name to IPv6 (AAAA) addresses first
    "ipv6_first": false,
    // Set IPV6_V6ONLY for all IPv6 listener sockets
    // Only valid for locals and servers listening on `::`
    "ipv6_only": false,

    // Outbound socket options
    // Linux Only (SO_MARK)
    "outbound_fwmark": 255,
    // FreeBSD only (SO_USER_COOKIE)
    "outbound_user_cookie": 255,
    // `SO_BINDTODEVICE` (Linux), `IP_BOUND_IF` (BSD), `IP_UNICAST_IF` (Windows) socket option for outbound sockets
    "outbound_bind_interface": "eth1",
    // Outbound socket bind() to this IP (choose a specific interface)
    "outbound_bind_addr": "11.22.33.44",
    // Outbound UDP socket allows IP fragmentation (default false)
    "outbound_udp_allow_fragmentation": false,
    // Route outbound TCP connections through a proxy or proxy chain
    // (TCP only; UDP is not proxied)
    // Works for both sslocal and ssserver
    // sslocal: configure in JSON; ssserver: JSON or repeated --outbound-proxy
    // Single hop:
    "outbound_proxy": "socks5://127.0.0.1:1080",
    // Single hop with username/password:
    // "outbound_proxy": "socks5://user:pass@127.0.0.1:1080",
    // Multi-hop:
    // "outbound_proxy": [
    //     "socks5://user:pass@127.0.0.1:1080",
    //     "https://proxy.example.com:443",
    //     "http://127.0.0.1:1081"
    // ],

    // Balancer customization
    "balancer": {
        // MAX Round-Trip-Time (RTT) of servers
        // The timeout seconds of each individual checks
        "max_server_rtt": 5,
        // Interval seconds between each check
        "check_interval": 10,
        // Interval seconds between each check for the best server
        // Optional. Specify to enable shorter checking interval for the best server only.
        "check_best_interval": 5
    },

    // SIP008 Online Configuration Delivery
    // https://shadowsocks.org/doc/sip008.html
    "online_config": {
        "config_url": "https://path-to-online-sip008-configuration",
        // Optional. Seconds between each update to config_url. Default to 3600s
        "update_interval": 3600,
        // Optional. Whitelist of plugins (RECOMMENDED for all users)
        // SECURITY: To avoid executing untrusted commands loaded from config_url
        "allowed_plugins": [
            "v2ray-plugin"
        ]
    },

    // Service configurations
    // Logger configuration
    "log": {
        // Default log level to use, if not overridden by `writers`, default is `0`
        // Equivalent to `-v` command line option
        "level": 1,
        // Default log format to use, if not overridden by `writers`
        "format": {
            // Euiqvalent to `--log-without-time`, default is `false`
            "without_time": false,
        },
        // Advanced logging configuration for configuring multiple writers
        // A console writer will be configured by default.
        // Set this to empty array `[]` to disable logging completely
        "writers": [
            {
                // Configure a console writer
                // The inner fields are optional, if not set, it will use the default values
                // To minimally configure a console writer, simply write `"console": {}`.
                "console": {
                    "level": 2,
                    "format": {
                        "without_time": false,
                    }
                }
            },
            {
                // Configure a file writer, useful when running as a Windows Service
                "file": {
                    // `level` and `format` can also be set here, if not set, it will use the default values

                    // Required. Directory to store log files
                    "directory": "/var/log/shadowsocks-rust",
                    // Optional. Log rotation frequency, must be one of the following:
                    // - never (default): This will result in log file located at `directory/prefix.suffix`
                    // - daily: A new log file in the format of `directory/prefix.yyyy-MM-dd.suffix` will be created daily
                    // - hourly: A new log file in the format of `directory/prefix.yyyy-MM-dd-HH.suffix` will be created hourly
                    "rotation": "never",
                    // Optional. Prefix of log file, default is one of `sslocal`, `ssserver`, `ssmanager` depending on the service being run.
                    "prefix": "shadowsocks-rust",
                    // Optional. Suffix of log file, default is `log`
                    "suffix": "log",
                    // Optional. If set, keeps the last N log files
                    "max_files": 5
                }
            },
            {
                // Configure a syslog writer, only supported on *nix system
                "syslog": {
                    // `level` and `format` can also be set here, if not set, it will use the default values

                    // Optional. Set the "identity" when calling openlog(). Use current service name by default.
                    "identity": "identity_name",
                    // Optional. Set the "facility" when calling openlog(). 1 (user-level messages) by default. See RFC5424.
                    "facility": 1
                }
            }
        ]
    },
    // Runtime configuration
    "runtime": {
        // `single_thread` or `multi_thread`
        "mode": "multi_thread",
        // Worker threads that are used in multi-thread runtime
        "worker_count": 10
    }
}

Конфигурация аутентификации SOCKS5

Файл конфигурации задается через socks5_auth_config_path в locals.

{
    // Password/Username Authentication (RFC1929)
    "password": {
        "users": [
            {
                "user_name": "USERNAME in UTF-8",
                "password": "PASSWORD in UTF-8"
            }
        ]
    }
}

Конфигурация аутентификации HTTP

Файл конфигурации задается через http_auth_config_path в locals.

{
    // Basic Authentication (RFC9110)
    "basic": {
        "users": [
            {
                "user_name": "USERNAME in UTF-8",
                "password": "PASSWORD in UTF-8"
            }
        ]
    }
}

Переменные окружения

  • SS_SERVER_PASSWORD: Пароль по умолчанию для серверов, созданных из аргументов командной строки (--server-addr)
  • SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN: "system" - принудительно использовать встроенный системный резолвер (getaddrinfo в *NIX)

Поддерживаемые шифры

Шифры AEAD 2022

  • 2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm
  • 2022-blake3-chacha20-poly1305, 2022-blake3-chacha8-poly1305 Эти шифры требуют, чтобы "password" был строкой Base64 ключа, имеющего точно такую же длину, как и размер ключа шифра. Рекомендуется использовать команду ssservice genkey -m "METHOD_NAME" для генерации безопасного и надежного ключа.

AEAD-шифры

  • chacha20-ietf-poly1305
  • aes-128-gcm, aes-256-gcm

Потоковые шифры

  • plain или none (Без шифрования, используется только для отладки или с плагинами, обеспечивающими безопасность транспорта)

Устаревшие

  • table
  • aes-128-cfb, aes-128-cfb1, aes-128-cfb8, aes-128-cfb128
  • aes-192-cfb, aes-192-cfb1, aes-192-cfb8, aes-192-cfb128
  • aes-256-cfb, aes-256-cfb1, aes-256-cfb8, aes-256-cfb128
  • aes-128-ctr
  • aes-192-ctr
  • aes-256-ctr
  • camellia-128-cfb, camellia-128-cfb1, camellia-128-cfb8, camellia-128-cfb128
  • camellia-192-cfb, camellia-192-cfb1, camellia-192-cfb8, camellia-192-cfb128
  • camellia-256-cfb, camellia-256-cfb1, camellia-256-cfb8, camellia-256-cfb128
  • rc4-md5
  • chacha20-ietf

ACL

sslocal, ssserver и ssmanager поддерживают файл ACL с синтаксисом, аналогичным shadowsocks-libev. Некоторые примеры можно найти здесь.

Доступные секции

  • Для локальных серверов (sslocal, ssredir, ...)
  • Режимы:
    • [bypass_all] - ACL работает в режиме WhiteList. Все адреса обходятся, кроме тех, которые соответствуют каким-либо правилам.
    • [proxy_all] - ACL работает в режиме BlackList. Все адреса проксируются, кроме тех, которые соответствуют каким-либо правилам. (по умолчанию)
  • Правила:
    • [bypass_list] - Правила для прямого подключения
    • [proxy_list] - Правила для подключения через прокси
  • Для удаленных серверов (ssserver)
  • Режимы:
    • [reject_all] - ACL работает в режиме WhiteList. Все клиенты отклоняются, кроме тех, которые соответствуют каким-либо правилам.
    • [accept_all] - ACL работает в режиме BlackList. Все клиенты принимаются, кроме тех, которые соответствуют каким-либо правилам. (по умолчанию)
    • [outbound_block_all] - Исходящий ACL работает в режиме WhiteList. Все исходящие адреса блокируются, кроме тех, которые соответствуют каким-либо правилам.
    • [outbound_allow_all] - Исходящий ACL работает в режиме BlackList. Все исходящие адреса разрешаются, кроме тех, которые соответствуют каким-либо правилам. (по умолчанию)
  • Правила:
    • [white_list] - Правила для принимаемых клиентов
    • [black_list] - Правила для отклоняемых клиентов
    • [outbound_block_list] - Правила для блокировки исходящих адресов.
    • [outbound_allow_list] - Правила для разрешения исходящих адресов.

Пример

# SERVERS
# For ssserver, accepts requests from all clients by default
[accept_all]

# Blocks these clients
[black_list]
1.2.3.4
127.0.0.1/8

# Disallow these outbound addresses
[outbound_block_list]
127.0.0.1/8
::1
# Using regular expression
^[a-z]{5}\.baidu\.com
# Match exactly

|baidu.com
# Match with subdomains

||google.com
# An internationalized domain name should be converted to punycode
# |☃-⌘.com - WRONG

|xn----dqo34k.com
# ||джpумлатест.bрфa - WRONG

||xn--p-8sbkgc5ag7bhce.xn--ba-lmcq

# CLIENTS
# For sslocal, ..., bypasses all targets by default
[bypass_all]

# Proxy these addresses
[proxy_list]

||google.com
8.8.8.8

Полезные инструменты

  1. ssurl используется для кодирования и декодирования URL ShadowSocks (SIP002). Пример:

plain ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ@127.0.0.1:8388/?plugin=obfs-local%3Bobfs%3Dhttp%3Bobfs-host%3Dwww.baidu.com

Примечания

Поддерживаются следующие функции:

  • [x] Команда SOCKS5 CONNECT
  • [x] Команда SOCKS5 UDP ASSOCIATE (частично)
  • [x] Команда SOCKS4/4a CONNECT
  • [x] Различные алгоритмы шифрования
  • [x] Балансировка нагрузки (несколько серверов) и проверка задержки сервера
  • [x] SIP004 AEAD-шифры
  • [x] SIP003 Плагины
  • [x] SIP003u Плагины с поддержкой UDP
  • [x] SIP002 Расширенные URL
  • [x] SIP022 AEAD-шифры 2022
  • [x] Поддержка HTTP Proxy (RFC 7230 и CONNECT)
  • [x] Защита от повторных атак, shadowsocks/shadowsocks-org#44
  • [x] Manager API, поддержка Управления несколькими пользователями
  • [x] ACL (Список управления доступом)
  • [x] Поддержка протокола HTTP/HTTPS Proxy

TODO

  • [x] Документация
  • [x] Расширение формата конфигурации
  • [x] Улучшенный формат логов (ожидание нового официального лог-крейта)
  • [x] Поддержка большего количества шифров без зависимости от libcrypto (ожидание приемлемой реализации крипто-библиотеки для Rust)
  • [x] Поддержка Windows.
  • [x] Сборка со стабильным rustc ~~(блокируется crypto2)~~.
  • [x] Поддержка протокола HTTP Proxy
  • [x] AEAD-шифры. (предложено в SIP004, все еще обсуждается)
  • [x] Выбор сервера на основе задержки #152

Лицензия

Лицензия MIT (MIT)

Copyright (c) 2014 Y. T. CHUNG

Настоящим предоставляется разрешение любому лицу, получившую копию этого программного обеспечения и сопутствующей документации («Программное обеспечение»), использовать Программное обеспечение без ограничений, включая, без ограничений, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:

Указанное уведомление об авторских правах и уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КАКИЕ-ЛИБО ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В РЕЗУЛЬТАТЕ ДЕЙСТВИЙ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШУЮ ИЗ-ЗА ИЛИ СВЯЗАННУЮ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ.

Stargazers over time

Stargazers over time

Комментарии
Войдите, чтобы оставить комментарий