Sunday, January 8, 2017

ShadowsocksR单端口多用户尝鲜

此文更新于2017-01-08,之后可能会更新出更易于使用的方式,到时候请以最新的文档为准

如果你要尝试这个新功能,首先把服务端和客户端均更新到最新,客户端C#需要4.0.5版或以上,SSR-android需要3.3.3版本或以上。

首先是服务端的配置
服务端把协议(protocol)配置为 auth_aes128_md5 或 auth_aes128_sha1,然后在协议参数(protocol_param)配置所有可用的用户id及其密码,示例如下:

        "protocol": "auth_aes128_sha1",
        "protocol_param": "64#12345:breakwa11,233:zhihuyaowan",

含义:
在#前面的表示每个用户的最大客户端数,照着写这个值或者不填都可以,但必须有#号。在#后,以英文逗号分隔所有的用户,而英文冒号的前面是用户的id,注意这个id必须是范围在 1~2147483647之间,后面的是用户的密码,密码不能有特殊符号,建议仅使用数字和大小写字母

然后是客户端的配置
客户端方面非常简单,需要使用用户id为12345的连接,那么在客户端的协议参数(protocol_param)里面填写 12345:breakwa11 就行了,如果使用id为233的同理,其它参数服务端怎么配置的就怎么写

那既然多用户可以单端口了,那能不能做得更像一个网站?完全可以的,如果是http的话,服务端安装一个nginx之类,把端口开在8080(监听127.0.0.1),然后SSR的端口开在80,同时在SSR的user-config.json里修改参数 "redirect" : "127.0.0.1:8080", 这时,直接用浏览器打开,就可以直接看到你开的网站了,而改成用SSR客户端连接就成了服务端了。不过注意的是这时候最好要开相应的混淆哦ヽ(´▽`)ノ

目前这个是刚出的功能,还在测试中,后端和面板还没有相应的支持,也没有流量控制等,建议几个人自己合玩的时候可以这样用,特别地在某些学校或公司这个功能非常好用的哦。


2017-01-11更新:
现mudbjson模式多用户已支持,简要说明如下:
首先先创建对应的用户id,如果这个id大于65535,那么此用户仅用于多用户模式,小于等于65535时会同时监听这个端口。然后创建多用户端口,相应的protocol_param里就填写能使用这个端口的用户ID(如果这个ID不存在,那添加了也不能使用),以下是配置示例:

[
    {
        "d": 0,
        "enable": 1,
        "method": "aes-128-cfb",
        "obfs": "tls1.2_ticket_auth_compatible",
        "passwd": "vwHF%35j",
        "port": 12345,
        "protocol": "auth_aes128_sha1",
        "protocol_param": "#10001:breakwa11,100002:zhihuyaowan",
        "transfer_enable": 1125899906842624,
        "u": 0,
        "user": "12345"
    },
    {
        "d": 0,
        "enable": 1,
        "method": "aes-128-cfb",
        "obfs": "tls1.2_ticket_auth_compatible",
        "passwd": "E&iWmlxu",
        "port": 10001,
        "protocol": "auth_sha1_v4",
        "transfer_enable": 536870912,
        "u": 0,
        "user": "10001"
    },
    {
        "d": 0,
        "enable": 1,
        "method": "aes-128-cfb",
        "obfs": "tls1.2_ticket_auth_compatible",
        "passwd": "4~fGiKeY",
        "port": 100002,
        "protocol": "auth_sha1_v4",
        "transfer_enable": 10737418240,
        "u": 0,
        "user": "100002"
    }
]


在以上例子中,端口12345是多用户端口(可看成一个公共用户,但无法直接使用),有两个子用户,一个是10001,一个是100002,而10001用户,既可以使用10001端口,也能通过多用户方式使用12345端口。而100002用户只能使用端口12345。在使用端口12345时,实际的使用流量会统计到10001或100002上。

其它:在使用mujson_mgr.py脚本添加协议参数时请使用-G且参数使用英文双引号包起来
如有不明白可留言问

65 comments:

  1. 越来越DIO
    (⁄ ⁄•⁄ω⁄•⁄ ⁄)

    ReplyDelete
  2. 小姐姐车技越来越接近秋名山车神了

    ReplyDelete
  3. 赞!不知性能如何

    ReplyDelete
  4. 我爱姐姐,真高手!

    ReplyDelete
  5. 非常感谢,辛苦分享的SSR。谢谢

    ReplyDelete
  6. 像一层伪装,非ssr访问,是http或https服务。ssr访问是翻墙

    ReplyDelete
  7. 这个功能很棒,点赞

    ReplyDelete
  8. 那1000002连接的时候到底密码是哪个呢?端口填哪个呢?

    ReplyDelete
    Replies
    1. 只能用12345端口,密码写12345的,同时要写上协议参数

      Delete
    2. 那这个东西个人觉得在某种程度上就没意思了。拿来共享给一般朋友的时候本来希望通过这个实现隐藏真实端口的并且单独统计流量的,看样子不行了。而且给别人用的时候这个各种参数配置越来越麻烦了。。。。。

      Delete
    3. 你在开玩笑吧?真实端口怎么可能隐藏?而且这里本来就是单独统计流量啊。至于说麻烦,直接扫码或复制一下SSR链接不就好了,为什么要自己填呢

      Delete
  9. 1. "transfer_enable": 10737418240 是干什么 ?
    2.100002用户只能使用端口12345。没看出配置的差别……为什么100002不能使用100002端口

    ReplyDelete
    Replies
    1. 因为没有100002这种端口

      Delete
    2. transfer_enable是可以使用的总流量,单位是字节

      Delete
    3. 能不能不限制流量呢?自用服务器只是分享几个朋友,这里写0?还是写个永远用不到的流量lol

      Delete
    4. 默认值1125899906842624等于1024T或1P,如果你每秒10M不停的用,也要跑三年,如果每秒1M,那得跑三十年。如果写0,那么等于禁用了

      Delete
  10. 稍微尝试了一下,提出两点想法:
    1.如果知道密码但是不知道协议参数,第三方能否对数据包进行解密?
    2.能否让各用户使用不同的密码?(懒癌末期)

    ReplyDelete
    Replies
    1. 目前主要在探索可行性和隐匿性,密码学上的安全性如果要考虑的话有点麻烦,所以现在的实现是可以解密大部分数据,但关键的认证和偏移无法解密,除非知道协议参数的密码
      协议参数上的密码各用户不同,端口上设置的加密密码只能每人都一样

      Delete
  11. 在不打算让用户使用公共端口之外的端口时,我发现把配置文件删到只剩下d,enable,transfer_enable,u,user这几个也可以用,所以能不能新增一种添加用户的方式,使得添加用户时只需要输入协议参数,可用流量和用户id?
    大姐姐辛苦了...

    ReplyDelete
    Replies
    1. 你如果用命令来添加,那你只需要指定端口,其它全部默认值给你填好,密码随机(所以这种添加方式一直都有,你为什么要手动改)

      Delete
    2. 大概明白你的意思了,这东西优先级很低,要么你做了发PR,要么等我做完别的再说

      Delete
  12. This comment has been removed by the author.

    ReplyDelete
  13. "protocol_param": "#10001:breakwa11,100002:zhihuyaowan",这里#前面不填数字默认的是多少个用户?后面写多少就是多少?2147483647?
    更新的三段总结一下,不知理解是否正确。
    第一段:特征是passwd:vwHF%35j、port:12345和协议参数.两个用户10001和100002,每个用户必要填协议参数才行;
    第二段:特征是user:10001、passwd:E&iWmlxu和port:10001。用户10001除了可以使用第一段中的方法,也可以在客户端更改端口和密码,不填协议参数。因为id小于65535,端口port:10001存在。
    第三段:特征是user:100002、passwd:4~fGiKeY和port:100002。虽然形式上和第二段相似,但是因为“id大于65535,那么此用户仅用于多用户模式,小于等于65535时会同时监听这个端口”这个条件,所以用户ID为100002的不能像10001用户一样被监听,不存在port:100002这个端口。
    ID小于等于65535的用户,设置的端口一定要和ID一致吧。
    不知理解是否有偏差?

    ReplyDelete
    Replies
    1. #号前面不填默认是64,后面的port想写多少就多少

      10001用户如果使用端口10001,就要按照10001的配置使用auth_sha1_v4协议

      配置文件中ID只是为了方便记忆和针对性使用命令用的,如果你需要的话。ID本身没有任何意义,程序里只管唯一的编号port。也建议直接用-p命令,不需要使用-u

      你的其它理解应该都是正确的

      Delete
  14. 能不能实现查看用户打开的连接???

    ReplyDelete
    Replies
    1. 服务端可以显示每个连接的连接信息,但如果要具体到哪个用户,服务端还没做这个功能,之后会补充

      Delete
  15. 看了大大的单端口多用户,非常开心,大大辛苦了,我按照您的要求设置了2个用户,可以通过最新的3.3.3安卓客户端在填写了协议参数后同时连接使用,但是我发现在路由器上的客服端却没有协议参数填写的地方,以前那种通过直接填写密码登录的方式已经连接不上了,请问是不是路由器的客服端也要更新?以后登录的方式都需要通过协议参数填写的方式连接?在使用一天以后我的两个账户中的一个不能连接了,另一个却使用的很好,不知道为什么?求大大解答!谢谢!

    ReplyDelete
  16. 看了大大的单端口多用户,非常开心,大大辛苦了,我按照您的要求设置了2个用户,可以通过最新的3.3.3安卓客户端在填写了协议参数后同时连接使用,但是我发现在路由器上的客服端却没有协议参数填写的地方,以前那种通过直接填写密码登录的方式已经连接不上了,请问是不是路由器的客服端也要更新?以后登录的方式都需要通过协议参数填写的方式连接?在使用一天以后我的两个账户中的一个不能连接了,另一个却使用的很好,不知道为什么?求大大解答!谢谢!

    ReplyDelete
    Replies
    1. 路由器版本你需要等开发者更新,使用多用户的端口时,必须都要填写协议参数

      不能连接的问题你查看一下log看看,因为文章里的配置文件示例那两个用户的可使用流量一个是1G,一个是0.5G,你照抄的话会导致很快超流量就会停止

      Delete
    2. 我是用您的第一种方法添加的就是 "protocol": "auth_aes128_sha1",
      "protocol_param": "64#12345:breakwa11,233:zhihuyaowan",这个样子好像没有流量限制吧?查看了下日志,也没看出来所以然,就直接重新安装了,还是按照老样子设置的2个用户,又能够正常连接了,先看看吧,如果过2天又有一个用户无法连接的话,再来请教您!谢谢~

      Delete
  17. 为什么BitTorrent Sync同步不了客户端呢

    ReplyDelete
  18. {
    "server": "0.0.0.0",
    "server_ipv6": "::",
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "timeout": 120,
    "udp_timeout": 60,
    "obfs": "tls1.2_ticket_auth_compatible",
    "obfs_param": "",
    "dns_ipv6": false,
    "connect_verbose_info": 0,
    "redirect": "",
    "fast_open": false
    [
    {
    "d": 0,
    "enable": 1,
    "method": "chacha20",
    "obfs": "http_simple",
    "passwd": "12345678",
    "port": 8080,
    "protocol": "auth_aes128_sha1",
    "protocol_param": "#80:fuckgfw,20170116:fuckgfw",
    "transfer_enable": 1125899906842624,
    "u": 0,
    "user": "8080"
    },
    {
    "d": 0,
    "enable": 1,
    "method": "chacha20",
    "obfs": "http_simple",
    "passwd": "123456789",
    "port": 80,
    "protocol": "auth_sha1_v4",
    "transfer_enable": 5368709120000,
    "u": 0,
    "user": "80"
    },
    {
    "d": 0,
    "enable": 1,
    "method": "chacha20",
    "obfs": "http_simple",
    "passwd": "1234567890",
    "port": 20170116,
    "protocol": "auth_sha1_v4",
    "transfer_enable": 107374182400000,
    "u": 0,
    "user": "20170116"
    }
    ]
    }

    能帮我看下我这个配置文件哪里有错么?没碰过linux,以前就靠着google搭了个一键包ssr,实在是有点吃力。我用python mujson_mgr.py -a -p 这样子弄了3个端口,80,8080,20170116。用./tail.sh显示错误 delimiter: line 14 column 1 (char 317)
    谢谢了

    ReplyDelete
    Replies
    1. 你搞错了,后文说的是mudbjson方式,需要使用命令行添加用户,请看wiki
      配置文件中不支持写后文的内容

      Delete
    2. 这样子啊,完全用python mujson_mgr.py来完成配置?那你这个配置示例是哪个文件里呢?

      Delete
    3. 啊,找到了,谢谢,我先试试

      Delete
    4. "d": 1877367
      "u": 142252,
      这两行是什么含义呢?
      谢谢

      Delete
    5. 上传和下载的字节数

      Delete
    6. 嗯嗯,谢谢了
      win版和安卓版用同一个配置同时连接成功了
      还有一个问题,我开了3个端口,80,8080,20170117
      8080是设置成多用户端口,20170117只能用8080连接,但是80端口可以同时用8080和80端口连,用80端口连接时,可以不填协议参数是这个意思吧?但是我实际测试时,直接用80端口连接不成功,不管加不加参数,反倒是我另外开了个9020端口,没有加入第一个多用户端口8080的协议配置中,直接成功了。

      Delete
    7. 检查你的80端口有没有异常,包括防火墙,及LOG有没有错误,以及配置正不正确

      Delete
  19. This comment has been removed by the author.

    ReplyDelete
  20. 2017-01-17 18:43:21 INFO asyncdns.py:324 dns server: [('108.61.10.10', 53)]
    2017-01-17 18:43:21 INFO shell.py:80 ShadowsocksR 3.0.2 2017-01-08
    2017-01-17 18:43:21 INFO db_transfer.py:227 current process RLIMIT_NOFILE resource: soft 512000 hard 512000
    2017-01-17 18:43:21 ERROR db_transfer.py:244 Traceback (most recent call last):
    File "/root/shadowsocksr/db_transfer.py", line 237, in thread_db
    rows = db_instance.pull_db_all_user()
    File "/root/shadowsocksr/db_transfer.py", line 351, in pull_db_all_user
    import cymysql
    ImportError: No module named cymysql

    昨天晚上还没问题,今天准备部署nginx加SSR试试,还没安装LNMP,刚部署完SSR测试出这个问题,求解~感觉步骤和昨天一样没区别啊

    ReplyDelete
    Replies
    1. 麻烦看看wiki,你步骤少了

      Delete
    2. 找到问题了,wiki里这段
      shadowsocksr目录内,对config.py里以下内容进行相应修改:

      我改了apiconfig.py
      应该是改userapiconfig.py

      Delete
    3. 又来麻烦你了,有个疑问,我nginx监听8888端口,然后user-config.json设置redirect 127.0.0.1:8888,这里正常了,但是userapiconfig.py里面设置的适配mudbjson,那我应该用什么面板呢?刚看了下你blog,是目前没面板只是端口能够自适应SSR代理或者http访问的意思?

      Delete
    4. 又出一个奇怪的问题,如果我设置多用户端口8080,同时设置里重定向127.0.0.1:8888这个nginx端口,一切正常,网页能访问,SSR代理也能连上正常使用。但是换80端口,完全同样设置,就只能访问网页,SSR无法连接,win客户端显示错误。这个太奇怪了-_-nginx监听的是8888端口。问题太多都不好意思了,感谢

      Delete
    5. wiki已修正,mudbjson没有面板

      Delete
  21. 明白了那暂时不用纠结nginx的事了,先用着后端,ps wiki你json多用户版还没改

    ReplyDelete
    Replies
    1. 什么东西没改?你是指这文章里的内容吗?还是哪里有错误?

      Delete
    2. 你wiki里面,那段
      shadowsocksr目录内,对config.py里以下内容进行相应修改:

      json版多用户教程里还没有修改,只改了数据库多用户教程

      Delete
  22. 抱歉又来了,我找到80端口没法访问的问题了,我习惯用http_simple混淆,服务器配置了http_simple之后,客户端设置http_simple没法连,但是我无意间设置成了http_post,一下就连上了。这个是bug?还是对http_simple混淆不提供支持了?

    ReplyDelete
  23. 测试了一圈,只有80需要选http_post,同设置其他端口选http_simple没问题,而且80端口延迟是其他端口延迟一倍,win客户端显示用其他端口延迟是113,80是233。好奇怪的感觉

    ReplyDelete
    Replies
    1. 说明你的80和443都出现了限制了

      Delete
    2. 谢谢,这两天打扰了,LNMP+SSR现在一切正常。
      刚测了下速,其他端口能稳定播放Youtube 4K,80端口只能1080p,看来是我这里运营商问题咯?

      Delete
  24. cilent中协议参数可以留空吗(Shadowsocks server非自搭,提供商只提供了协议和混淆方式可以)

    ReplyDelete
  25. 80端口建站和走ssr,原本网站主页能正常打开自打配置完nginx.conf后ssr正常但主页却不行了 姐给看看
    server {
    listen 8080;
    server_name _;

    location / {
    proxy_pass http://127.0.0.1:8080;
    }
    }

    ReplyDelete