Sunday, January 8, 2017

ShadowsocksR单端口多用户配置方法

此文更新于2017-02-21,如你早于这个时间部署,可能要升级后端

如果你要尝试这个新功能,首先把服务端和客户端均更新到最新,客户端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客户端连接就成了服务端了。不过注意的是这时候最好要开相应的混淆哦ヽ(´▽`)ノ

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

第二部分:使用mudbjson模式配置(适合单服务器多人合用或试用服务器)
2017-02-21更新:
现mudbjson模式多用户已支持,简要说明如下:
首先先创建对应的用户id,如果这个id大于65535,那么此用户仅用于多用户模式,小于等于65535时会同时监听这个端口。然后创建多用户端口,相应的protocol_param里就填写"#"就行了,以下是配置示例:

[
    {
        "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": "#",
        "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上。注意的是用户10001在配置客户端使用多用户端口12345的话,配置密码为"vwHF%35j",即除了协议参数均填写此端口的配置,仅协议参数改为"10001:E&iWmlxu"即可。

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

第三部分:使用面板支持(适合站长多服务器下使用)
2017-01-24更新:
现在已经有支持此单端口多用户的面板及相应的后端,具体参见 https://github.com/esdeathlove/ss-panel-v3-mod

2017-02-21更新:
如果使用老面板,包括sspanel和WHMCS等,后端更新到最新后,那么可以在user-config.json内,修改或添加如下字段
"additional_ports" : {
    "6666": {
        "passwd": "pubpassword",
        "method": "aes-128-ctr",
        "protocol": "auth_aes128_md5",
        "protocol_param": "#",
        "obfs": "tls1.2_ticket_auth_compatible",
        "obfs_param": ""
    }
},
其中6666是那个端口(如果要设置多个,就additional_ports内再添加一个,注意逗号分隔),protocol必须为auth_aes128_md5或auth_aes128_sha1,protocol_param只需且必须写一个#。(直接复制以上内容时记得修改密码配置)

第四部分:高级端口转发
如果设置多个多用户端口,想设置不同端口不同的转发规则以最大化伪装为其它服务,例如开了80端口和443端口作为多用户端口(以additional_ports方式作为示例):
"additional_ports" : {
    "80": {
        "passwd": "pubpassword",
        "method": "aes-128-ctr",
        "protocol": "auth_aes128_md5",
        "protocol_param": "#",
        "obfs": "tls1.2_ticket_auth_compatible",
        "obfs_param": ""
    },
    "443": {
        "passwd": "pubpassword",
        "method": "aes-128-ctr",
        "protocol": "auth_aes128_md5",
        "protocol_param": "#",
        "obfs": "tls1.2_ticket_auth_compatible",
        "obfs_param": ""
    }
},
同时本地的nginx/apache开启端口1080和1443,那么在user-config.json里修改如下参数:
"redirect" : ["*:80#127.0.0.1:1080", "*:443#127.0.0.1:1443"],

配置好后,直接访问80或443端口,将是个正常的网站,用SSR去连接则为代理服务。
其它:nginx的rewrite规则默认会使用监听的端口,这时会导致rewrite有问题,需要指定一下端口号

79 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
    Replies
    1. This comment has been removed by the author.

      Delete
    2. 信息不足,无法判断

      Delete
    3. 是2个文件,你少改一个
      vi /usr/local/nginx/nginx.conf
      vi /usr/local/nginx/vhost/域名.conf

      Delete
  26. 请问如果安装 sspanel mod,那userapiconfig.py里是不是应该改为sspanl而不是mudbjson?

    ReplyDelete
    Replies
    1. 不是,需要用mod版本的后端

      Delete
  27. 厉害了,这么强赶紧试试

    ReplyDelete
  28. Word 天,好想跟他们说,来抓我呀来抓我呀,我在野区等你们,哈哈哈哈

    ReplyDelete
  29. 请问少女能给个选项限制流速吗?

    ReplyDelete
    Replies
    1. 感谢 美少女 @Breakwa11 转眼就有流速控制了

      Delete
  30. {
    "d": 0,
    "enable": 1,
    "method": "chacha20",
    "obfs": "tls1.2_ticket_auth",
    "passwd": "jackyweiwlsx!",
    "port": 80,
    "protocol": "auth_aes128_md5",
    "protocol_param": "16#8387,qicai,1688:test,65536:simon,8080:love,443:jacky,8388:wlsxpc,8338:wlsxphone,65535:oters",
    "transfer_enable": 1125899906842624,
    "u": 0,
    "user": "1"
    },
    {
    "d": 0,
    "enable": 1,
    "method": "chacha20",
    "obfs": "tls1.2_ticket_auth",
    "passwd": "jackyweiwlsx.",
    "port": 8388,
    "protocol": "auth_aes128_md5",
    "transfer_enable": 1125899906842624,
    "u": 0,
    "user": "wlsxpc"
    },


    配置后只能用8388的端口,用80的端口上不去,不知道是不是客户端设置哪里有问题……协议参数写8388:wlsxpc还是不行,密码用jackyweiwlsx!和jackyweiwlsx.都连接不了

    ReplyDelete
    Replies
    1. 求教一下破娃姐姐,我该怎么做

      Delete
    2. 配置方式简化了,见更新的文章内容

      Delete
    3. 找到原因了,我另一个VPS正常,不行的那个是之前折腾了Apache导致端口被占用

      Delete