极VPS,追求极致;
分享VPS技术;

v2ray 使用socks over tls降低延时,安全高效!

本文思路启迪于:https://github.com/v2ray/discussion/issues/513

一、为什么v2ray延时较高

大家使用v2ray的websocket+tls+nginx或者websocket+tls+caddy模式后,测试的时候会发现延时非常高,例如美西、洛杉矶位置的VPS使用安卓客户端v2rayNG进行测试时,延时能够高达700~900ms,而且波动较大!

看一下我美西VPS的v2ray延时测试图

v2ray延时

VPS是搬瓦工GIA-E,测试时间在23:30。

造成延时较高的原因主要有两个:

  • 1. HTTPS耗时 = TCP握手 + SSL握手

命令行工具curl有一个w参数,可以用来测量TCP握手和SSL握手的具体耗时,以访问支付宝为例。

$ curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.alipay.com

TCP handshake: 0.022, SSL handshake: 0.064

上面命令中的w参数表示指定输出格式,time_connect变量表示TCP握手的耗时,time_appconnect变量表示SSL握手的耗时(更多变量请查看文档实例),s参数和o参数用来关闭标准输出。

从运行结果可以看到,SSL握手的耗时(64毫秒)大概是TCP握手(22毫秒)的三倍。也就是说,在建立连接的阶段,HTTPs链接比HTTP链接要长3倍的时间,具体数字取决于CPU的快慢和网络状况。

所以,如果是对安全性要求不高的场合,为了提高网页性能,建议不要采用保密强度很高的数字证书。一般场合下,1024位的证书已经足够了,2048位和4096位的证书将进一步延长SSL握手的耗时。​​

-- 摘自阮一峰博客:SSL延迟有多大?

  • 2. VMESS加密传输协议

VMESS协议的处理也需要计算和处理,导致延时进一步加强;

https和vmess两者导致v2ray在使用时较为臃肿,反而是少了vmess的Trojan更加轻便、快速;

HTTPS已经保证了数据的传输安全,为什么数据又多进行了一次VMESS加密呢?此加密显得有些多余。。(难道vmess加密真的多余了吗?请看完...)

那么如何使v2ray在保持安全的条件下,提高效率与优化延时呢?

根据上面的分析,解决方案是通过舍弃VMESS加密来提高效率与速度。

二、如何降低v2ray延时

降低v2ray延时的办法就是舍弃VMESS这一层加密协议,取而代之的是使用更加轻便、小巧的socks协议;

具体的服务端配置与客户端配置如下:

服务端配置示例

{
  "inbounds": [
  {
    "port": 18866,
    "listen":"127.0.0.1",
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
       "udp": false
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
        "path": "/fastspeed"
        }
      }
  }
  ],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}

主要关注一下inbounds的配置!!重启v2ray服务,配置才生效。

服务端的Nginx或Caddy记得转发一下fastspeed路径到内部的18866端口!!

路径和端口自己可以根据喜好修改;

客户端配置示例

{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "xxxxxxx.com",
            "port": 443
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "path": "/fastspeed"
        }
      },
      "mux": {
        "enabled": true,
        "concurrency": 8
      }
    }
  ]
}

主要关注一下outbounds的配置!!

路径和端口自己可以根据喜好修改;

注意:客户端配置中的inboundsport要与v2ray客户端软件的port一致!!

有些配置项不懂? 在这里查看v2ray配置文档:https://toutyrater.github.io/

目前iOS的客户端是无法使用“自定义配置文件”的.......

我先来说一下安卓v2rayNG与Windows的v2rayN如何使用此客户端配置文件,最后再说iOS设备的解决办法;

安卓v2rayNG导入自定义配置

  1. 复制客户端配置信息;
  2. 打开v2rayNG app;
  3. 点击右上方“+” --- “自定义配置” --- “从剪切板导入之定义配置”
  4. 导入成功后会出现一串数字(时间戳)命名的节点
  5. 点击编辑,查看其中内容是否有误

做完以上导入操作,可以修改一下新添加的节点的别名

v2ray自定义服务器配置

Windows v2rayN导入自定义配置

  1. 复制客户端配置信息,建立一个txt文本,将配置粘贴进去;
  2. 打开v2rayN ;
  3. 点击服务器的三角,点击第四项“添加自定义配置服务器”
  4. 弹框提示点击确认即可;
  5. 文件弹框的右下角记得修改一下文件类型,改为 All(*.*),找到你的配置文件;
  6. 导入成功后会出现一个新节点,名字为:import custom@2020/xx/xx
选择v2ray自定义服务器配置文件
修改v2ray自定义服务器配置文件

注意:客户端配置中的inboundsport要与v2ray客户端软件的port一致!!

iOS Shadowsocket/Quantumult导入自定义配置

Quantumult我没用过,暂略,后续完善)

目前最新版小火箭我尝试配置,但是总是未能成功,只能暂时修改服务端配置,使服务器支持经典的vmess协议;

同时兼容socks和vmess协议的完整服务端配置如下:

{
  "inbounds": [
  {
    "port": 18866,
    "listen":"127.0.0.1",
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
       "udp": false
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
        "path": "/fastspeed"
        }
      }
  },{
    "port": 15533,
    "listen":"127.0.0.1",
    "protocol": "vmess",
    "settings": {
    	"clients": [{
    		"id": "6331527e-74c4-41f7-be1e-fcfe6afe1dd1",
    		"alterId": 0
                  }
    	]
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
        "path": "/myvmepath"
        }
      }
  }
  ],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}

在inbounds中增加了一项vmess协议,用于iOS小火箭客户端连接使用;

记得重启v2ray服务,配置才生效。

服务端的Nginx或Caddy记得转发一下myvmepath路径到内部的15533端口!!

服务端的Nginx或Caddy记得转发一下fastspeed路径到内部的18866端口!!

至此优化v2ray延时的工作就结束了,我们再来看一下用新配置的节点测试的延时有多低。

v2ray延时

延时由原来的800+降低到200+

最后来说一下vmess这一层加密是不是多余了

引用一下Github用户kirin10000所说的:

如果你正在使用cdn,一定要保证cdn是可靠可信的,因为cdn中转的时候是会将你的tls解密的,再重新加密发送到你的客户端。即使是普通的v2ray+ws+tls,如果你在使用cdn,那么cdn应该是可以知道你在使用v2ray的。其次就是如果你用这种方法连接,一定要保证你的域名和path,不能同时让别人知道,一般来说域名是对外公开的,所以path最好复杂一点。

另外如果你连接的公共WiFi不安全,被中间人劫持,如果中间人技术能力强的话,或许会破解掉你的代理。此仅为推断。

上面说了websocket+tls+nginx配置的方式来使用socks优化延时,换成Caddy的HTTP2方式也是类似的,大家可以来测试HTTP2的方式是不是延时更低。后续我也准备尝试一下,到时候告知大家一下结果。

赞(3)
未经允许不得转载:极VPS » v2ray 使用socks over tls降低延时,安全高效!

评论 5

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-7

    大佬写个脚本呗。小白治不了啊、

    12310个月前 (05-15)回复
  2. #-6

    大佬 我现在也是卡在小火箭配置上面 是要把证书导入到小火箭吗?

    xx3个月前 (12-15)回复
    • 不需要,客户端导入自定义配置就行,但是iOS不支持。 现在不推荐这种配置了,推荐使用最新的VLESS+xtls

      XiFanU3个月前 (12-15)回复
    • 可以用socks协议+v2ray plugin解决

      zz2个月前 (01-04)回复