Быстрейшая реализация протокола Shadowsocks на Rust с поддержкой AEAD-шифрования (AES-256-GCM, ChaCha20-Poly1305). Трафик выглядит как случайный поток байт — DPI-системы провайдера не могут идентифицировать протокол и заблокировать соединение. Режимы: sslocal (клиент, SOCKS5/HTTP), ssserver (сервер), ssmanager (управление пулом). Поддерживает плагины obfuscation (v2ray-plugin, obfs) для дополнительной маскировки. Используется для обхода GFW (Китай), СОРМ (Россия) и других систем глубокой инспекции пакетов.
# Установка
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.
shadowsocks — это быстрый туннельный прокси, который помогает обходить фаерволы.
| Библиотека | Описание |
|---|---|
| shadowsocks | |
| shadowsocks-service | |
| shadowsocks-rust |
Связанные проекты:
sslocal на Linux с использованием GTK, обсуждениеsslocal, обсуждение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:
# Install from crates.io
cargo install shadowsocks-rust
затем вы можете найти sslocal и ssserver в $CARGO_HOME/bin.
Для macOS и Linux вы можете установить его с помощью Homebrew:
brew install shadowsocks-rust
# 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.
Загрузите статически скомпонованные сборки здесь.
x86_64-apple-darwin, aarch64-apple-darwin собраны в образе github macos-latest. Информацию можно найти здесь.x86_64-pc-windows-msvc собран в образе github windows-latest. Информацию можно найти здесь.Этот проект предоставляет Docker-образы для архитектур linux/i386, linux/amd64 и linux/arm64/v8.
:warning: Контейнеры Docker по умолчанию не имеют доступа к IPv6: Убедитесь, что вы отключили маршрут IPv6 на клиенте или включили доступ IPv6 к docker-контейнерам.
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
В этом проекте предоставлены YAML-манифесты для развертывания в Kubernetes.
Вы можете использовать сервисы Kubernetes (Service) для вывода трафика наружу, например, LoadBalancer или NodePort, что обеспечивает более тонкую настройку по сравнению с фиксированным хостом или портом.
Для более интересного варианта использования вы можете использовать Ingress (Istio, nginx и т.д.), который маршрутизирует совпадающий трафик в Shadowsocks вместе с реальным веб-сервисом.
kubectlkubectl apply -f https://github.com/shadowsocks/shadowsocks-rust/raw/master/k8s/shadowsocks-rust.yaml
Вы можете изменить конфигурацию, отредактировав ConfigMap с именем shadowsocks-rust.
Для более тонкой настройки используйте helm.
helmhelm 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=native, чтобы rustc генерировал и оптимизировал код для ЦП, выполняющего компиляцию.
export RUSTFLAGS="-C target-cpu=native"
Требования:
./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"
]
}
# 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"
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 устанавливает целевой адрес туннеляПРИМЕЧАНИЕ: В настоящее время он поддерживает только
iptables REDIRECT и TPROXY)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 должно указывать на слушатель 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 с именем 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
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.
Скачайте 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"
Соберите его, включив --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_auth_config_path в locals.
{
// Password/Username Authentication (RFC1929)
"password": {
"users": [
{
"user_name": "USERNAME in UTF-8",
"password": "PASSWORD in UTF-8"
}
]
}
}
Файл конфигурации задается через 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)2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm2022-blake3-chacha20-poly1305, 2022-blake3-chacha8-poly1305
Эти шифры требуют, чтобы "password" был строкой Base64 ключа, имеющего точно такую же длину, как и размер ключа шифра. Рекомендуется использовать команду ssservice genkey -m "METHOD_NAME" для генерации безопасного и надежного ключа.chacha20-ietf-poly1305aes-128-gcm, aes-256-gcmplain или none (Без шифрования, используется только для отладки или с плагинами, обеспечивающими безопасность транспорта)Устаревшие
tableaes-128-cfb, aes-128-cfb1, aes-128-cfb8, aes-128-cfb128aes-192-cfb, aes-192-cfb1, aes-192-cfb8, aes-192-cfb128aes-256-cfb, aes-256-cfb1, aes-256-cfb8, aes-256-cfb128aes-128-ctraes-192-ctraes-256-ctrcamellia-128-cfb, camellia-128-cfb1, camellia-128-cfb8, camellia-128-cfb128camellia-192-cfb, camellia-192-cfb1, camellia-192-cfb8, camellia-192-cfb128camellia-256-cfb, camellia-256-cfb1, camellia-256-cfb8, camellia-256-cfb128rc4-md5chacha20-ietfsslocal, 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
ssurl используется для кодирования и декодирования URL ShadowSocks (SIP002). Пример:plain
ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ@127.0.0.1:8388/?plugin=obfs-local%3Bobfs%3Dhttp%3Bobfs-host%3Dwww.baidu.com
Поддерживаются следующие функции:
libcrypto (ожидание приемлемой реализации крипто-библиотеки для Rust)rustc ~~(блокируется crypto2)~~.Copyright (c) 2014 Y. T. CHUNG
Настоящим предоставляется разрешение любому лицу, получившую копию этого программного обеспечения и сопутствующей документации («Программное обеспечение»), использовать Программное обеспечение без ограничений, включая, без ограничений, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:
Указанное уведомление об авторских правах и уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КАКИЕ-ЛИБО ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В РЕЗУЛЬТАТЕ ДЕЙСТВИЙ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШУЮ ИЗ-ЗА ИЛИ СВЯЗАННУЮ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ.