Shadowsocks (简体中文) - ArchWiki

# Shadowsocks (简体中文)

From ArchWiki
翻译状态： 本文是英文页面 Shadowsocks 的翻译，最后翻译时间：2017-9-26，点击这里可以查看翻译后英文页面的改动。

Shadowsocks是一个轻量级socks5代理，最初用 Python 编写。

## 安装

可安装 shadowsocks-libev 或者 shadowsocks。

## 配置

shadowsocks以json为配置文件格式，以下是安装包中的样例：

    /etc/shadowsocks/config.json

    {
    	"server":"remote-shadowsocks-server-ip-addr",
    	"server_port":443,
    	"local_address":"127.0.0.1",
    	"local_port":1080,
    	"password":"your-passwd",
    	"timeout":300,
    	"method":"chacha20-ietf",
    	"fast_open":false,
    	"workers":1
    }

提示： shadowsocks: 若需同时指定多个服务端ip，使用如下例的语法`"server":["1.1.1.1","2.2.2.2"],`
提示： 要找出在你的机器上运行最快的方式，可以运行这个脚本

Name | Explanation
--- | ---
server | 服务端监听地址(IPv4或IPv6)
server_port | 服务端端口，一般为`443`
local_address | 本地监听地址，缺省为`127.0.0.1` 可用-b参数设置
local_port | 本地监听端口，一般为`1080`
password | 用以加密的密匙
timeout | 超时时间（秒）
method | 参阅 加密
fast_open | 是否启用TCP-Fast-Open
wokers | worker数量，如果不理解含义请不要改

### 客户端

#### 命令行

运行 `ss-local` 启动客户端；若需指定配置文件的位置：

    # sslocal -c /etc/shadowsocks/config.json

注意: 有用户报告无法成功在运行时加载`config.json`
，或可尝试手动运行：

    # sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法

配合nohup和&可以使之后台运行，关闭终端也不影响：

    #nohup sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法 &

增加 `-v` 参数获取详细log信息

#### 以守护进程形式运行客户端

注意: shadowsocks和shadowsocks-libev的systemd 系统单元使用相同的配置文件路径 （`/etc/shadowsocks`）

Shadowsocks的systemd服务可在`/etc/shadowsocks/`里调用不同的`conf-file.json`（以`conf-file`为区分标志），例： 在`/etc/shadowsocks/`中创建了`foo.json`配置文件，那么执行以下语句就可以调用该配置：

    # systemctl start shadowsocks@foo

若需开机自启动：

    # systemctl enable shadowsocks@foo

提示： 可用`journalctl -u shadowsocks@foo`来查询日志；

#### 图形界面客户端

安装 shadowsocks-qt5。

#### 配置代理

shadowsocks客户端启动后，其他程序并不会直接应用socks5连接，可使用以下方法对其进行配置。

- 全局代理

使用Iptables (简体中文)等工具，桌面环境用户可使用桌面设置中网络设置里的代理功能。

注意: 使用全局代理会使所有的连接通过shadowsocks服务器中转，一般不建议使用全局代理。

- 程序设置自身代理

不少程序都能在其设置中添加代理，只需要在其设置中找到网络相关配置，添加socks v5代理，参照本地配置文件中的ip和port填写即可（例如浏览器的配置可参考下文#浏览器配置）。

- 使用工具进行临时代理

例如proxychains-ng（参看Proxy settings#Using a SOCKS proxy）和redsocks-gitAUR。

- 转换为http代理

直接走socks代理有时未必是用户的期望，可使用privoxy等软件转化socks代理为http代理。可使用privoxy和squid。 以Privoxy为例，编辑privoxy配置文件，添加socks5转发（不要漏下1080后面的点)：

     forward-socks5 / 127.0.0.1:1080 .

默认监听的是本机的8188端口，即`localhost:8188`，可更改为监听其他端口，如

     listen-address  127.0.0.1:8010

提示： 如果希望网络上其他主机也能使用该privoxy配置，可以更改127.0.0.1为0.0.0.0或直接删除127.0.0.1。

使用systemd启动或重启`privoxy.service`服务，就可以使用了。假设转化后的http代理为127.0.0.1:8010，则在终端中启动（以启动chromium为例）：

     $ chromium %U --proxy-server=127.0.0.1:8010

##### 浏览器配置

提示： 浏览器直接使用SOCKS代理时，你可能需要使用privoxy等辅助程序，因为一般浏览器会泄漏你的DNS请求，从而减少你的匿名，参看前文#配置代理中转化为http代理一节。

- firefox
  - 直接在首选项-常规-网络代理中设置“手动代理”或者“自动代理配置的URL（PAC）”（生成pac可使用genpac，或者使用现成的pac如gfwlist to pac）。
  - 使用扩展如foxyproxy或switchyomega等。

- Chrome/Chromium

使用插件如switchomega(使用方法参看SwitchyOmega-wiki

### 服务端

提示： 普通用户无需配置服务端；

#### 以命令行启动进程

可使用以下方法运行：

注意: 如果安装的是shadowsocks-libev则使用`ss-server`替代`ssserver`。

- 在配置文件目录内运行

1. 在服务器上`cd`到`config.json`所在目录：
2. 运行`ssserver`

如果想在后台一直运行，可改执行：`nohup ssserver > log &`；

- 手动指定配置参数

    # ssserver -s 监听地址(通常为0.0.0.0) -p 监听端口 -k 密码 -m 加密方法 -t 超时时间（秒）

配合nohup和&可使之后台运行，关闭终端也不影响，例如：

    # nohup ssserver -s 0.0.0.0 -p 443 -k a29rw4pacnj2ahmf -m aes-192-cfb -t 600 &

#### 以守护进程形式运行

首先在`/etc/shadowsocks/foo.json`（foo是文件名，可随意更改）配置文件内填写好相关参数，然后可以使用以下方法使其以守护进程形式在后台运行：

- 使用`-d`参数

     # ssserver -c /etc/shadowsocks/foo.json -d start  #启动
     # ssserver -c /etc/shadowsocks/foo.json -d start  #停止
     # ssserver -c /etc/shadowsocks/foo.json -d start  #重启

- 使用systemd

    # systemctl start shadowsocks-server@foo  #立即启动
    # systemctl enable shadowsocks-server@foo  #开机自启动

注意: 如果使用shadowsocks-libev，则使用`shadowsocks-libev-server`替代`shadowsocks-server`。
提示： 如果使用的服务端端口号小于1024，需要修改`usr/lib/systemd/system/shadowsocks-server@.service`使得`user=root`，之后使用`systemctl daemon-reload`重新载入守护进程配置，即可开启监听。当然也可以用root权限运行shadowsocks，来开启端口号小于1024的监听。

#### 多端口运行

注意: shadowsocks和shadowsocks-go-serverAUR等支持多端口，而shadowsocks-libev不支持，可到Configure-Multiple-Users查看哪些版本支持多端口。

将配置文件中的`server_port`和`password`配置删去，添加上`"port_password"`字段配置端口及其密码，示例：

    /etc/shadowsocks/foo.json

    {
      "server": yourip,
      "_comment": {
        "25":"me",
        "9999": "girl",
        "520": "godness"
      },
      "port_password": {
        "25": "kexuedeshangwang",
        "520": "loveyoumygodness",,
        "9999": "forever",
      },
      "local_address": "127.0.0.1",
      "local_port": 1080,
      "timeout": 300,
      "method": "aes-256-cfb",
      "fast_open": false,
      "workers": 1,
      "prefer_ipv6": false
    }

提示： 有反映多端口配置后使用systemd进行守护进程运行会失败，可使用`-d`参数方法#以守护进程形式运行。

#### 加密方法

注意: 默认加密方法`table`速度很快，但很不安全。请不要使用`rc4`，它不安全。
提示： 安装`M2Crypto`可略微提升加密速度，对于Python2来说，安装python2-m2crypto即可。

可选的加密方式：

- aes-256-cfb（Shadowsocks经典、传统的加密算法，也是Shadowsocks的作者推荐过的加密算法，移动平台可能开销稍高）
- aes-128-cfb
- aes-192-cfb
- aes-256-ofb
- aes-128-ofb
- aes-192-ofb
- aes-128-ctr
- aes-192-ctr
- aes-256-ctr
- aes-128-cfb8
- aes-192-cfb8
- aes-256-cfb8
- aes-128-cfb1
- aes-192-cfb1
- aes-256-cfb1
- aes-256-gcm
- aes-128-gcm
- aes-192-gcm
- bf-cfb
- camellia-128-cfb
- camellia-192-cfb
- camellia-256-cfb
- cast5-cfb
- chacha20
- idea-cfb
- rc2-cfb
- rc4-md5
- salsa20
- seed-cfb

注意: 官方软件源的shadowsocks不支持全部加密方式，官方软件源Chacha20以及salsa20的支持可以安装libsodium（For salsa20 and chacha20 support） 。若对非主流加密方式有需求，可尝试aur中的shadowsocks-nodejsAUR[broken link: archived in aur-mirror]

加密类别列表参见[1]。 并且可以使用[2]脚本来比较和找出在你机器上运行最快的加密方法。

#### 性能优化

- 多用户使用的情况下，简易使用[#多端口运行]，尽量避免一个端口有过多用户连接。
- 使用常用端口（如25、443、21等等），GFW为减轻压力，对常用端口检查相对较少。
- 使用python-gevent提升python的shadowsocks运行的速度。
- 使用python-pip安装`M2Crypto`可略微提升加密速度；使用较弱的加密方式CR4-MD5提升加密速度（请根据实际使用情况考虑加密强度的选择）。
- 优化内核参数，参看Optimizing-Shadowsocks进行设置。
- 开启fast open降低延迟

     # echo 'net.ipv4.tcp_fastopen = 3' >> /etc/sysctl.conf

- 开启TCPBBR拥塞控制算法

注意: 需要内核4.9及以上版本，可使用`uname -r`查看。
警告: 该算法增加发包率从何提升流量消耗;可能消耗更多的系统资源；如果使用openvz的服务器，不建议使用bbr，据反映容易导致判定为滥用而被服务商禁用。

     modprobe tcp_bbr
     echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
     echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
     echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
     sysctl -p

检查:

     sysctl net.ipv4.tcp_available_congestion_control
     sysctl net.ipv4.tcp_congestion_control

如果结果都有 bbr字样, 则证明你的内核已开启 bbr。 执行`lsmod` ，看到有`tcp_bbr`模块即说明 bbr 已启动。

## 参阅

- shadowsocks announcement
- shadowsocks@gitHub
- shadowsocks使用说明
- About Shadowsocks
- shadowsocks最新配置
- Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势？

Categories:

- 简体中文
- Networking (简体中文)

Hidden category:

- Pages with broken package links