shadowsocks使用asyncio构建,也支持一个端口中的多个用户

aioshadowsocks的Python项目详细描述


aioshadowsocks

用 asyncio 重写 shadowsocks

Publish Docker

视频安装教程

  • 面板视频安装教程: 地址

  • 后端对接视频教程: 地址

  • 隧道对接视频教程: 地址

使用

  • 安装
pip install aioshadowsocks
  • 多用户配置

aioshadowsocks 将json作为配置文件, 会读取当前目录下 userconfigs.json 作为默认的配置文件

{"users":[{"user_id":1,"port":2345,"method":"none","password":"hellotheworld1","transfer":104857600,"speed_limit":0},{"user_id":2,"port":2346,"method":"chacha20-ietf-poly1305","password":"hellotheworld2","transfer":104857600,"speed_limit":384000}]}

同时也支持从http服务器读取配置文件,这时需要注入环境变量 SS_API_ENDPOINT 作为读取配置的api地址

  • 注入环境变量

export SS_API_ENDPOINT="https://xxx/com"

  • 启动ss服务器
aioss run_ss_server

Docker Version

  1. install docker
curl -sSL https://get.docker.com/ | sh
  1. install docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. apply executable permissions
sudo chmod +x /usr/local/bin/docker-compose
  1. run server
docker-compose up

为什么要重写shadowsocks

主要想通过这个项目的推进来深入了解 asyncio

另外我的一个项目: django-sspanel 依赖 shadowsocksr

但该项目已经停止开发了,所以决定重新造个轮子

主要功能

  • tcp/udp 代理
  • 流量统计
  • 速率控制
  • 开放了grpc接口(类似ss-manager)
  • 单端口多用户(利用AEAD加密在不破坏协议的情况下实现)
  • prometheus/grafana metrics监控 (dashboard在项目的static/grafana/文件夹下)

监控dashboard

性能测试

Shadowsocks本身是一个IO密集行的应用,但是由于加入了AEAD加密,使得SS本身变成了CPU密集行的应用 而Python本身是不太适合CPU密集的场景的,所以在AEAD模式中的表现不佳 PS: 当然,其实是我代码写的烂,python不背锅

  • Steam-Cipher-None(不加密 高IO)

  • AEAD-Cipher-CHACHA-20(加密 高CPU)

rpc proto

syntax="proto3";packageaioshadowsocks;// REQmessageUserIdReq{int32user_id=1;}messagePortReq{int32port=1;}messageUserReq{int32user_id=1;int32port=2;stringmethod=3;stringpassword=4;boolenable=5;}// RESmessageEmpty{}messageUser{int32user_id=1;int32port=2;stringmethod=3;stringpassword=4;boolenable=5;int32speed_limit=6;int32access_order=7;boolneed_sync=8;repeatedstringip_list=9;int32tcp_conn_num=10;int64upload_traffic=11;int64download_traffic=12;}// serviceservicess{rpcCreateUser(UserReq)returns(User){}rpcUpdateUser(UserReq)returns(User){}rpcGetUser(UserIdReq)returns(User){}rpcDeleteUser(UserIdReq)returns(Empty){}}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在数据库中存储工作日数据以及开始时间和结束时间?   mysql Java JPA内部联接查询不起作用   java MQ消息在不同的客户端应用程序中显示不同   javascript如何在xPage上提高typeAhead性能?   java在尝试保存EditText时无法暂停   mongodb“未能使用带参数的构造函数NO_构造函数实例化java.util.List”,   java如何修改使IllegalArgumentException:列“\u id”不存在的游标   转换Android。网Uri到Java。伊奥。输入流   java NetBeans RCP居中弹出窗口无法按预期工作   java将sql开发人员与netbeans连接起来   带有xmldsig签名的java JAXB编组   java ORACLE JDBC批处理执行不会返回受影响行的实际计数   java无法理解如何在由swagger自动生成的jaxrs服务器中访问请求头   java如何处理漏洞CVE20181258,同时将Spring安全版本5与外部客户端(最新版本)一起使用?   JavaSpring数据JPA存储库多租户单模式技术