UP | HOME

Shadowsocks

Table of Contents

1 简介

Shadowsocks 是由 clowwindy 编写的轻量级服务器中转包传输工具。

ShadowSocks 主要由三个模块组成:

  • ss-server:服务端。
  • ss-local:客户端,主要提供 sock5 代理。在 Linux 上,可以使用 ss-local + privoxy,来间接使用 ss-local 提供的 socks5 代理。privoxy 有一个 socks5 转发功能,也就是说,我们只要将 privoxy 当做普通 http 代理来使用就好了,它会自动使用 socks5 协议与后端的 ss-local 进行通信。
  • ss-redirect:shadowsocks-libev 提供的 socks5 透明代理工具。1

    正向代理 正向代理,即平常我们所说的代理,比如 http 代理、socks5 代理等,都属于正向代理。 正向代理的特点就是:如果需要使用正向代理访问互联网,就必须在客户端进行相应的代理设置。

    透明代理 透明代理和正向代理的作用是一样的,都是为了突破某些网络限制,访问网络资源。 但是透明代理对于客户端是透明的,客户端不需要进行相应的代理设置,就能使用透明代理访问互联网。

    反向代理 当然,这个不在本文的讨论范畴之内,不过既然提到了前两种代理,就顺便说说反向代理。 反向代理是针对服务端来说的,它的目的不是为了让我们突破互联网限制,而是为了实现负载均衡。

    举个栗子: ss-local,提供 socks5 正向代理,我们必须通过专业的代理软件来配置,才能使用它,不然是不会经过代理的; ss-redir,提供 socks5 透明代理,我们只要配置了适当的 iptables 规则,就可以不修改任何软件设置使用它。

  • ss-tunnel

    shadowsocks-libev 提供的本地端口转发工具,通常用于解决 dns 污染问题。

    假设 ss-tunnel 监听本地端口 53,转发的远程目的地为 8.8.8.8:53;系统 dns 为 127.0.0.1。 去程:上层应用请求 dns 解析 -> ss-tunnel 接收 -> ss 隧道 -> ss-server 接收 -> 8.8.8.8:53; 回程:8.8.8.8:53 响应 dns 请求 -> ss-server 接收 -> ss 隧道 -> ss-tunnel 接收 -> 上层应用。

传输的时候,本地网络客户端首先使用 SOCKS5 连接到 ss-local,这里面的流量传输都是明文的,然后 ss-local 将流量打包传输到 ss-server 上,这里的流量是加密的,然后 ss-server 解码 SOCKS5 数据包,访问目的服务器。

2 安装

sudo apt install -y shadowsocks-libev

3 ss-server

4 ss-local

ss-local -s <server-ip> -p 443 -l 1080 -k <passwd> -m chacha20-ietf-poly1305 --fastopen

5 基本配置

ss-server 与 ss-local 配置文件是 json 格式的,默认名字是 config.json,服务器和客户端配置差不多,甚至可以共用一份配置文件。

{
    "server":"server-ip",       // 服务端可写0.0.0.0
    "server_port":443,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"your-password",
    "timeout":300,
    "method":"rc4-md5",
    "fast_open":true,
}
Table 1: 配置的说明
Name Explaination
server the address your server listens(服务器 IP)
local_address the address your local listens(本地代理地址)
local_port local port(本地代理端口)
port_password password used for encryption(自己设定的服务器端口和密码,可以支持多个用户)
timeout in seconds(超时断开,以秒为单位)
method 加密方式
fast_open use TCP_FASTOPEN, true/false,如果客户端和服务器都是 on Linux 3.7+,可以开启 fast_open 来减少延迟。
workers number of workers, available on Unix/Linux(支持类似 nginx 一样使用多个子进程,这个只在 Unix 和 Linux 下有用,可不设置)

6 开机自启动

使用 systemd 控制启动:

6.1 ss-server

    [Unit]
    Description=ShadowSocks Server Daemon
    After=network.target

    [Service]
    User=root
    Group=root
    ExecStart=/usr/bin/ss-server -c /etc/ShadowSocks-libev/server.json
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=5s

    [Install]
    WantedBy=multi-user.target

执行以下命令启动服务,并设置开机启动

systemctl start ss-server.service
systemctl enable ss-server.service
systemctl status ss-server.service

6.2 ss-local

    [Unit]
    Description=ShadowSocks client daemon
    After=network.target

    [Service]
    User=root
    Group=root
    ExecStart=/usr/bin/ss-local -c  /etc/ShadowSocks-libev/local.json
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=5s

    [Install]
    WantedBy=multi-user.target
systemctl start ss-local.service
systemctl enable ss-local.service
systemctl status ss-local.service

7 多用户

当前,Python 和 Go 服务器支持多个用户。可以在不同的端口上使用不同的密码,如下所示:

{
    "server": "0.0.0.0",
    "port_password": {
        "8381": "foobar1",
        "8382": "foobar2",
        "8383": "foobar3",
        "8384": "foobar4"
    },
    "timeout": 300,
    "method": "aes-256-cfb"
}

8 优化2

Footnotes:

Author: 刘尚亮

Email: phenix3443@gmail.com

Created: 2020-07-07 二 12:50