Top Related Projects
Bug-fix-only libev port of shadowsocks. Future development moved to shadowsocks-rust
An unidentifiable mechanism that helps you bypass GFW.
A platform for building proxies to bypass network restrictions.
Xray, Penetrates Everything. Also the best v2ray-core, with XTLS support. Fully compatible configuration.
Make a fortune quietly
Quick Overview
Shadowsocks-rust is a fast, secure, and reliable proxy software implementation written in Rust. It's a port of the original Shadowsocks project, designed to provide a censorship-circumvention tool that helps users bypass internet restrictions and enhance online privacy.
Pros
- High performance due to Rust's efficiency and low-level control
- Strong security features, including various encryption methods
- Cross-platform compatibility (Windows, macOS, Linux, etc.)
- Active development and community support
Cons
- Steeper learning curve compared to some other proxy solutions
- May require additional configuration for optimal performance
- Limited documentation for advanced features
- Potential legal concerns in some jurisdictions due to its nature as a circumvention tool
Getting Started
To get started with shadowsocks-rust:
- Install Rust and Cargo (Rust's package manager)
- Clone the repository:
git clone https://github.com/shadowsocks/shadowsocks-rust.git
- Build the project:
cd shadowsocks-rust cargo build --release
- Configure your server and client settings in JSON format
- Run the server:
./target/release/ssserver -c config.json
- Run the client:
./target/release/sslocal -c config.json
For detailed configuration options and usage instructions, refer to the project's documentation on GitHub.
Competitor Comparisons
Bug-fix-only libev port of shadowsocks. Future development moved to shadowsocks-rust
Pros of shadowsocks-libev
- Written in C, offering potentially better performance on low-end devices
- Longer development history, potentially more stable and battle-tested
- Wider platform support, including older systems and embedded devices
Cons of shadowsocks-libev
- Less memory-safe compared to Rust implementation
- Potentially more challenging to maintain and extend due to C codebase
- May require more effort to ensure security against vulnerabilities
Code Comparison
shadowsocks-libev (C):
static int create_and_bind(const char *host, const char *port,
int mptcp, int ipv6first)
{
struct addrinfo hints;
struct addrinfo *result, *rp, *ipv4v6bindall;
int s, listen_sock;
shadowsocks-rust (Rust):
pub fn create_and_bind(addr: &SocketAddr, opts: &ServerConfig) -> io::Result<TcpListener> {
let socket = match *addr {
SocketAddr::V4(..) => TcpSocket::new_v4()?,
SocketAddr::V6(..) => TcpSocket::new_v6()?,
};
The code snippets demonstrate the difference in language syntax and memory management approaches between C and Rust implementations. Rust offers more built-in safety features and a more modern syntax, while C provides lower-level control and potentially better performance in certain scenarios.
An unidentifiable mechanism that helps you bypass GFW.
Pros of Trojan
- Designed to mimic HTTPS traffic, making it harder to detect
- Simpler protocol design, potentially easier to implement and maintain
- Supports multiple users on a single port
Cons of Trojan
- Less flexible than Shadowsocks-rust in terms of encryption options
- May have lower performance due to TLS overhead
- Smaller community and ecosystem compared to Shadowsocks
Code Comparison
Trojan (C++):
void Session::start()
{
auto self = shared_from_this();
in_socket.async_read_some(boost::asio::buffer(in_read_buf, MAX_LENGTH),
[this, self](const boost::system::error_code error, size_t length) {
if (error) {
destroy();
return;
}
in_recv(length);
});
}
Shadowsocks-rust (Rust):
pub async fn run(self) -> io::Result<()> {
let (mut local_reader, mut local_writer) = self.stream.split();
let (mut remote_reader, mut remote_writer) = self.remote_addr.split();
let (l2r, r2l) = tokio::join!(
self.copy_encrypted(&mut local_reader, &mut remote_writer),
self.copy_decrypted(&mut remote_reader, &mut local_writer)
);
l2r?;
r2l?;
Ok(())
}
The code snippets show different approaches to handling network connections, with Trojan using C++ and Boost.Asio, while Shadowsocks-rust leverages Rust's async/await syntax for more concise and readable code.
A platform for building proxies to bypass network restrictions.
Pros of v2ray-core
- More versatile with support for multiple protocols and transport layers
- Advanced features like traffic obfuscation and routing capabilities
- Highly customizable configuration options
Cons of v2ray-core
- More complex setup and configuration process
- Higher resource consumption due to additional features
- Steeper learning curve for new users
Code Comparison
v2ray-core (Go):
type ServerConfig struct {
Inbound []*InboundDetourConfig `json:"inbound"`
Outbound []*OutboundDetourConfig `json:"outbound"`
// ... other fields
}
shadowsocks-rust (Rust):
pub struct ServerConfig {
pub addr: SocketAddr,
pub password: String,
pub method: CipherKind,
// ... other fields
}
The code snippets show that v2ray-core has a more complex configuration structure with separate inbound and outbound configurations, while shadowsocks-rust has a simpler, more straightforward configuration. This reflects the difference in complexity and feature set between the two projects.
v2ray-core offers more flexibility and advanced features, making it suitable for users who need fine-grained control over their proxy setup. On the other hand, shadowsocks-rust provides a simpler, more lightweight solution that may be easier to set up and use for basic proxy needs.
Xray, Penetrates Everything. Also the best v2ray-core, with XTLS support. Fully compatible configuration.
Pros of Xray-core
- More advanced features like VLESS protocol and XTLS
- Better performance and lower latency in some scenarios
- Supports a wider range of proxy protocols
Cons of Xray-core
- More complex configuration and setup
- Larger codebase, potentially harder to audit
- May be overkill for simple proxy needs
Code Comparison
Xray-core (Go):
type ServerConfig struct {
Address *Address
Port uint16
User []*User
Network []net.Network
}
Shadowsocks-rust (Rust):
pub struct ServerConfig {
pub addr: ServerAddr,
pub password: String,
pub method: CipherKind,
pub timeout: Option<Duration>,
}
Xray-core offers more configuration options and flexibility, while Shadowsocks-rust focuses on simplicity and core functionality. Xray-core's codebase is more extensive, reflecting its broader feature set, while Shadowsocks-rust maintains a leaner, more focused approach.
Both projects are actively maintained and have their strengths. Xray-core is better suited for users requiring advanced features and protocols, while Shadowsocks-rust is ideal for those seeking a straightforward, efficient proxy solution.
Make a fortune quietly
Pros of naiveproxy
- Built on Chromium's network stack, potentially offering better performance and stability
- Supports HTTPS/2 and QUIC protocols, providing enhanced security and speed
- Designed to be more resistant to detection and blocking
Cons of naiveproxy
- More complex setup and configuration compared to Shadowsocks-rust
- Larger resource footprint due to its Chromium-based architecture
- Less widespread adoption and community support
Code comparison
Shadowsocks-rust (server configuration):
let server = ServerConfig::new(
"127.0.0.1:8388".parse().unwrap(),
"password".to_string(),
CipherKind::AES_256_GCM,
);
naiveproxy (server configuration):
{
"listen": "http://127.0.0.1:8080",
"proxy": "https://example.com",
"users": [{"user": "username", "pass": "password"}]
}
Both projects aim to provide secure and efficient proxy solutions, but they differ in their approach and implementation. Shadowsocks-rust offers a lightweight and straightforward solution, while naiveproxy leverages Chromium's network stack for advanced features and potentially better performance. The choice between the two depends on specific requirements, such as ease of setup, protocol support, and resource availability.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
shadowsocks
This is a port of shadowsocks.
shadowsocks is a fast tunnel proxy that helps you bypass firewalls.
Library | Description |
---|---|
shadowsocks | shadowsocks core protocol |
shadowsocks-service | Services for serving shadowsocks |
shadowsocks-rust | Binaries running common shadowsocks services |
Related Projects:
- spyophobia/shadowsocks-gtk-rs A GUI on Linux for
sslocal
using GTK, discussion - honwen/openwrt-shadowsocks-rust OpenWRT solution for
sslocal
, discussion - cg31/shadowsocks-windows-gui-rust Windows GUI client, discussion
Build & Install
Optional Features
-
hickory-dns
- Useshickory-resolver
as DNS resolver instead oftokio
's builtin. -
local-http
- Allow using HTTP protocol forsslocal
-
local-http-native-tls
- Support HTTPS withnative-tls
-
local-http-rustls
- Support HTTPS withrustls
-
-
local-tunnel
- Allow using tunnel protocol forsslocal
-
local-socks4
- Allow using SOCKS4/4a protocol forsslocal
-
local-redir
- Allow using redir (transparent proxy) protocol forsslocal
-
local-dns
- Allow using dns protocol forsslocal
, serves as a DNS server proxying queries to local or remote DNS servers by ACL rules -
local-fake-dns
- FakeDNS, allocating an IP address for each individual Query from a specific IP pool -
local-tun
- TUN interface support forsslocal
-
local-online-config
- SIP008 Online Configuration Delivery -
stream-cipher
- Enable deprecated stream ciphers. WARN: stream ciphers are UNSAFE! -
aead-cipher-extra
- Enable non-standard AEAD ciphers -
aead-cipher-2022
- Enable AEAD-2022 ciphers (SIP022) -
aead-cipher-2022-extra
- Enable AEAD-2022 extra ciphers (non-standard ciphers)
Memory Allocators
This project uses system (libc) memory allocator (Rust's default). But it also allows you to use other famous allocators by features:
jemalloc
- Uses jemalloc as global memory allocatormimalloc
- Uses mi-malloc as global memory allocatortcmalloc
- Uses TCMalloc as global memory allocator. It tries to link system-wide tcmalloc by default, use vendored from source withtcmalloc-vendored
.snmalloc
- Uses snmalloc as global memory allocatorrpmalloc
- Uses rpmalloc as global memory allocator
crates.io
Install from crates.io:
# Install from crates.io
cargo install shadowsocks-rust
then you can find sslocal
and ssserver
in $CARGO_HOME/bin
.
Install using Homebrew
For macOS and Linux, you can install it using Homebrew:
brew install shadowsocks-rust
Install using 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
Download release
Download static-linked build here.
build-windows
: Build forx86_64-pc-windows-msvc
build-linux
: Build forx86_64-unknown-linux-gnu
, Debian 9 (Stretch), GLIBC 2.18build-docker
: Build forx86_64-unknown-linux-musl
,x86_64-pc-windows-gnu
, ... (statically linked)
Docker
This project provided Docker images for the linux/i386
and linux/amd64
and linux/arm64/v8
architectures.
:warning: Docker containers do not have access to IPv6 by default: Make sure to disable IPv6 Route in the client or enable IPv6 access to docker containers.
Pull from GitHub Container Registry
Docker will pull the image of the appropriate architecture from our GitHub Packages.
docker pull ghcr.io/shadowsocks/sslocal-rust:latest
docker pull ghcr.io/shadowsocks/ssserver-rust:latest
Build on the local machineï¼Optionalï¼
If you want to build the Docker image yourself, you need to use the 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 .
Run the container
You need to mount the configuration file into the container and create an external port map for the container to connect to it.
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
Deploy to Kubernetes
This project provided yaml manifests for deploying to Kubernetes.
You can leverage k8s Service to expose traffic outside, like LoadBalancer or NodePort which gains more fine-grained compared with fixed host or port.
For a more interesting use case, you can use a Ingress(Istio, nginx, etc.) which routes the matched traffic to shadowsocks along with the real web service.
Using kubectl
kubectl apply -f https://github.com/shadowsocks/shadowsocks-rust/raw/master/k8s/shadowsocks-rust.yaml
You can change the config via editing the ConfigMap named shadowsocks-rust
.
For more fine-grained control, use helm
.
Using helm
helm install my-release k8s/chart -f my-values.yaml
Below is the common default values you can change:
# 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"
Build from source
Use cargo to build. NOTE: RAM >= 2GiB
cargo build --release
Then sslocal
and ssserver
will appear in ./target/(debug|release)/
, it works similarly as the two binaries in the official ShadowSocks' implementation.
make install TARGET=release
Then sslocal
, ssserver
, ssmanager
and ssurl
will be installed to /usr/local/bin
(variable PREFIX).
For Windows users, if you have encountered any problem in building, check and discuss in #102.
target-cpu optimization
If you are building for your current CPU platform (for example, build and run on your personal computer), it is recommended to set target-cpu=native
feature to let rustc
generate and optimize code for the CPU running the compiler.
export RUSTFLAGS="-C target-cpu=native"
Build standalone binaries
Requirements:
- Docker
./build/build-release
Then sslocal
, ssserver
, ssmanager
and ssurl
will be packaged in
./build/shadowsocks-${VERSION}-stable.x86_64-unknown-linux-musl.tar.xz
./build/shadowsocks-${VERSION}-stable.x86_64-pc-windows-gnu.zip
Read Cargo.toml
for more details.
Getting Started
Generate a safe and secured password for a specific encryption method (aes-128-gcm
in the example) with:
ssservice genkey -m "aes-128-gcm"
Create a ShadowSocks' configuration file. Example
{
"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
}
Detailed explanation of the configuration file could be found in shadowsocks' documentation. (Link to original project, not maintained anymore !)
:warning: For snap installations, configuration file is most probably located in
/var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json
(see https://github.com/shadowsocks/shadowsocks-rust/issues/621 / https://github.com/shadowsocks/shadowsocks-rust/issues/1146)
In shadowsocks-rust, we also have an extended configuration file format, which is able to define more than one server. You can also disable individual servers.
{
"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
automatically selects the best server with the lowest latency and the highest availability.
Start Shadowsocks client and server with:
sslocal -c config.json
ssserver -c config.json
If you Build it with Cargo:
cargo run --bin sslocal -- -c config.json
cargo run --bin ssserver -- -c config.json
List all available arguments with -h
.
Usage
Start local client with configuration file
# Read local client configuration from file
sslocal -c /path/to/shadowsocks.json
Socks5 Local client
# 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 Local client
sslocal -b "127.0.0.1:3128" --protocol http -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty"
All parameters are the same as Socks5 client, except --protocol http
.
Tunnel Local client
# 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
enables local client Tunnel mode-f "127.0.0.1:8080
sets the tunnel target address
Transparent Proxy Local client
NOTE: It currently only supports
- Linux (with
iptables
targetsREDIRECT
andTPROXY
) - BSDs (with
pf
), such as 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"
Redirects connections with iptables
configurations to the port that sslocal
is listening on.
--protocol redir
enables local client Redir mode- (optional)
--tcp-redir
sets TCP mode toREDIRECT
(Linux) - (optional)
--udp-redir
sets UDP mode toTPROXY
(Linux)
Tun interface client
NOTE: It currently only supports
- Linux, Android
- macOS, iOS
- Windows
Linux
Create a Tun interface with name tun0
ip tuntap add mode tun tun0
ifconfig tun0 inet 10.255.0.1 netmask 255.255.255.0 up
Start sslocal
with --protocol tun
and binds to 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
It will create a Tun interface with address 10.255.0.1
and netmask 255.255.255.0
.
Windows
Download wintun.dll
from Wintun, and place it in the folder with shadowsocks' runnable binaries, or in the system PATH.
sslocal --protocol tun -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --outbound-bind-interface "Ethernet 0" --tun-interface-name "shadowsocks"
Local client for Windows Service
Compile it by enabling --features "winservice"
(not included in the default build):
cargo build --release --bin "sswinservice" --features "winservice"
Install it as a Windows Service (PowerShell):
New-Service -Name "shadowsocks-local-service" `
-DisplayName "Shadowsocks Local Service" `
-BinaryPathName "<Path\to>\sswinservice.exe local -c <Path\to>\local_config.json"
There are other ways to install sswinservice
as a Windows Service, for example, the sc
command.
As you may have noticed that the -BinaryPathName
contains not only just the sswinservice.exe
, but local -c local_config.json
. These command line parameters will be used as the default parameter when the Windows Service starts. You can also start the service with customized parameters.
Learn more from Microsoft's Document.
The sswinservice
's parameter works exactly the same as ssservice
. It supports local
, server
and manager
subcommands.
Server
# 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"
Server Manager
Supported Manage Multiple Users API:
add
- Starts a server instanceremove
- Deletes an existing server instancelist
- Lists all current running serversping
- Lists all servers' statistic data
NOTE: stat
command is not supported. Because servers are running in the same process with the manager itself.
# 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'
For manager UI, check more details in the shadowsocks-manager project.
Example configuration:
{
// 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
}
Configuration
{
// 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"
},
{
// 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="
}
],
// 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",
// 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
},
// Service configurations
// Logger configuration
"log": {
// Equivalent to `-v` command line option
"level": 1,
"format": {
// Euiqvalent to `--log-without-time`
"without_time": false,
},
// Equivalent to `--log-config`
// More detail could be found in https://crates.io/crates/log4rs
"config_path": "/path/to/log4rs/config.yaml"
},
// Runtime configuration
"runtime": {
// single_thread or multi_thread
"mode": "multi_thread",
// Worker threads that are used in multi-thread runtime
"worker_count": 10
}
}
SOCKS5 Authentication Configuration
The configuration file is set by socks5_auth_config_path
in locals
.
{
// Password/Username Authentication (RFC1929)
"password": {
"users": [
{
"user_name": "USERNAME in UTF-8",
"password": "PASSWORD in UTF-8"
}
]
}
}
Environment Variables
SS_SERVER_PASSWORD
: A default password for servers that created from command line argument (--server-addr
)SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN
:"system"
DNS resolver force use system's builtin (getaddrinfo
in *NIX)
Supported Ciphers
AEAD 2022 Ciphers
2022-blake3-aes-128-gcm
,2022-blake3-aes-256-gcm
2022-blake3-chacha20-poly1305
,2022-blake3-chacha8-poly1305
These Ciphers require "password"
to be a Base64 string of key that have exactly the same length of Cipher's Key Size. It is recommended to use ssservice genkey -m "METHOD_NAME"
to generate a secured and safe key.
AEAD Ciphers
chacha20-ietf-poly1305
aes-128-gcm
,aes-256-gcm
Stream Ciphers
plain
ornone
(No encryption, only used for debugging or with plugins that ensure transport security)
Deprecated
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
, and ssmanager
support ACL file with syntax like shadowsocks-libev. Some examples could be found in here.
Available sections
- For local servers (
sslocal
,ssredir
, ...)- Modes:
[bypass_all]
- ACL runs inBlackList
mode. Bypasses all addresses that didn't match any rules.[proxy_all]
- ACL runs inWhiteList
mode. Proxies all addresses that didn't match any rules.
- Rules:
[bypass_list]
- Rules for connecting directly[proxy_list]
- Rules for connecting through proxies
- Modes:
- For remote servers (
ssserver
)- Modes:
[reject_all]
- ACL runs inBlackList
mode. Rejects all clients that didn't match any rules.[accept_all]
- ACL runs inWhiteList
mode. Accepts all clients that didn't match any rules.
- Rules:
[white_list]
- Rules for accepted clients[black_list]
- Rules for rejected clients[outbound_block_list]
- Rules for blocking outbound addresses.
- Modes:
Example
# 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
Useful Tools
ssurl
is for encoding and decoding ShadowSocks URLs (SIP002). Example:
ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ@127.0.0.1:8388/?plugin=obfs-local%3Bobfs%3Dhttp%3Bobfs-host%3Dwww.baidu.com
Notes
It supports the following features:
- SOCKS5 CONNECT command
- SOCKS5 UDP ASSOCIATE command (partial)
- SOCKS4/4a CONNECT command
- Various crypto algorithms
- Load balancing (multiple servers) and server delay checking
- SIP004 AEAD ciphers
- SIP003 Plugins
- SIP003u Plugin with UDP support
- SIP002 Extension ss URLs
- SIP022 AEAD 2022 ciphers
- HTTP Proxy Supports (RFC 7230 and CONNECT)
- Defend against replay attacks, shadowsocks/shadowsocks-org#44
- Manager APIs, supporting Manage Multiple Users
- ACL (Access Control List)
- Support HTTP/HTTPS Proxy protocol
TODO
- Documentation
- Extend configuration format
- Improved logging format (waiting for the new official log crate)
- Support more ciphers without depending on
libcrypto
(waiting for an acceptable Rust crypto lib implementation) - Windows support.
- Build with stable
rustc
(blocking by.crypto2
) - Support HTTP Proxy protocol
- AEAD ciphers. (proposed in SIP004, still under discussion)
- Choose server based on delay #152
License
Copyright (c) 2014 Y. T. CHUNG
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Stargazers over time
Top Related Projects
Bug-fix-only libev port of shadowsocks. Future development moved to shadowsocks-rust
An unidentifiable mechanism that helps you bypass GFW.
A platform for building proxies to bypass network restrictions.
Xray, Penetrates Everything. Also the best v2ray-core, with XTLS support. Fully compatible configuration.
Make a fortune quietly
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot