Pages

Friday, 21 April 2017

shadowsocks-manager

A shadowsocks manager tool for multi user and traffic control.
Base on Node.js and SQLite.
For more details, you can see the wiki page.
If you want to use the old version, please switch to this branch.

WebGUI Demo:

https://wall.gyteng.com

Dependencies

Node.js 6.*

Install

From source:

git clone https://github.com/shadowsocks/shadowsocks-manager.git
cd shadowsocks-manager
npm i
use node server.js to run this program.

From npm:

npm i -g shadowsocks-manager
use ssmgr to run this program.

From docker:

docker run --name ssmgr -idt -v ~/.ssmgr:/root/.ssmgr --net=host gyteng/ssmgr [ssmgr params...]

Build docker image:

here is the Dockerfile
FROM ubuntu:16.04
MAINTAINER gyteng <igyteng@gmail.com>
RUN apt-get update && \
    apt-get install curl git sudo -y && \
    curl -sL https://deb.nodesource.com/setup_6.x | bash - && \
    apt-get install -y nodejs && \
    npm i -g shadowsocks-manager && \
    git clone https://github.com/shadowsocks/shadowsocks-libev.git ~/shadowsocks && \
    mkdir -p ~/build-area/ && \
    cp ~/shadowsocks/scripts/build_deb.sh ~/build-area/ && \
    cd ~/build-area && \
    ./build_deb.sh
ENTRYPOINT ["/usr/bin/ssmgr"]

Usage

  1. Start shadowsocks with manager API, it supports shadowsocks-python and shadowsocks-libev. For example, you can run this command:
    ss-manager -m aes-256-cfb -u --manager-address 127.0.0.1:6001
  2. run ssmgr with type s:
config file:
type: s
empty: false
shadowsocks:
  address: 127.0.0.1:6001
manager:
  address: 0.0.0.0:4001
  password: '123456'
db: 'ss.sqlite'
If you want to use MySQL, the db must like this:
db:
  host: '1.1.1.1'
  user: 'root'
  password: 'abcdefg'
  database: 'ssmgr'
And you have to close only_full_group_by when the version of MySQL is greater than 5.7
command:
ssmgr -c /your/config/file/path.yml
  1. If you have several servers, you have to run step 1 and step 2 in every server.
    The listening address in --manager-address of step 1 and in shadowsocks -> address of step 2's config file must be same. For security reseon, we recommend you to use 127.0.0.1 instead of 0.0.0.0.
  2. Now you can use the plugins to manage them. You can read the details in plugins readme page.
+-------------+    +-------------+       +------+
| Shadowsocks |    | Shadowsocks |  ...  |      |
| manager API |    | manager API |       |      |
+-------------+    +-------------+       +------+
       |                 |                  |
       |                 |                  |
+-------------+    +-------------+       +------+
| ssmgr       |    | ssmgr       |  ...  |      |
| with type s |    | with type s |       |      |
+-------------+    +-------------+       +------+
       |                 |                  |
       +------------+----+--------  ...  ---+
                    |
                    |
             +---------------+
             | ssmgr plugins |
             |  with type m  |
             +---------------+

Plugins

[================100%] cli
[================100%] telegram
[================100%] flowSaver
[================100%] email
[================100%] user
[================100%] freeAccount
[================100%] account
[===============90%--] webgui
[================100%] alipay

Parameter

ssmgr --help will show startup parameters info.
Usage: ssmgr [options]

  Options:

    -h, --help                   output usage information
    -V, --version                output the version number
    -c, --config [file]          config file, default: ~/.ssmgr/default.yml
    -d, --db [file]              sqlite3 file, sample: ~/.ssmgr/db.sqlite
    -e, --empty                  clean database
    -t, --type [type]            type, s for server side, m for manager side
    -s, --shadowsocks [address]  ss-manager address, sample: 127.0.0.1:6001
    -m, --manager [address]      manager address, sample: 0.0.0.0:6002
    -p, --password [password]    manager password, both server side and manager side must be equals
    -r, --run [type]             run shadowsocks from child_process, sample: libev / libev:aes-256-cfb / python / python:aes-256-cfb
    --debug                      show debug message
First, ssmgr will read the config file in --config, and other parameters(-detsmp) will replace the config file values.

Telegram

Join the group if you have some problem: https://t.me/joinchat/AAAAAAocQVv8fK_K6JDBgw

from  https://github.com/shadowsocks/shadowsocks-manager
------------

从零开始做SS奸商 - 使用 Shadowsocks Manager 搭建 SS 多人管理平台


首先你至少需要一台 512M 内存以上的 VPS,最好是基于 KVM/XEN 平台,当然 OVZ 也行,操作系统选择 Debian 8 x64,并使用 root 帐号登入
您可以试试这几个提供商: Linode (1G 内存 5 刀/月)、Vultr.com (512M 内存 2.5 刀/月)、GCE (信用卡认证后送 1 年有效 300 刀代金券,低配 5 刀/月 + 0.23刀/GB 到中国区流量)

1、 更新 VPS 及安装必要软件

apt-get update && apt-get install vim git curl supervisor build-essential -y

安装 Nodejs、Nginx、Shad0ws0cks-libev、Shad0ws0cks Manager:
curl -sL https://deb.nodesource.com/setup_6.x | bash - 
&& curl -L http://nginx.org/keys/nginx_signing.key | apt-key add - 
然后,
nano /etc/apt/sources.list
粘贴下方内容:
deb http://httpredir.debian.org/debian jessie-backports main  
deb http://nginx.org/packages/mainline/debian/ jessie nginx  
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx  
然后,
apt-get update && apt-get install nginx nodejs -y && apt -t jessie-backports install shadowsocks-libev -y 
&& npm i -g pm2 && git clone https://github.com/shadowsocks/shadowsocks-manager ssm && cd ssm && npm i

2、 配置 Shad0ws0cks Manager

vim /etc/supervisor/conf.d/ss-manager.conf
i 进入编辑模式,粘贴下方内容
[program:ss-manager] 
command=ss-manager -m aes-256-cfb -u --manager-address 127.0.0.1:2397  
autorestart=true  
user=root  
Esc 输入 :wq 保存并退出,再运行
supervisorctl reload
重启 Supervisor,接下来配置 SSM 管理端
mkdir ~/.ssmgr && vim ~/.ssmgr/ss.yml
i 进入编辑模式,粘贴下方内容
type: s  
empty: false  
shadowsocks:  
  address: 127.0.0.1:2397
manager:  
  address: 0.0.0.0:2398
  password: 'passwd'
  # 更改为你自己的密码
db: 'ss.sqlite'  
Esc 输入 :wq 保存并退出。
pm2 --name "ssm" -f start /root/ssm/server.js -x -- -c ss.yml
然后进行配置 webui 端:
vim ~/.ssmgr/webgui.yml
i 进入编辑模式,粘贴下方内容
type: m  
empty: false

manager:  
  address: 127.0.0.1:2398
  password: 'passwd'
  # 这部分的端口和密码需要跟上一步 manager 参数里的保持一致
plugins:  
  flowSaver:
    use: true
  user:
    use: true
  account:
    use: true
    pay:
      hour:
        price: 0.03
        flow: 500000000
      day:
        price: 0.5
        flow: 7000000000
      week:
        price: 3
        flow: 50000000000
      month:
        price: 10
        flow: 200000000000
      season:
        price: 30
        flow: 200000000000
      year:
        price: 120
        flow: 200000000000
  email:
    use: true
    username: 'cat-mail@mailgun.org'
    password: 'passwd'
    host: 'smtp.mailgun.org'
    # 这部分的邮箱和密码是用于发送注册验证邮件,重置密码邮件使用的,推荐使用 Mailgun.com
  webgui:
    use: true
    host: '0.0.0.0'
    port: '8088'
    site: 'https://cat.con.sh'
    # 改成你自己的域名
    gcmSenderId: '456102641793'
    gcmAPIKey: 'AAAAGzzdqrE:XXXXXXXXXXXXXX'
  alipay:
    use: false
    # 若要使用支付宝收款,请自己研究
    appid: 2015012108272442
    notifyUrl: ''
    merchantPrivateKey: 'xxxxxxxxxxxx'
    alipayPublicKey: 'xxxxxxxxxxx'
    gatewayUrl: 'https://openapi.alipay.com/gateway.do'

db: 'webgui.sqlite'  
Esc 输入 :wq 保存并退出。
pm2 --name "webgui" -f start /root/ssm/server.js -x -- -c webgui.yml
配置 PM2 使它开机启动
pm2 save && pm2 startup

3、 配置 Nginx

安装 acme.sh
curl -L get.acme.sh | bash -
签发 SSL 证书,签发前将你的域名解析至你 VPS 的 IP
service nginx stop && /root/.acme.sh/acme.sh --issue --standalone -d cat.con.sh
cat.con.sh 换成你的域名,签发成功后会得到证书的地址形如
[Mon Mar 27 13:16:31 UTC 2017] Your cert is in  /root/.acme.sh/cat.con.sh/cat.con.sh.cer
[Mon Mar 27 13:16:31 UTC 2017] Your cert key is in  /root/.acme.sh/cat.con.sh/cat.con.sh.key
[Mon Mar 27 13:16:31 UTC 2017] The intermediate CA cert is in  /root/.acme.sh/cat.con.sh/ca.cer
[Mon Mar 27 13:16:31 UTC 2017] And the full chain certs is there:  /root/.acme.sh/cat.con.sh/fullchain.cer
其中
/root/.acme.sh/cat.con.sh/cat.con.sh.key
是你的密钥
/root/.acme.sh/cat.con.sh/fullchain.cer
是你的全证书链,这两个是我们需要的
然后编辑 Nginx 配置文件
vim /etc/nginx/conf.d/ss.conf
i 进入编辑模式,粘贴下方内容,将其中的 cat.con.sh 换成你的域名:
server {  
  listen 80;
  server_name cat.con.sh;
  rewrite ^ https://$server_name$request_uri? permanent;
}
server {  
  listen 443 ssl http2;
  server_name cat.con.sh;
  ssl on;
  ssl_certificate /root/.acme.sh/cat.con.sh/fullchain.cer;
  ssl_certificate_key /root/.acme.sh/cat.con.sh/cat.con.sh.key;
  location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
      proxy_pass http://127.0.0.1:8088;
  }
}
Esc 输入 :wq 保存并退出。
service nginx start
然后访问你的域名,注册的第一个用户会是管理员。

4、 其他

  • 安装 BBR、锐速:自己研究.

供演示用的站点:
-------------------------------------------------------------------


酷炫的SS管理程序SS-Manager之服务器端部署教程

部署准备

本文用于部署SS-Manager的主控端,也就是销售网站前端,在开始部署之前,请先确保你符合以下条件,如果任意一项不满足,请不要继续本教程。

    一台已经完成部署的SSMGR节点端
    一个SMTP发件服务。(企业邮箱SMTP服务需要开启)
    至少 512 MB 内存。
    一个纯净的系统。

如果你满足以上条件,那么可以开始下面的主控端部署教程。
依赖安装

直接复制运行就好了
Debian/Ubuntu

    apt-get -y update
    apt-get -y install wget curl screen nano

CentOS/RHEL

    yum install -y wget curl screen nano

安装NodeJS

不多说,NodeJS是运行必要的语言环境
32位的系统使用:

    mkdir /usr/local/nodejs
     wget -N --no-check-certificate https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x86.tar.gz
     tar -xf node-v6.9.1-linux-x86.tar.gz -C /usr/local/nodejs/
     rm -rf node-v6.9.1-linux-x86.tar.gz
     ln -s /usr/local/nodejs/node-v6.9.1-linux-x86/bin/node /usr/local/bin/node
     ln -s /usr/local/nodejs/node-v6.9.1-linux-x86/bin/npm /usr/local/bin/npm

64位的系统使用:

    mkdir /usr/local/nodejs
    wget -N --no-check-certificate https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.gz
     tar -xf node-v6.9.1-linux-x64.tar.gz -C /usr/local/nodejs/
     rm -rf node-v6.9.1-linux-x64.tar.gz
     ln -s /usr/local/nodejs/node-v6.9.1-linux-x64/bin/node /usr/local/bin/node
     ln -s /usr/local/nodejs/node-v6.9.1-linux-x64/bin/npm /usr/local/bin/npm

NodeJS6就安装完成了。
安装SS-Manager

    npm i -g shadowsocks-manager
    ln -s /usr/local/nodejs/node-v6.9.1-linux-x64/bin/ssmgr /usr/local/bin/ssmgr

配置SS-MGR主控端信息

首先创建配置文件夹,编辑配置文件

    mkdir -p ~/.ssmgr/
    nano ~/.ssmgr/webgui.yml

请将下面的配置文件完整复制粘贴,并且按照其中的提示进行修改,请不要删减空格,否则会出错!

    type: m
    empty: false
    
    manager:
      address: 127.0.0.1:4001 #这里请将127.0.0.1和4001 设置为你节点服务器的IP和端口
      password: '123456' #这里请讲 123456 设置为你的节点服务器SSMGR的密码,请注意两边需要 ' 包含起来
    plugins:
      flowSaver:
        use: true
      user:
        use: true
      account:
        use: true
        pay:
          hour:
            price: 0.03
            flow: 500000000
          day:
            price: 0.5
            flow: 7000000000
          week:
            price: 3
            flow: 50000000000
          month:
            price: 10
            flow: 200000000000
          season:
            price: 30
            flow: 200000000000
          year:
            price: 120
            flow: 200000000000
      email:
        use: true
        username: 'admin@admin.com' #这里请填写你的发件服务器的完整邮箱地址,请注意两边需要 ' 包含起来
        password: '123456' #这里请改为你发件邮箱的密码,请注意两边需要 ' 包含起来
        host: 'smtp.mxhichina.com' #这里请注意改为你的发件服务器的SMTP发件地址,请注意两边需要 ' 包含起来
      webgui:
        use: true
        host: '0.0.0.0'
        port: '80'
        site: 'ss.com' #这里请输入你的网站域名,不需要填写http:// ,请注意两边需要 ' 包含起来
        gcmSenderId: '456102641793'
        gcmAPIKey: 'AAAAGzzdqrE:XXXXXXXXXXXXXX'
      alipay:
        use: true
        appid: 2015012108272442
        notifyUrl: ''
        merchantPrivateKey: 'xxxxxxxxxxxx'
        alipayPublicKey: 'xxxxxxxxxxx'
        gatewayUrl: 'https://openapi.alipay.com/gateway.do'
    #如果想起用支付宝当面付接口,可以配置上方的信息。当然也可以不填写,就无法付款
    db: 'webgui.sqlite'

修改完成后请保存退出。nano 的保存退出方法:按一下 Ctrl + X键,输入Y,然后回车。
运行主控端服务

下面我们运行下主控端服务,测试下到底有没有配置成功。

    cd ~/.ssmgr
    ssmgr -c webgui.yml

如果没有命令立刻退出,而是处于长期等待过程,那么表示配置文件没有错误,按下 Ctrl + C 可以进行下一步。否则请检查你的配置文件。
开启80端口

网页访问默认是80端口,这里我贴出一段开放80端口的防火墙规则,适用于 Debian/Ubuntu/CentOS6

    iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    iptables -I INPUT -m state --state NEW -m udp -p udp --dport 80 -j ACCEPT

后台保持运行SSMGR主控端

确定配置没有问题后可以这样使得主控端后台持续运行。

    cd ~/.ssmgr
    screen -dmS webgui ssmgr -c webgui.yml
    cd ..

这东西虽然看起来很酷炫,但是因为是nodejs,所以弄起来不比sspanel简单。而且小白想理解他的工作原理很困难,所以很容易出现乱改配置的问题。
---------

部署 shadowsocks-manager

shadowsocks-manager 是一个 Shadowsocks 多用户及流量管理面板。
本文操作在 root 账户下进行,如使用非 root 账户请自行注意权限。

概述

shadowsocks-manager 分别有 m 和 s 两种运行模式(type),type s 运行于后端 shadowsocks 服务器,type m 运行于前端向用户及管理员提供 webgui 页面并通过与后端 type s 通讯以实现对后端 shadowsocks 服务的管理。

安装 shadowsocks-manager

前后端服务器均需安装 shadowsocks-manager,该程序依赖 Node.js 6.x 运行。

Node.js 6.x 安装

运行下面命令安装 Node.js 6.x 版本:
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ apt-get install -y nodejs

shadowsocks-manager 安装

通过 npm 安装 shadowsocks-manager:
$ npm i -g shadowsocks-manager

配置后端 shadowsocks 服务

shadowsocks-manager 支援 shadowsocks-python 及 shadowsocks-libev,并强烈推荐使用 shadowsocks-libev 作为后端,下文以 shadowsocks-libev 为例。

安装 shadowsocks-libev

Ubuntu 16.10 以上用户可直接通过 apt 安装:
$ apt-get install shadowsocks-libev
Ubuntu 16.04 用户则需要通过官方 repo 脚本安装,首先获取源代码:
$ git clone https://github.com/shadowsocks/shadowsocks-libev.git
$ cd shadowsocks-libev
$ git submodule update --init --recursive
然后运行脚本:
$ mkdir -p ~/build-area/
$ cp ./scripts/build_deb.sh ~/build-area/
$ cd ~/build-area
$ ./build_deb.sh

运行 shadowsocks-libev

运行命令启动 shadowsocks-libev 的 manager API 服务:
$ ss-manager -m aes-256-cfb -u --manager-address 127.0.0.1:4000
其中 -m 参数为加密方式,--manager-address 参数为 API 监听地址。
若使用 shadowsocks-python 版本,则此处 manager API 命令可能需作修改。

运行 type s 的 shadowsocks-manager

在 ~/.ssmgr 下建立 ss.yml 作为 type s 的配置文件:
$ mkdir ~/.ssmgr
$ vim ~/.ssmgr/ss.yml
配置内容如下:
type: s
empty: false

shadowsocks:
    address: 127.0.0.1:4000

manager:
    address: 0.0.0.0:4001
    password: 'YOURPASSWD'

db: 'ss.sqlite'
此配置文件中的 shadowsocks 部分负责与 shadowsocks-libev 的 manager API 服务进行通讯,所以其中的 address 需要与上文中的 API 监听地址保持一致。
manager 部分负责与前端的 shadowsocks-manager type m 进行通讯,若前端 type m 与后端 type s 在同一服务器上可修改 address 为 127.0.0.1:4001 只监听本机通讯,若不在同一服务器则保持原样(端口可自行修改只需注意与后文一致);password 部分自行修改确保安全。
配置完成后运行以下命令开启 shadowsocks-manager type s:
$ ssmgr -c ss.yml

配置前端 webgui 服务

在 ~/.ssmgr 下建立 webgui.yml 作为 type m 的配置文件:
$ mkdir ~/.ssmgr
$ vim ~/.ssmgr/webgui.yml
配置内容如下:
type: m
empty: false

manager:
    address: <后端地址>:4001
    password: 'YOURPASSWD'

plugins:
    flowSaver:
        use: true
    user:
        use: true
    account:
        use: true
        pay:
            hour:
                price: 0.03
                flow: 500000000
            day:
                price: 0.5
                flow: 7000000000
            week:
                price: 3
                flow: 50000000000
            month:
                price: 10
                flow: 200000000000
            season:
                price: 30
                flow: 200000000000
            year:
                price: 120
                flow: 200000000000
    email:
        use: true
        username: 'username'
        password: 'password'
        host: 'smtp.your-email.com'
    webgui:
        use: true
        host: '0.0.0.0'
        port: '80'
        site: '<站点地址>'
        gcmSenderId: '456102641793'
        gcmAPIKey: 'AAAAGzzdqrE:XXXXXXXXXXXXXX'
    alipay:
        use: true
        appid: <支付宝 APPID>
        notifyUrl: ''
        merchantPrivateKey: '<rsa_private_key.pem 中的私钥>'
        alipayPublicKey: '<支付宝公钥>'
        gatewayUrl: 'https://openapi.alipay.com/gateway.do'

db: 'webgui.sqlite'
其中 manager 部分负责与 type s 进行通讯,将 address 设置为运行 type s 的服务器公网地址,另外注意 address 端口部分及 password 需要与前文中 type s 部分的设置保持一致。
plugins 部分设置了站点大部分插件配置:
  • account 中的 pay 用于设置定价。
  • email 负责发送验证及密码找回邮件,可使用 Mailgun 服务配置
  • webgui 负责 webgui 的输出,site 设置为本站点地址,如果没有特别需求可直接按配置中的 80 端口直接对外提供访问。
  • alipay 为支付宝商家当面付接口,可按照 V2EX 贴文指引进行申请签约。签约完成后到蚂蚁金服开放平台密钥页面按照指示完成「RSA(SHA1) 密钥」的设置,将生成的 rsa_private_key.pem 中的私钥填入 merchantPrivateKey,网页中提供的「支付宝公钥」填入 alipayPublicKey,并将 APPID 填入 appid
配置完成后运行以下命令开启 shadowsocks-manager type m:
$ ssmgr -c webgui.yml
此时已经可以通过浏览器访问 http://<前端服务器 IP>:<预设端口> 查看 shadowsocks-manager 是否部署成功,网站架设后注册的首个账户即为管理员身份。

额外

使用 MySQL 替换 SQLite

若需要使用 MySQL 替换默认的 SQLite 作为数据库使用,可在配置 ss.yml 及 webgui.yml 时将 db 部分替换为:
db:
    host: '<MySQL 地址>'
    user: '<MySQL 用户>'
    password: '<MySQL 密码>'
    database: '<MySQL 库名>'

提供 HTTPS 或与其他站点共存(推荐)

前文中 webgui.yml 的 plugins 部分的 webgui 配置默认使用 80 端口直接对外提供 web 访问。
但若为了安全需求要提供服务器端的 HTTPS 支持,或该服务器上需同时提供其他站点的 web 访问服务,可将此处端口变更为 80 及 443 以外的其他端口并参见通过 Apahce 或 nginx 等架设反向代理对外提供 web 服务。

后台运行

参见使用 supervisor 守护进程或项目 Wiki 页面提供的通过 pm2 后台运行
请注意使用 supervisor 守护进程中使用的 shadowsocks-manager 为旧版,配置文件均有变化。

如发生 Cannot find module … node_sqlite3.node 错误

这是由于通过 npm 安装 shadowsocks-manager 时没有成功安装依赖的 sqlite3 所导致的,到 shadowsocks-manager 安装目录补装 sqlite3 即可解决:
$ cd /usr/lib/node_modules/shadowsocks-manager/
$ npm install sqlite3 --save

No comments:

Post a Comment