shadowsocks/shadowsocks-libev

GitHub: shadowsocks/shadowsocks-libev

基于 libev 的轻量级 Shadowsocks 加密代理实现,适合资源受限环境下的安全代理部署。

Stars: 16182 | Forks: 6244

# shadowsocks-libev [![构建状态](https://travis-ci.com/shadowsocks/shadowsocks-libev.svg?branch=master)](https://travis-ci.com/shadowsocks/shadowsocks-libev) [![Snap 状态](https://snapcraft.io/shadowsocks-libev/badge.svg)](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, 安全合规, 客户端加密, 科学上网, 网络代理