「Shadowsocks」- A secure socks5 proxy

认识

根据维基百科描述:Shadowsocks,是个开源加密代理项目,在中国大陆被广泛用于规避互联网审查。它由壹位名为“clowwindy”的中国程序员于 2012 年创建的,自此该协议(SOCKS)有了很多的实现。通常,客户端软件将在运行的计算机上打开一个 SOCKS5 代理,然后可以将这些网络流量进行导向,类似于 SSH 隧道,但与 SSH 隧道不同,shadowsocks 也可以代理 UDP 流量。

组成

Local Client ⇔ SS Local <=(encrypted traffic)=> GFW <=(encrypted traffic)=> SS Server ⇔ Remote Server

构建

以下项目多数来自于 GitHub/shadowsocks 主页:https://github.com/shadowsocks

服务部署

各种实现:python、Go、Go from Outline、C with libev、C++ with Qt、Perl

仅包含客户端

shadowsocks-android::用于 Android 的 shadowsocks 客户端。
shadowsocks-windows::用于 Windows 的 shadowsocks 客户端。由 C#实现。
ShadowsocksX-NG::用于 OS X 的 shadowsocks 客户端。由 Swift 实现。
shadowsocks-qt5::跨平台的 GUI 客户端。
shadowsocks-gui::Shadowsocks 的 GUI 客户端。由 CoffeeScript 实现。
shadowsocks-iOS::用于 iOS 和 OS X 的客户端。
shadowsocks-chromeapp::这是 shadowsocks 的 Chrome 应用版本。

包含 Client 和 Server 的实现

shadowsocks-go::由 Go 语言实现。
go-shadowsocks2::又一个由 Go 语言实现。
shadowsocks-rust::由 Rust 语言实现。
libQtShadowsocks::libQtShadowsocks 是一个用 Qt5 编写的轻量和高速的 Shadowsocks 库。
shadowsocks-libqss 既可以作为 Client,也可作为 Server。
shadowsocks::由 Python 语言实现。
shadowsocks-libev::shadowsocks-libev 是嵌入式设备和低端盒子的轻量级和全功能端口。
openwrt-shadowsocks::用于的 OpenWrt/LEDE 的 Shadowsocks-libev。
shadowsocks-nodejs::由 CoffeeScript 语言实现。

与 DNS 有关的应用

ShadowDNS::一个使用 Shadowsocks 作为服务器的 DNS 转发器。由 Python 实现。
ChinaDNS-Python::针对 DNS 污染的工具,可以免于受 DNS 污染的影响。由 Python 实现。
ChinaDNS::针对 DNS 污染的工具,可以免于受 DNS 污染的影响。由 C 实现。

管理工具

shadowsocks-manager shadowsocks 多用户管理以及流量控制工具。由 nodejs 实现。

其他项目

simple-obfs-android::用于 Android 的混淆工具。
simple-obfs::混淆工具,做为 shadowsocks 的插件服务器。
shadowsocks-org::官网 http://www.shadowsockws.org 源码
go::Go 语言。
libevent libevent 库是用 C 语言编写的、轻量级的开源高性能事件通知库。
libev libev 是 libevent 之后的一个事件驱动的编程框架,其接口和 libevent 基本类似
libsscrypto 构建用于 shadowsocks-windows 的 libsscrypto.dll。
stackscript::shadowsocks 部署 SHELL 脚本。
libancillary::在不相关的进程之间分享“事件文件描述符”。
iptables::用于配置 Linux 2.4.x+内核的「数据包过滤规则集」的用户空间的命令行程序。
mbedtls::一个开源的,便携式,易于使用,可读和灵活的 SSL 库。
openssl-android::用于 shadowsocks-android 的 OpenSSL 库分支。
pdnsd::用于本地缓存 DNS 信息的服务端。
GlobalHotKey::设置系统范围内的热键,并对其事件做出反应。
libsodium::易于使用的加密库。
ipset::用于存储 IPv4 和 IPv6 地址集的小型 C 助手库
libudns::支持异步的 DNS 存根解析程序库
libcork::一个简单,易于嵌入的跨平台 C 库
libbloom::C 实现的一个简单而小的过滤器
sysproxy::用于 Shadowsocks Windows 的系统代理。
overture::DNS 服务 / 转发器。GO 语言实现。
overture-android::shadowsocks-android 的 overture 封装
redsocks::透明重定向任何 TCP 连接到代理。
proxychains-ng::proxychains-ng(新一代)- 一个预加载程序,它将调用挂接到动态链接程序中的套接字,并通过一个或多个 socks/http 代理进行重定向。
openwrt-feeds::用于 OpenWrt/LEDE feeds::luci-app-shadowsocks::用于 Shadowsocks-libev 的 OpenWrt/LEDE LuCI::shadowsocks-dotcloud::通过 websockets 协议的 shadowsocks 端口,能够通过 HTTP 代理隧道。
由 CoffeeScript 实现。
badvpn::tun2socks proxifier, P2P VPN::使用 NCD 脚本语言。
tun2socks-iOS::做为库用于 iOS 应用的 tun2socks

改进

How-To Throttle Bandwidth per User/Port via tc
https://github.com/shadowsocks/shadowsocks/issues/792

加速 SS 服务

使用 KCPTun 加速你的 SS:
https://www.jianshu.com/p/47187e7b528c

SOCKS ⇒ HTTP

部分应用程序不支持 SOCKS 协议,与 Polipo 配合,能够将 SOCKS 转为 HTTP 协议
Polipo — a caching web proxy
Convert Shadowsocks into an HTTP proxy
http-proxy-to-socks

服务被封禁

# 11/27/2019 但是后来服务器被封禁了,大概是因为协议的原因:虽然流量是加密的,但是连接初始化的报文不是加密的,还是有很明显的协议特征。而且客户端是能够发送虚假的握手报文,只要服务端有“合理的回应”,就能证明服务器是 SOCKS 网络加速服务。

import socket
import struct

sen = struct.pack('BBB', 0x05, 0x01, 0x00)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 9050))
s.sendall(sen)

data = s.recv(2)

version, auth = struct.unpack('BB', data)
s.close()

println(version + " | " + auth)

# 11/03/2019 我们开始用 ShadowsocksR 实现,速度比以前慢了些许。

参考

https://github.com/shadowsocks/shadowsocks/wiki
https://shadowsocks.com.hk/
https://shadowsocks.com.hk/client.html
https://shadowsocks.org/en/index.html
写给非专业人士看的 Shadowsocks 简介
shadowsocks/download