显示标签为“V2ray”的博文。显示所有博文

V2ray使用TLS

1. TLS

从 v1.19 起引入了 TLS,TLS 中文译名是传输层安全,如果你没听说过,请 Google 了解一下。以下给出些我认为介绍较好的文章链接:
Shadowsocks 的作者 clowwindy 却认为翻墙不该用 SSL。那么到底该不该用?对此我不作评论,各位自行思考。这里我只教大家如何开启 TLS。

1.1. 注册一个域名

如果已经注册有域名了可以跳过。 域名有免费的有付费的,总体来说付费的会优于免费的,具体差别请 Google。如果你不舍得为一个域名每年花点钱,用个免费域名也可以。为了方便,这里我将以免费域名为例。
关于如何注册一个免费域名,我发现有一位网友写得很详细,就不多说了。请参考:
至于注册其它付费的域名请 Google 吧,差不多都是大同小异的。
注册好域名之后务必记得设置 DNS 解析到你的 VPS !
据了解,在 freenom 注册的域名在对应的 IP 上要有一个网站,否则注册之后域名会被回收。如果您只是想用免费域名在 V2Ray 用一下 TLS,又不愿意(懒得、不会)建站,建议您看看您的亲朋好友谁有手上有域名的,向他们要一个二级域名就行了
以下假设注册的域名为 mydomain.me,请将之替换成自己的域名。

1.2. 证书生成

使用 TLS 需要证书,证书也有免费付费的,同样的这里使用免费证书,证书认证机构为 Let's Encrypt。 证书的生成有许多方法,这里使用的是比较简单的方法:使用 acme.sh 脚本生成,本部分说明部分内容参考于acme.sh README
证书有两种,一种是 ECC 证书(内置公钥是 ECDSA 公钥),一种是 RSA 证书(内置 RSA 公钥)。简单来说,同等长度 ECC 比 RSA 更安全,也就是说在具有同样安全性的情况下,ECC 的密钥长度比 RSA 短得多(加密解密会更快)。但问题是 ECC 的兼容性会差一些,Android 4.x 以下和 Windows XP 不支持。只要您的设备不是非常老的老古董,强烈建议使用 ECC 证书。
以下将给出这两类证书的生成方法,请大家根据自身的情况自行选择其中一种证书类型。
证书生成只需在服务器上操作。

1.2.1. 安装 acme.sh

执行以下命令,acme.sh 会安装到 ~/.acme.sh 目录下。
$ curl  https://get.acme.sh | sh
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100   671  100   671    0     0    680      0 --:--:-- --:--:-- --:--:--   679
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100  112k  100  112k    0     0   690k      0 --:--:-- --:--:-- --:--:--  693k
[Fri 30 Dec 01:03:32 GMT 2016] Installing from online archive.
[Fri 30 Dec 01:03:32 GMT 2016] Downloading https://github.com/Neilpang/acme.sh/archive/master.tar.gz
[Fri 30 Dec 01:03:33 GMT 2016] Extracting master.tar.gz
[Fri 30 Dec 01:03:33 GMT 2016] Installing to /home/user/.acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installed to /home/user/.acme.sh/acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installing alias to '/home/user/.profile'
[Fri 30 Dec 01:03:33 GMT 2016] OK, Close and reopen your terminal to start using acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installing cron job
no crontab for user
no crontab for user
[Fri 30 Dec 01:03:33 GMT 2016] Good, bash is found, so change the shebang to use bash as preferred.
[Fri 30 Dec 01:03:33 GMT 2016] OK
[Fri 30 Dec 01:03:33 GMT 2016] Install success!
安装成功后执行 source ~/.bashrc 以确保脚本所设置的命令别名生效。
如果安装报错,那么可能是因为系统缺少 acme.sh 所需要的依赖项,acme.sh 的依赖项主要是 netcat(nc),我们通过以下命令来安装这些依赖项,然后重新安装一遍 acme.sh:
$ sudo apt-get -y install netcat

1.2.2. 使用 acme.sh 生成证书

证书生成

执行以下命令生成证书:
以下的命令会临时监听 80 端口,请确保执行该命令前 80 端口没有使用
$ sudo ~/.acme.sh/acme.sh --issue -d mydomain.me --standalone -k ec-256
[Fri Dec 30 08:59:12 HKT 2016] Standalone mode.
[Fri Dec 30 08:59:12 HKT 2016] Single domain='mydomain.me'
[Fri Dec 30 08:59:12 HKT 2016] Getting domain auth token for each domain
[Fri Dec 30 08:59:12 HKT 2016] Getting webroot for domain='mydomain.me'
[Fri Dec 30 08:59:12 HKT 2016] _w='no'
[Fri Dec 30 08:59:12 HKT 2016] Getting new-authz for domain='mydomain.me'
[Fri Dec 30 08:59:14 HKT 2016] The new-authz request is ok.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip http-01.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip http-01.
[Fri Dec 30 08:59:14 HKT 2016] Verify finished, start to sign.
[Fri Dec 30 08:59:16 HKT 2016] Cert success.
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgISA1+gJF5zwUDjNX/6Xzz5fo3lMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjEyMjkyMzU5MDBaFw0x
NzAzMjkyMzU5MDBaMBcxFTATBgNVBAMTDHdlYWtzYW5kLmNvbTBZMBMGByqGSM49
****************************************************************
4p40tm0aMB837XQ9jeAXvXulhVH/7/wWZ8/vkUUvuHSCYHagENiq/3DYj4a85Iw9
+6u1r7atYHJ2VwqSamiyTGDQuhc5wdXIQxY/YQQqkAmn5tLsTZnnOavc4plANT40
zweiG8vcIvMVnnkM0TSz8G1yzv1nOkruN3ozQkLMu6YS7lk/ENBN7DBtYVSmJeU2
VAXE+zgRaP7JFOqK6DrOwhyE2LSgae83Wq/XgXxjfIo1Zmn2UmlE0sbdNKBasnf9
gPUI45eltrjcv8FCSTOUcT7PWCa3
-----END CERTIFICATE-----
[Fri Dec 30 08:59:16 HKT 2016] Your cert is in  /root/.acme.sh/mydomain.me_ecc/mydomain.me.cer
[Fri Dec 30 08:59:16 HKT 2016] Your cert key is in  /root/.acme.sh/mydomain.me_ecc/mydomain.me.key
[Fri Dec 30 08:59:16 HKT 2016] The intermediate CA cert is in  /root/.acme.sh/mydomain.me_ecc/ca.cer
[Fri Dec 30 08:59:16 HKT 2016] And the full chain certs is there:  /root/.acme.sh/mydomain.me_ecc/fullchain.cer
-k 表示密钥长度,后面的值可以是 ec-256 、ec-2842048307240968192,带有 ec 表示生成的是 ECC 证书,没有则是 RSA 证书。在安全性上 256 位的 ECC 证书等同于 3072 位的 RSA 证书。

证书更新

由于 Let's Encrypt 的证书有效期只有 3 个月,因此需要 90 天至少要更新一次证书,acme.sh 脚本会每 60 天自动更新证书。也可以手动更新。
手动更新 ECC 证书,执行:
$ sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force --ecc
如果是 RSA 证书则执行:
$ sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force

1.2.3. 安装证书和密钥

ECC 证书

将证书和密钥安装到 /etc/v2ray 中:
$ sudo ~/.acme.sh/acme.sh --installcert -d mydomain.me --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc

RSA 证书

$ sudo ~/.acme.sh/acme.sh --installcert -d mydomain.me --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key
注意:无论什么情况,密钥(即上面的v2ray.key)都不能泄漏,如果你不幸泄漏了密钥,可以使用 acme.sh 将原证书吊销,再生成新的证书,吊销方法请自行参考 acme.sh 的手册

1.3. 配置 V2Ray

1.3.1. 服务器

{
  "inbound": {
    "port": 443, // 建议使用 443 端口
    "protocol": "vmess",    
    "settings": {
      "clients": [
        {
          "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",  
          "alterId": 64
        }
      ]
    },
    "streamSettings": {
      "network": "tcp",
      "security": "tls", // security 要设置为 tls 才会启用 TLS
      "tlsSettings": {
        "certificates": [
          {
            "certificateFile": "/etc/v2ray/v2ray.crt", //证书文件
            "keyFile": "/etc/v2ray/v2ray.key" //密钥文件
          }
        ]
      }
    }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  }
}

1.3.2. 客户端

{
  "inbound": {
    "port": 1080,
    "protocol": "socks",
    "settings": {
      "auth": "noauth"
    }
  },
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "mydomain.me",
          "port": 443,
          "users": [
            {
              "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
              "alterId": 64
            }
          ]
        }
      ]
    },
    "streamSettings": {
      "network": "tcp",
      "security": "tls" // 客户端的 security 也要设置为 tls
    }
  }
}

1.4. 验证

一般来说,按照以上步骤操作完成,V2Ray 客户端能够正常联网说明 TLS 已经成功启用。但要是有个可靠的方法来验证是否正常开启 TLS 无疑更令人放心。 验证的方法有很多,我仅介绍一种小白化一点的,便是 Qualys SSL Labs's SSL Server Test
注意:使用 Qualys SSL Labs's SSL Server Test 要求使用 443 端口,意味着你服务器配置的 inbound.port 应当是 443
打开 Qualys SSL Labs's SSL Server Test,在 Hostname 中输入你的域名,点提交,过一会结果就出来了。
这是对于你的 TLS/SSL 的一个总体评分,我这里评分为 A,看来还不错。有这样的界面算是成功了。
这是关于证书的信息。从图中可以看出,我的这个证书有效期是从 2016 年 12 月 27 号到 2017 年的 3 月 27 号,密钥是 256 位的 ECC,证书签发机构是 Let's Encrypt,重要的是最后一行,Trusted 为 Yes,表明我这个证书可信。

1.5. 温馨提醒

不要想当然地把在 SS 和 SSR 的观念带过来,更不要被别人轻飘飘的一句话误导,V2Ray 的 TLS 不是伪装!不是混淆!这是真正的 TLS!因此才需要域名需要证书。后文提到的 WS(WebSocks) 也不是伪装。

1.6. 更新历史

  • 2017-08-06 加点提醒

CentOS6 安装V2ray

#!/bin/sh
#
# v2ray        Startup script for v2ray
#
# chkconfig: - 24 76
# processname: v2ray
# pidfile: /var/run/v2ray.pid
# description: V2Ray proxy services
#

### BEGIN INIT INFO
# Provides:          v2ray
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: V2Ray proxy services
# Description:       V2Ray proxy services
### END INIT INFO

DESC=v2ray
NAME=v2ray
DAEMON=/usr/bin/v2ray/v2ray
PIDFILE=/var/run/$NAME.pid
LOCKFILE=/var/lock/subsys/$NAME
SCRIPTNAME=/etc/init.d/$NAME
RETVAL=0

DAEMON_OPTS="-config /etc/v2ray/config.json"

# Exit if the package is not installed
[ -x $DAEMON ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Source function library.
. /etc/rc.d/init.d/functions

start() {
  local pids=$(pgrep -f $DAEMON)
  if [ -n "$pids" ]; then
    echo "$NAME (pid $pids) is already running"
    RETVAL=0
    return 0
  fi

  echo -n $"Starting $NAME: "

  mkdir -p /var/log/v2ray
  $DAEMON $DAEMON_OPTS 1>/dev/null 2>&1 &
  echo $! > $PIDFILE

  sleep 2
  pgrep -f $DAEMON >/dev/null 2>&1
  RETVAL=$?
  if [ $RETVAL -eq 0 ]; then
    success; echo
    touch $LOCKFILE
  else
    failure; echo
  fi
  return $RETVAL
}

stop() {
  local pids=$(pgrep -f $DAEMON)
  if [ -z "$pids" ]; then
    echo "$NAME is not running"
    RETVAL=0
    return 0
  fi

  echo -n $"Stopping $NAME: "
  killproc -p ${PIDFILE} ${NAME}
  RETVAL=$?
  echo
  [ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE}
}

reload() {
  echo -n $"Reloading $NAME: "
  killproc -p ${PIDFILE} ${NAME} -HUP
  RETVAL=$?
  echo
}

rh_status() {
  status -p ${PIDFILE} ${DAEMON}
}

# See how we were called.
case "$1" in
  start)
    rh_status >/dev/null 2>&1 && exit 0
    start
    ;;
  stop)
    stop
    ;;
  status)
    rh_status
    RETVAL=$?
    ;;
  restart)
    stop
    start
    ;;
  reload)
    reload
  ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|reload|restart}" >&2
    RETVAL=2
  ;;
esac
exit $RETVAL
Save as /etc/init.d/v2ray and then excute:
$ sudo chmod +x /etc/init.d/v2ray
$ sudo chkconfig v2ray on
$ sudo service v2ray start

 Centos6下的部署

先说明下,V2Ray提供的一键安装脚本自带守护进程,意思是如果V2Ray如果意外中止,会自动重新启动,这样使用非常方便,但是Centos6下我这种Ctrl CV党实在是不会自己写脚本,采用的是简易运行方式,所以推荐尽量能采用2.1的步骤来安装。
首先我们打开作者的Github项目,找到最新版的V2ray的下载地址
目前最新版是v2.19,我们找到对应的v2ray-linux-64.zip文件,复制链接地址:
然后我们Root用户Putty登录服务器,root目录下下载文件,代码如下:
wget https://github.com/v2ray/v2ray-core/releases/download/v2.19/v2ray-linux-64.zip
下载完毕后,我们解压zip文件
unzip v2ray-linux-64.zip
目录下会多一个目录名,v2ray-v2.19-linux-64(版本不同目录名有版本号的差别),为了后面操作方便,我们把目录名更名
mv v2ray-v2.19-linux-64 v2ray
进入目录,并对v2ray文件授权
cd /root/v2ray
chmod +x v2ray
这时候v2ray就能使用了,但是运行v2ray,一旦关闭putty,v2ray就会自动关闭,所以我们需要后台运行,这里采用nohup的方式。
cd /root/v2ray
nohup ./v2ray &
停止V2ray服务也很简单
killall v2ray
编辑rc.local文件,添加开机启动V2ray
vi /etc/rc.d/rc.local
打开后添加两行
cd /root/v2ray
nohup ./v2ray &
到这里安装就成功了。下面我们进入下一步,编辑配置文件。

V2Ray环境搭建,支持V2Ray协议和Shadowsocks协议

原文转载自http://www.jianshu.com/p/b59150fd8f47

一、简介

V2Ray这个项目出来有一段时间了,一直有关注,不过官方文档不是很详细,而且项目改动很大。直到这几天,才发现已经发布了1.9版本,加上支持Shadowsocks协议。于是花了一个多小时时间看文档,在自己VPS搭建了一下,记下搭建过程。

二、环境

服务器:Ubuntu 14.04 LTS 256MB Ram
客户端:Mac OS X 10.11.4,Chrome浏览器,iTerm2

三、试用

发布页下载操作系统支持的相应客户端,打开命令行模式(CMD或者iTerm):
./v2ray
在Chrome浏览器SwithyOmega插件中添加代理:
SOCKS5 127.0.0.1:1080
试试看是不是能打开Google了?
或者再开一个命令行窗口,测试一下:
curl -v --socks5-hostname 127.0.0.1:1080 https://www.google.com/

四、使用自己VPS搭建

但用别人服务器有很大限制,我们把服务器地址换成自己的。
  • ssh登陆自己的vps,下载一键安装命令:
wget https://raw.githubusercontent.com/v2ray/v2ray-core/master/release/install-release.sh
  • 安装
sudo chmod +x install-release.sh
sudo ./install-release.sh
没有问题的话,已经安装好了
主程序在/usr/bin/v2ray/v2ray,配置文件在/etc/v2ray/config.json
我的系统是systemd,刚才一键安装已经设定好了,可以通过
sudo service v2ray start | stop | restart | status
来配置
PS 如果安装没有成功,可以通过文后的引用文章参考配置

五、参数配置

在配置的时候绕了很大坑,不过总算搞定了。
下面贴出设置好的,相应部分修改成自己的配置就好了:
注意
  • 配置文件中的//注释全部去掉才能正常工作,json不能加注释?第一个坑
  • 相应的ip, port, uuid建议按照自己的设置一下

v2ray-client.json

客户端配置文件,或者这里下载
{
  "port": 1080,
  "log": {
    "access": ""
  },
  "inbound": {
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
      "udp": false,
      "ip": "127.0.0.1"
    }
  },
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "1.2.3.4", //服务器VPS IP地址
          "port": 12345, //通讯端口,客户端和服务端一致,自定
          "users": [
            {
              "id": "293c95b0-a4a2-47d5-b6eb-da8e6894e7b8", //UUID 在这个网站随机生成一个,https://www.uuidgenerator.net, 要保证client和server配置一个UUID
              "alterId": 55 // 这个自定,数字范围0-100,但要保证客户端和服务端一致
            }
          ]
        }
      ]
    }
  },
  "outboundDetour": [
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    }
  ],
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "port": "54-79",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "81-442",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "444-65535",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "domain": [
            "gc.kis.scr.kaspersky-labs.com"
          ],
          "outboundTag": "direct"
        },
        {
          "type": "chinasites",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "direct"
        },
        {
          "type": "chinaip",
          "outboundTag": "direct"
        }
      ]
    }
  }
}

v2ray-server.json

服务端配置文件,或者这里下载
{
  "port": 12345, //通讯端口,客户端和服务端一致,自定
  "log" : {
    "access": "/var/log/v2ray/access.log", 
    "error": "/var/log/v2ray/error.log",  
    "loglevel": "warning"                  
  },
  "inbound": {
    "protocol": "vmess",    
    "settings": {
      "clients": [
        {
          "id": "293c95b0-a4a2-47d5-b6eb-da8e6894e7b8",  //UUID 在这个网站随机生成一个,https://www.uuidgenerator.net, 要保证client和server配置一个UUID
          "alterId": 55,  // 这个自定,数字范围0-100,但要保证客户端和服务端一致
          "level": 1  // 官方说明,0 共享VPS, 1 自用VPS
        }
      ]
    }
  },
  "outbound": {
    "protocol": "freedom",  
    "settings": {}
  },
  "inboundDetour": [
    {
      "protocol": "shadowsocks",   // 此段为支持SS协议部分
      "port": 1234, 
      "settings": {
        "method": "chacha20", // 加密协议支持aes-256-cfb, aes-128-cfb, chacha20 (V2Ray 1.9+), chacha20-ietf (V2Ray 1.9+)
        "password": "v2ray",     
        "udp": false             //是否支持UDP中转
      }
    }
  ],
  "outboundDetour": [
    {
      "protocol": "blackhole",  
      "settings": {},
      "tag": "blocked"
    }
  ],
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",  
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "blocked"
        }
      ]
    }
  }
}

六、使用

1、使用自带协议:

上面的配置文件相应修改完后,
测试本地配置文件是否正确
./v2ray --test --config v2ray-client.json
没有问题,启动本地客户端
./v2ray --config v2ray-client.json
设置服务端配置:
sudo cp v2ray-server.json /etc/v2ray/config.json
测试配置文件是否正确
sudo /usr/bin/v2ray/v2ray --test --config /etc/v2ray/config.json
没有问题后,启动服务器
sudo service v2ray start
经测试,上面的配置文件兼容Shadowsocks,所以可以两种方式使用V2Ray:
  • 使用V2Ray自带带协议。需要V2Ray客户端后台启动才能运行。
  • 使用Shadowsocks兼容协议,加密协议支持aes-256-cfb, aes-128-cfb, chacha20 (V2Ray 1.9+), chacha20-ietf (V2Ray 1.9+)加密算法。可以使用Surge/GoagentX/ShadowsocksX 运行。

七、参考引用

  1. V2Ray GitHub发布页
  2. V2Ray设置文档
  3. V2Ray for Windows Client and Debian Server
  4. Ubuntu环境下V2ray配置教程
  5. V2Ray完全使用教程
  6. 简易配置VPS V2Ray 服务端、客户端
  7. 使用v2ray科学上网
  8. V2ray科学上网
  9. Online UUID Generator
  10. V2Ray开发讨论组


作者:crystone
链接:http://www.jianshu.com/p/b59150fd8f47
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

传说中的性能测试

原文转载自 https://www.v2ray.com/blog/2017/speed.html


传说中的性能测试

一直都有人问 V2Ray 的性能问题,一直都很无奈因为没有人测过。被问得烦了,现在给一个比较科学,比较准确的结论。

本次测试的目的

测试 VMess 和 Shadowsocks 各种加密方式,在传输过程中的极限速度。

测试方法

在同一台主机上同时启动 V2Ray 客户端和服务器端,使用环回网络(Loopback)进行网络传输。客户端会接受到预设数量的数据,然后验证服务器端发出同样数量的数据。

测试环境

一台云主机,内存 2GB,CPU 信息如下。显然这台机器本身的性能不怎么样,如果用一台更好的机器,会得到更好的绝对数值,但本次实验结果的数值比例有参考价值。
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 61
Model name:            Virtual CPU a7769a6388d5
Stepping:              2
CPU MHz:               2399.996
BogoMIPS:              4799.99
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0,1

测试工具

特地写了两个小工具:loadgen 和 receiver。
loadgen 用于发送数据,它可以对某个端口建立连接,支持直连和 Socks 协议。可配置并发一定数量的连接,发送指定数量的数据后,验证 receiver 的反馈。如果 receiver 收到了同样数量的数据,则表明传输结束。
receiver 用于接收数据,对于每个连接,每次收到数据后,把总共收到的数据字节数发回,并等待连接发起方关闭连接。
由于 VMess 的正确性已被其它的测试验证,这里只需要验证连接畅通,即收到数据量等于发出数据量即可。

基本信息

我们用 loadgen 和 receiver 直接对接,可以得出环回网络的大致性能。实验结果如下:
数据量:50 GB / 连接
并发连接数124
速度(MB/s)426646544551
对比下面实验中的速度,可以认为环回网络的基本速度不会成为瓶颈。
进一步的基础信息,我们又测了一下使用 V2Ray 直连的速度。实验中只启动一个 V2Ray 进程,配置 Dokodemo-door <-> Freedom。实验结果如下:
数据量:10 GB / 连接
并发连接数124
速度(MB/s)640819787

VMess 测试

测试场景的差别是 VMess 的加密方式,其它都一样。传入依然是 Dokodemo-door,传出是 Freedom。
  • VMess CFB: AES-128-CFB 加密方式
  • VMess GCM: AES-128-GCM 加密方式
  • VMess Chacha: Chacha20-poly1305 加密方式
  • VMess None: 不加密
结果如下(数据量:10 GB / 连接):
解读如下:
  • 速度 GCM > Chacha > None > CFB;
  • VMess 可以同时处理多个连接。由于 CPU 是双核,所以 2 个连接的速度比单个连接快,而 4 个连接对比 2 个连接则没有明显提升;
很有趣的一点是 None 居然比 GCM 慢。不加密反而比加密慢,有一点违反常识。原因是这样的:VMess 不管加不加密,都会进行数据校验,None 中使用的校验算法是 FNV,而 GCM 是一个 AEAD 算法,自带校验。于是带 CPU 加成的校验比软件实现的校验快了不小。这一点也超出了开发人员的预期,之后会考虑提升校验的性能。

与 Shadowsocks 对比

V2Ray 和 Shadowsocks 的比较也是一个常见问题。既然我们有了一个性能测试的工具,那就一起测一下吧。
  • V2Ray SS CFB: V2Ray 中的 Shadowsocks 实现,AES-128-CFB 加密方式;
  • SS-Libev CFB: Shadowsocks libev 2.5.6,AES-128-CFB 加密方式,客户端 ss-tunnel,服务器端 ss-server;
  • SSR-PY CFB: ShadowsocksR 最新的代码(2017-01-20),AES-128-CFB 加密方式。其它的参数都是默认的:auth_aes128_md5、tls1.2_ticket_auth_compatible。
OTA 在所有 Shadowsocks 中都启用了。
实验结果(数据量:10 GB / 连接):
解读如下:
  • VMess 的速度优于 Shadowsocks;
  • 比起 ss-libev 和 ssr-python,V2Ray 在多并发连接的场景中更有优势;

结论

  • 在一台双核 2.4 GHz 的主机上,V2Ray 的极限传输速度超过 400 MB/s。
  • 如果你对速度有需求,请使用 VMess + AES-128-GCM。

后记

  • 在日常使用中,传输速度一般都不会超过 10 MB/s,上述测试的每种方式都可以满足需求。但如果你需要高性能传输,可以按测试结果选择合适的方式。
  • 上述的测试结果都是运行多次的平均值。由于虚拟机的不稳定性,误差在 5% 以下。
  • 其它方面的测试,如 CPU 和内存占用,会在后续的测试中进行。
  • loadgen 和 receiver 可以由 iPerf 替代,唯一的问题是 iPerf 不支持 Socks 协议。
  • 上述所有工具和测试脚本的源代码可以在这里找到