shadowsocks/shadowsocks-libev
GitHub: shadowsocks/shadowsocks-libev
基于 libev 的轻量级 Shadowsocks 加密代理实现,适合资源受限环境下的安全代理部署。
Stars: 16182 | Forks: 6244
# shadowsocks-libev
[](https://travis-ci.com/shadowsocks/shadowsocks-libev) [](https://snapcraft.io/shadowsocks-libev)
## 简介
[Shadowsocks-libev](https://shadowsocks.org) 是一款面向嵌入式设备和低端盒子的轻量级安全 SOCKS5 代理。
它是 [@clowwindy](https://github.com/clowwindy) 创建的 [Shadowsocks](https://github.com/shadowsocks/shadowsocks) 的一个移植版本,并由
[@madeye](https://github.com/madeye) 和 [@linusyang](https://github.com/linusyang) 维护。
当前版本:3.3.6 | [更新日志](debian/changelog)
## 功能
Shadowsocks-libev 使用纯 C 语言编写,并依赖于 [libev](http://software.schmorp.de/pkg/libev.html)。它被设计为 shadowsocks 协议的轻量级实现,旨在尽可能降低资源占用。
有关不同版本 shadowsocks 的完整功能对比,
请参阅 [Wiki 页面](https://github.com/shadowsocks/shadowsocks/wiki/Feature-Comparison-across-Different-Versions)。
## 快速开始
推荐使用 Snap 来安装最新的二进制文件。
### 安装 snap core
https://snapcraft.io/core
### 从 snapcraft.io 安装
稳定渠道:
```
sudo snap install shadowsocks-libev
```
边缘渠道:
```
sudo snap install shadowsocks-libev --edge
```
## 安装
### 特定发行版指南
- [Debian 和 Ubuntu](#debian--ubuntu)
+ [从仓库安装](#install-from-repository-not-recommended)
+ [从源码构建 deb 包](#build-deb-package-from-source)
+ [配置并启动服务](#configure-and-start-the-service)
- [Fedora 和 RHEL](#fedora--rhel)
+ [在 centos 上从源码构建](#build-from-source-with-centos)
- [Archlinux 和 Manjaro](#archlinux--manjaro)
- [NixOS](#nixos)
- [Nix](#nix)
- [在类 UNIX 系统上直接构建和安装](#linux)
- [FreeBSD](#freebsd)
+ [安装](#install)
+ [配置](#configuration)
+ [运行](#run)
+ [作为客户端运行](#run-as-client)
- [OpenWRT](#openwrt)
- [OS X](#os-x)
- [Windows (MinGW)](#windows-mingw)
- [Docker](#docker)
### 从源码构建 (CMake)
shadowsocks-libev 使用 CMake 作为其唯一的构建系统。首先拉取子模块:
```
git submodule update --init --recursive
```
然后构建:
```
mkdir -p build && cd build
cmake ..
make
sudo make install
```
运行单元测试:
```
cd build
ctest --output-on-failure
```
#### CMake 选项
如需获取可用选项的完整列表,请在构建目录中运行 `cmake -LH`。
常用选项:
| 选项 | 默认值 | 描述 |
|---|---|---|
| `-DWITH_EMBEDDED_SRC=OFF` | `ON` | 使用系统的 libcork/libipset/libbloom,而不是内置的子模块 |
| `-DWITH_DOC_MAN=OFF` | `ON` | 跳过 man 页面生成(移除 asciidoc/xmlto 依赖) |
| `-DBUILD_TESTING=OFF` | `ON` | 禁用单元测试 |
| `-DENABLE_CONNMARKTOS=ON` | `OFF` | Linux netfilter conntrack QoS 支持 |
| `-DENABLE_NFTABLES=ON` | `OFF` | nftables 防火墙集成 |
在 macOS 上,如果库是通过 Homebrew 安装的,请指定路径:
```
cmake .. -DCMAKE_PREFIX_PATH="/usr/local/opt/mbedtls;/usr/local/opt/libsodium"
```
### Debian 和 Ubuntu
#### 从仓库安装(不推荐)
Shadowsocks-libev 在以下发行版的官方仓库中可用:
* Debian 8 或更高版本,包括 oldoldstable (jessie)、old stable (stretch)、stable (buster)、testing (bullseye) 和 unstable (sid)
* Ubuntu 16.10 或更高版本
```
sudo apt update
sudo apt install shadowsocks-libev
```
#### 从源码构建 deb 包
你可以通过脚本构建 shadowsocks-libev 及其所有依赖项:
```
mkdir -p ~/build-area/
cp ./scripts/build_deb.sh ~/build-area/
cd ~/build-area
./build_deb.sh
```
对于较旧的系统,不支持构建 `.deb` 包。
请尝试直接从源码构建并安装。请参阅下方的 [Linux](#linux) 部分。
#### 配置并启动服务
```
# 编辑配置文件
sudo vim /etc/shadowsocks-libev/config.json
# 编辑 debian 的默认配置
sudo vim /etc/default/shadowsocks-libev
# 启动服务
sudo /etc/init.d/shadowsocks-libev start # for sysvinit, or
sudo systemctl start shadowsocks-libev # for systemd
```
### Fedora 和 RHEL
支持的发行版:
* 最近的 Fedora 版本(直到 EOL)
* RHEL 6、7 及其衍生版本(包括 CentOS、Scientific Linux)
#### 在 centos 上从源码构建
如果你使用的是 CentOS 7,你需要安装以下先决条件才能从源码构建:
```
yum install epel-release -y
yum install gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto c-ares-devel libev-devel libsodium-devel mbedtls-devel -y
```
### Archlinux 和 Manjaro
```
sudo pacman -S shadowsocks-libev
```
请参阅下游的 [PKGBUILD](https://github.com/archlinux/svntogit-community/blob/packages/shadowsocks-libev/trunk/PKGBUILD)
脚本,以获取额外的修改和特定于发行版的 bug 修复。
### NixOS
```
nix-env -iA nixos.shadowsocks-libev
```
### Nix
```
nix-env -iA nixpkgs.shadowsocks-libev
```
### Linux
通常,你需要以下构建依赖:
* cmake (>= 3.2)
* C 编译器(gcc 或 clang)
* pkg-config
* libmbedtls
* libsodium (>= 1.0.4)
* libpcre2
* libev
* libc-ares
* asciidoc(仅用于文档)
* xmlto(仅用于文档)
如果你的系统太旧,无法提供 libmbedtls 和 libsodium (>= 1.0.4),你将需要手动安装这些库或升级你的系统。
为你的发行版安装构建依赖项:
```
# Debian / Ubuntu
sudo apt-get install --no-install-recommends build-essential cmake pkg-config \
libpcre2-dev libev-dev libc-ares-dev libmbedtls-dev libsodium-dev \
asciidoc xmlto
# CentOS / Fedora / RHEL
sudo yum install gcc cmake make pkg-config pcre2-devel c-ares-devel \
libev-devel libsodium-devel mbedtls-devel asciidoc xmlto
# Arch
sudo pacman -S gcc cmake make pkg-config pcre2 c-ares libev libsodium mbedtls \
asciidoc xmlto
```
然后构建并安装:
```
git submodule update --init --recursive
mkdir -p build && cd build
cmake ..
make
sudo make install
```
### FreeBSD
#### 安装
Shadowsocks-libev 可在 FreeBSD Ports Collection 中找到。你可以通过 `pkg` 或 `ports` 任一方式安装。
**pkg(推荐)**
```
pkg install shadowsocks-libev
```
**ports**
```
cd /usr/ports/net/shadowsocks-libev
make install
```
#### 配置
编辑你的 `config.json` 文件。默认情况下,它位于 `/usr/local/etc/shadowsocks-libev`。
要启用 shadowsocks-libev,请将以下 rc 变量添加到你的 `/etc/rc.conf` 文件中:
```
shadowsocks_libev_enable="YES"
```
#### 运行
启动 Shadowsocks 服务器:
```
service shadowsocks_libev start
```
#### 作为客户端运行
默认情况下,shadowsocks-libev 在 FreeBSD 中作为服务器运行。如果你想以客户端模式启动 shadowsocks-libev,你可以手动修改 rc 脚本 (`/usr/local/etc/rc.d/shadowsocks_libev`)。
```
# 将以下行从 "ss-server" 修改为 "ss-local"
command="/usr/local/bin/ss-local"
```
请注意这只是一个变通方法,每次升级 port 时,你的修改都会被新版本覆盖。
### OpenWRT
OpenWRT 项目在此处维护:
[openwrt-shadowsocks](https://github.com/shadowsocks/openwrt-shadowsocks)。
### OS X
对于 OS X,请使用 [Homebrew](http://brew.sh) 进行安装或构建。
安装 Homebrew:
```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
安装 shadowsocks-libev:
```
brew install shadowsocks-libev
```
### Windows (MinGW)
要构建 Windows 原生二进制文件,推荐的方法是使用 Docker:
* 在 Windows 上:双击 `docker\mingw` 中的 `make.bat`
* 在类 UNIX 系统上:
cd shadowsocks-libev/docker/mingw
make
包含 32 位和 64 位二进制文件的压缩包将在同一目录中生成。
你也可以在类 UNIX shell(MSYS2/Cygwin)中手动使用 MinGW-w64 编译器进行构建,或者在类 UNIX 系统(Linux/MacOS)上进行交叉编译。请参阅 `docker/mingw` 中的构建脚本。
目前,你需要为 MinGW 使用打过补丁的 libev 库:
* https://github.com/shadowsocks/libev/archive/mingw.zip
请注意,TCP Fast Open (TFO) 仅在 **Windows 10**、**1607** 或更高版本(确切地说,构建版本号 >= 14393)上可用。如果你使用的是 **1709**(构建版本号 16299)或更高版本,你还需要在 PowerShell/命令提示符中**以管理员身份**运行以下命令并**重新启动**,才能正常使用 TFO:
```
netsh int tcp set global fastopenfallback=disabled
```
### Docker
如你所愿,只需拉取镜像并运行即可。
```
docker pull shadowsocks/shadowsocks-libev
docker run -e PASSWORD= -p:8388 -p:8388/udp -d shadowsocks/shadowsocks-libev
```
有关该镜像的更多信息可以在[这里](docker/alpine/README.md)找到。
## 用法
有关所有支持参数的详细完整列表,
你可以分别参考这些应用程序的 man 手册页。
```
ss-[local|redir|server|tunnel|manager]
-s Host name or IP address of your remote server.
-p Port number of your remote server.
-l Port number of your local server.
-k Password of your remote server.
-m Encrypt method: rc4-md5,
aes-128-gcm, aes-192-gcm, aes-256-gcm,
aes-128-cfb, aes-192-cfb, aes-256-cfb,
aes-128-ctr, aes-192-ctr, aes-256-ctr,
camellia-128-cfb, camellia-192-cfb,
camellia-256-cfb, bf-cfb,
chacha20-ietf-poly1305,
xchacha20-ietf-poly1305,
salsa20, chacha20 and chacha20-ietf.
The default cipher is chacha20-ietf-poly1305.
[-a ] Run as another user.
[-f ] The file path to store pid.
[-t ] Socket timeout in seconds.
[-c ] The path to config file.
[-n ] Max number of open files.
[-i ] Network interface to bind.
(not available in redir mode)
[-b ] Local address to bind.
For servers: Specify the local address to use
while this server is making outbound
connections to remote servers on behalf of the
clients.
For clients: Specify the local address to use
while this client is making outbound
connections to the server.
[-u] Enable UDP relay.
(TPROXY is required in redir mode)
[-U] Enable UDP relay and disable TCP relay.
(not available in local mode)
[-T] Use tproxy instead of redirect. (for tcp)
(only available in redir mode)
[-L :] Destination server address and port
for local port forwarding.
(only available in tunnel mode)
[-6] Resolve hostname to IPv6 address first.
[-d ] Name servers for internal DNS resolver.
(only available in server mode)
[--reuse-port] Enable port reuse.
[--fast-open] Enable TCP fast open.
with Linux kernel > 3.7.0.
(only available in local and server mode)
[--acl ] Path to ACL (Access Control List).
(only available in local and server mode)
[--manager-address ] UNIX domain socket address.
(only available in server and manager mode)
[--mtu ] MTU of your network interface.
[--mptcp] Enable Multipath TCP on MPTCP Kernel.
[--no-delay] Enable TCP_NODELAY.
[--executable ] Path to the executable of ss-server.
(only available in manager mode)
[-D ] Path to the working directory of ss-manager.
(only available in manager mode)
[--key ] Key of your remote server.
[--plugin ] Enable SIP003 plugin. (Experimental)
[--plugin-opts ] Set SIP003 plugin options. (Experimental)
[-v] Verbose mode.
```
## 辅助脚本
### ss-setup
`ss-setup` 是一个交互式 TUI(文本用户界面)工具,用于设置 shadowsocks-libev 服务器和客户端配置。它使用 `whiptail` 或 `dialog` 来提供菜单界面。
它会通过 `make install` 自动安装,也可以直接从 `scripts/ss-setup.sh` 运行。
**前提条件:** `whiptail` 或 `dialog`,`openssl`(可选,用于密码生成)
#### 服务器设置(包含 systemd 服务)
以 root 身份运行以获取完整功能(配置 + systemd 服务安装):
```
sudo ss-setup
```
这会启动一个交互式菜单,引导你完成以下操作:
1. 选择一个配置实例名称
2. 设置监听地址和端口(手动指定或随机使用高端口)
3. 选择 AEAD 加密方式(chacha20-ietf-poly1305、aes-256-gcm 等)
4. 生成或输入密码
5. 配置超时时间、网络模式(TCP/UDP)和 TCP Fast Open
6. 可选择 SIP003 插件
7. 安装并启动 systemd 服务
配置将保存到 `/etc/shadowsocks-libev/.json`,并创建一个 systemd 模板服务 `shadowsocks-libev-server@.service`。
最后,它会显示一个可导入到客户端的 `ss://` URI。
#### 生成客户端配置
从主菜单中选择“Generate ss-local client config”。向导会提示输入远程服务器地址、端口、加密方式、密码和本地 SOCKS5 端口,然后写入 JSON 配置文件:
```
# 不使用 root 运行以在当前目录生成 config
ss-setup
# 选择:client -> 填写 server 详情 -> 保存
# 然后启动 client
ss-local -c ~/ss-client.json
```
#### 仅配置模式(非 root)
在没有 root 权限的情况下运行时,`ss-setup` 会跳过服务安装和插件管理,但仍会在当前目录下生成配置文件:
```
ss-setup
# Config 保存至 ./config.json(在当前目录)
# 手动启动:
ss-server -c ./config.json
```
#### 服务管理
从主菜单中选择“Manage running services”,即可对任何已配置的实例执行启动、停止、重启、启用/禁用或查看日志操作:
```
sudo ss-setup
# 选择:service -> 选择 instance -> start/stop/restart/logs
```
#### 插件安装
从主菜单中选择“Install a SIP003 plugin”(需要 root 权限)。支持自动下载:
- simple-obfs(从源码构建或通过包管理器)
- v2ray-plugin(GitHub release 版本)
- xray-plugin(GitHub release 版本)
- kcptun(GitHub release 版本)
- 自定义插件二进制文件
### ss-nat
`ss-nat` 是一个辅助脚本,用于为 `ss-redir` 设置 iptables NAT 规则,以提供透明的 TCP/UDP 重定向。它会在 Linux 系统上通过 `make install` 安装。
**前提条件:** 带有 `iptables`、`ipset` 的 Linux 系统,以及可选的用于 UDP 的 TPROXY 内核模块
#### 基本用法(TCP 重定向)
```
# 首先启动 ss-redir
ss-redir -s YOUR_SERVER_IP -p 8388 -l 1080 -k PASSWORD -m chacha20-ietf-poly1305 -u
# 设置 NAT 规则以通过 ss-redir 重定向 TCP 流量
sudo ss-nat -s YOUR_SERVER_IP -l 1080
```
#### 使用 TPROXY 启用 UDP 中继
```
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -u
```
#### 将规则应用于 OUTPUT 链(为本机自身提供代理)
```
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -u -o
```
#### 使用独立的 TCP/UDP 服务器
```
sudo ss-nat -s TCP_SERVER_IP -l 1080 -S UDP_SERVER_IP -L 1080 -U
```
#### 绕过特定的 WAN IP
```
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -b "1.2.3.4 5.6.7.8"
```
#### 使用绕过 IP 列表文件
```
# 创建一个文件,每行一个 IP/CIDR
echo "1.2.3.0/24" > /etc/ss-bypass.list
echo "5.6.7.0/24" >> /etc/ss-bypass.list
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -i /etc/ss-bypass.list
```
#### 局域网访问控制
```
# 白名单模式:仅代理来自这些 LAN IP 的流量
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -a "w192.168.1.10 192.168.1.20"
# 黑名单模式:代理除这些 IP 之外的所有 LAN 流量
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -a "b192.168.1.100"
```
#### 清除所有规则
```
sudo ss-nat -f
```
#### 完整示例:透明代理网关
将一台 Linux 盒子设置为整个局域网的透明代理网关:
```
# 1. 启动带有 UDP relay 的 ss-redir
ss-redir -s YOUR_SERVER_IP -p 8388 -l 1080 -k PASSWORD \
-m chacha20-ietf-poly1305 -u -f /var/run/ss-redir.pid
# 2. 设置 NAT 规则(TCP + UDP,也适用于本地 OUTPUT)
sudo ss-nat -s YOUR_SERVER_IP -l 1080 -u -o -I eth0
# 3. 将其他设备的默认网关指向此机器的 LAN IP
# 并将它们的 DNS 设置为公共 resolver(例如 1.1.1.1 或 8.8.8.8)
# 要拆除:
sudo ss-nat -f
```
## 透明代理(手动配置 iptables)
最新的 shadowsocks-libev 提供了 *redir* 模式。你可以将基于 Linux 的盒子或路由器配置为透明地代理所有 TCP 流量,如果你使用基于 OpenWRT 的路由器,这会非常方便。
注意:对于大多数用例,上方的 [`ss-nat`](#ss-nat) 比手动编写 iptables 规则更简单。
```
# 创建新 chain
iptables -t nat -N SHADOWSOCKS
iptables -t mangle -N SHADOWSOCKS
# 忽略你的 shadowsocks server 地址
# 这非常重要,请务必小心。
iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
# 忽略 LANs 和任何你希望绕过代理的其他地址
# 有关保留网络的完整列表,请参阅 Wikipedia 和 RFC5735。
# 有关高度优化的 CHN 路由列表,请参阅 ashi009/bestroutetb。
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
# 其他任何内容都应重定向到 shadowsocks 的本地端口
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
# 添加任何 UDP 规则
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
# 应用规则
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
iptables -t mangle -A PREROUTING -j SHADOWSOCKS
# 启动 shadowsocks-redir
ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
```
## 透明代理(纯 tproxy)
在 Linux 主机上执行此脚本可以代理本机的所有传出流量(发往保留地址的流量除外)。同一局域网下的其他主机也可以将其默认网关更改为这台 Linux 主机的 IP(同时将 DNS 服务器更改为 1.1.1.1 或 8.8.8.8 等),以代理其传出流量。
```
#!/bin/bash
start_ssredir() {
# please modify MyIP, MyPort, etc.
(ss-redir -s MyIP -p MyPort -m MyMethod -k MyPasswd -b 127.0.0.1 -l 60080 --no-delay -u -T -v >/var/log/ss-redir.log &)
}
stop_ssredir() {
kill -9 $(pidof ss-redir) &>/dev/null
}
start_iptables() {
##################### SSREDIR #####################
iptables -t mangle -N SSREDIR
# connection-mark -> packet-mark
iptables -t mangle -A SSREDIR -j CONNMARK --restore-mark
iptables -t mangle -A SSREDIR -m mark --mark 0x2333 -j RETURN
# please modify MyIP, MyPort, etc.
# ignore traffic sent to ss-server
iptables -t mangle -A SSREDIR -p tcp -d MyIP --dport MyPort -j RETURN
iptables -t mangle -A SSREDIR -p udp -d MyIP --dport MyPort -j RETURN
# ignore traffic sent to reserved addresses
iptables -t mangle -A SSREDIR -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A SSREDIR -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A SSREDIR -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A SSREDIR -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A SSREDIR -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A SSREDIR -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A SSREDIR -d 192.0.0.0/24 -j RETURN
iptables -t mangle -A SSREDIR -d 192.0.2.0/24 -j RETURN
iptables -t mangle -A SSREDIR -d 192.88.99.0/24 -j RETURN
iptables -t mangle -A SSREDIR -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A SSREDIR -d 198.18.0.0/15 -j RETURN
iptables -t mangle -A SSREDIR -d 198.51.100.0/24 -j RETURN
iptables -t mangle -A SSREDIR -d 203.0.113.0/24 -j RETURN
iptables -t mangle -A SSREDIR -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A SSREDIR -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A SSREDIR -d 255.255.255.255/32 -j RETURN
# mark the first packet of the connection
iptables -t mangle -A SSREDIR -p tcp --syn -j MARK --set-mark 0x2333
iptables -t mangle -A SSREDIR -p udp -m conntrack --ctstate NEW -j MARK --set-mark 0x2333
# packet-mark -> connection-mark
iptables -t mangle -A SSREDIR -j CONNMARK --save-mark
##################### OUTPUT #####################
# proxy the outgoing traffic from this machine
iptables -t mangle -A OUTPUT -p tcp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
iptables -t mangle -A OUTPUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
##################### PREROUTING #####################
# proxy traffic passing through this machine (other->other)
iptables -t mangle -A PREROUTING -p tcp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
iptables -t mangle -A PREROUTING -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
# hand over the marked package to TPROXY for processing
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080
iptables -t mangle -A PREROUTING -p udp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080
}
stop_iptables() {
##################### PREROUTING #####################
iptables -t mangle -D PREROUTING -p tcp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080 &>/dev/null
iptables -t mangle -D PREROUTING -p udp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080 &>/dev/null
iptables -t mangle -D PREROUTING -p tcp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR &>/dev/null
iptables -t mangle -D PREROUTING -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR &>/dev/null
##################### OUTPUT #####################
iptables -t mangle -D OUTPUT -p tcp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR &>/dev/null
iptables -t mangle -D OUTPUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR &>/dev/null
##################### SSREDIR #####################
iptables -t mangle -F SSREDIR &>/dev/null
iptables -t mangle -X SSREDIR &>/dev/null
}
start_iproute2() {
ip route add local default dev lo table 100
ip rule add fwmark 0x2333 table 100
}
stop_iproute2() {
ip rule del table 100 &>/dev/null
ip route flush table 100 &>/dev/null
}
start_resolvconf() {
# or nameserver 8.8.8.8, etc.
echo "nameserver 1.1.1.1" >/etc/resolv.conf
}
stop_resolvconf() {
echo "nameserver 114.114.114.114" >/etc/resolv.conf
}
start() {
echo "start ..."
start_ssredir
start_iptables
start_iproute2
start_resolvconf
echo "start end"
}
stop() {
echo "stop ..."
stop_resolvconf
stop_iproute2
stop_iptables
stop_ssredir
echo "stop end"
}
restart() {
stop
sleep 1
start
}
main() {
if [ $# -eq 0 ]; then
echo "usage: $0 start|stop|restart ..."
return 1
fi
for funcname in "$@"; do
if [ "$(type -t $funcname)" != 'function' ]; then
echo "'$funcname' not a shell function"
return 1
fi
done
for funcname in "$@"; do
$funcname
done
return 0
}
main "$@"
```
## 安全提示
对于任何公共服务器,为了防止用户访问你服务器的 localhost,请在命令行中添加 `--acl acl/server_block_local.acl`。
尽管 shadowsocks-libev 能够很好地处理数千个并发连接,我们仍然建议
设置服务器的防火墙规则以限制每个用户的连接数:
```
# 对于正常使用,最多 32 个连接就足够了
iptables -A INPUT -p tcp --syn --dport ${SHADOWSOCKS_PORT} -m connlimit --connlimit-above 32 -j REJECT --reject-with tcp-reset
```
## 许可证
```
Copyright: 2013-2015, Clow Windy
2013-2018, Max Lv
2014, Linus Yang
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
```
标签:C/C++, libev, SOCKS5, 事务性I/O, 安全合规, 客户端加密, 科学上网, 网络代理