V2Ray

官文档

V2Ray 是 Project V 下的一个工具。Project V 是一个包含一系列构建特定网络环境工具的项目,而 V2Ray 属于最核心的一个。 官方介绍中 Project V 提供了单一的内核和多种界面操作方式。内核(V2Ray)用于实际的网络交互、路由等针对网络数据的处理,而外围的用户界面程序提供了方便直接的操作流程。 不过从时间上来说,先有 V2Ray 才有 Project V。

  • 客户端:V2Ray 本身只是一个内核,V2Ray 上的图形客户端大多是调用 V2Ray 内核套一个图形界面的外壳,类似于 Linux 内核和 Linux 操作系统的关系;所以 v2rayN 需要配置 core类型
  • 分流:也许大家第一反应是 PAC,V2Ray 本身不支持 PAC,都是客户端加进来的;V2Ray 使用自己实现的路由功能,孰优孰劣只是仁者智者的问题。
  • 分享链接/二维码:V2Ray 不像 Shadowsocks 那样有统一规定的 URL 格式,所以各个 V2Ray 图形客户端的分享链接/二维码不一定通用。
  • 加密方式:V2Ray(特指 VMess 协议)不像 Shadowsocks 那样看重对加密方式的选择,并且 VMess 的加密方式是由客户端指定的,服务器自适应。
  • 时间:使用 V2Ray 要保证时间准确,因为这是为了安全设计的。
  • 密码:V2Ray(VMess)只有 id(使用 UUID 的格式),作用类似于 Shadowsocks 的密码,但随机性远好于 Shadowsocks 的密码,只是不太方便记忆(安全和方便的矛盾)。
  • UDP 转发:VMess 是基于 TCP 的协议,对于 UDP 包 V2Ray 会转成 TCP 再传输的,即 UDP over TCP。要 UDP 转发功能在客户端的 socks 协议中开启 UDP 即可。

V2Ray、Trojan、XRay

https://www.chengxiaobai.com/essays/v2ray-trojan-xray https://github.com/v2fly https://github.com/v2fly/v2ray-core

V2Ray 、XRay

起因是 V2Ray 项目创始人 Victoria Raymond 突然失联,由于其他维护者没有完整的项目权限,于是大家创建了新的社区:V2Fly,后续关于 V2Ray 的更新都由 V2Fly 社区负责。

v2fly 移除 XTLS 协议后,RPRX 分叉 v2fly-core 项目,建立了包含 XTLS 协议的 Xray-core 项目。不同于 v2fly 使用的 MIT 许可证,Xray-core 使用 MPL 2.0 许可证。 RPRX 因一己私利而促使项目分家的行为对开源社区造成了深深的伤害,他应该被永远钉在开源社区的耻辱柱上。

Trojan 工具

我觉得 Trojan 流行的一个很重要的外部因素是 HTTPS 的覆盖率大规模提升。

Trojan 设计的巧妙点在于它直接使用 HTTPS 通信,所以它从流量特征上看就和海量的 HTTPS 流量一样,「大隐隐于市」,点此可查看设计思路讨论

由于它的设计很简单,只使用 TLS 做为可信通道,其他加密一概没有,在不增加附加功能的前提下,核心通信功能可以很稳定,从它的迭代周期也能看出来。

工作机制

工作机制 一个 V2Ray 服务器可同时支持多台设备使用不同的代理协议访问。同时,经过合理的配置,V2Ray 可以识别并区分需要代理以及不需要代理的流量,直连的流量不需要绕路。

  • 需要配置至少一个入站协议(Inbound)和一个出站协议(Outbound)才可以正常工作。
    • 入站协议负责与客户端(如浏览器)通信:
      • 入站协议通常可以配置用户认证,如 ID 和密码等;
      • 入站协议收到数据之后,会交给分发器(Dispatcher)进行分发;
    • 出站协议负责将数据发给服务器,如另一台主机上的 V2Ray。
  • 当有多个出站协议时,可以配置路由(Routing)来指定某一类流量由某一个出站协议发出。
    • 路由会在必要时查询 DNS 以获取更多信息来进行判断。

Inbound 和 Outbound 类似 交换线一样

安裝和更新 V2Ray

https://www.v2fly.org/guide/install.html#linux-%E5%AE%89%E8%A3%85%E6%96%B9%E5%BC%8F https://github.com/v2fly/fhs-install-v2ray

Linux 安装或更新都可

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

其配置文件: vim /usr/local/etc/v2ray/config.json

管理 V5

  • 如果你使用 Linux 并开启了 systemd,可以使用 journalctl -u v2ray 查看 V2Ray 退出时的日志。
  • 一般情况可以手动运行 v2ray -config=<config-file> -test 来查看错误信息。
  • 启动和停止
systemctl restart v2ray
systemctl status v2ray
systemctl stop v2ray
 
 
/usr/local/bin/
v2ray run -config /usr/local/etc/v2ray/config.json

vim /usr/local/etc/v2ray/config.json

{
    "log": {},
    "api": {},
    "dns": {},
    "routing": {},
    "policy": {},
    "inbounds": [],
    "outbounds": [],
    "transport": {},
    "stats": {},
    "reverse": {},
    "fakedns": [],
    "browserForwarder": {},
    "observatory": {}
}

配置实例 V5

https://www.v2fly.org/v5/config/overview.html

info: V2Ray v5.22.0 is installed.

Usage:
 
        v2ray <command> [arguments]
 
The commands are:
 
        run           run V2Ray with config
        api           call V2Ray API
        convert       convert config files
        test          test config files
        tls           TLS tools
        uuid          generate new UUID
        verify        verify if a binary is officially signed
        version       print V2Ray version
 
Use "v2ray help <command>" for more information about a command.
 
Additional help topics:
 
        config-merge  config merge logic
        format-loader config formats and loading
 
Use "v2ray help <topic>" for more information about that topic.
 

执行 ./v2ray run -c $configure_file_name -format jsonv5 命令以运行您的配置文件。

V2Ray 的配置文件形式如下,客户端和服务器通用一种形式,只是实际的配置不一样。

{
    "log": {},
    "dns": {},
    "router": {},
    "inbounds": [],
    "outbounds": [],
    "services": {}
}
 

Inbounds 和 Outbounds

Inbounds

https://www.v2fly.org/config/inbounds.html#inboundobject

{
    "listen": "127.0.0.1",
    "port": 1080,
    "protocol": "协议名称", //连接协议名称,可选的值见协议列表。
    "settings": {},
    "streamSettings": {},
    "tag": "标识",
    "sniffing": {
        "enabled": true,
        "destOverride": [
            "http",
            "tls"
        ],
        "metadataOnly": false
    },
    "allocate": {
        "strategy": "always",
        "refresh": 5,
        "concurrency": 3
    }
}

Outbounds

{
    "sendThrough": "0.0.0.0",
    "protocol": "协议名称",//连接协议名称,可选的值见协议列表。
    "settings": {},
    "tag": "标识",
    "streamSettings": {},
    "proxySettings": {
        "tag": "another-outbound-tag",
        "transportLayer": false
    },
    "mux": {}
}

传输协议说明(部分)

https://www.v2fly.org/config/protocols/freedom.html

{
  "inbounds": [
        {
            "port": 5600,
            "protocol": "vless",///连接协议名称,可选的值见协议列表。
            "settings": {
                "decryption": "none",
                "clients": [
                    {
                        "id": "4xxx",
						"email": "yang-pc"
                    }
                ],
				"fallbacks":[{
					"alpn": "",
					"path": "",
					"dest": 5632,
					"xver": 1
				}]
            },
            "streamSettings": {
                "network": "kcp",//`network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"
                "kcpSettings": {
                    "header": {
                        "type": "srtp"
                    }
                }
            }
        }
    ]
}

freedom

freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据

通常服务端出口使用的

{
 
  "inbounds": [ ... ],
  
  "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

vmess

VMess 是一个加密传输协议,它分为入站和出站两部分,通常作为 V2Ray 客户端和服务器之间的桥梁。 VMess 依赖于系统时间,请确保使用 V2Ray 的系统 UTC 时间误差在 90 秒之内

通常客户端与服务端 使用

vless

VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 V2Ray 客户端和服务器之间的桥梁。 与 VMess 不同,VLESS 不依赖于系统时间,认证方式同样为 UUID,但不需要 alterId。

通常客户端与服务端 使用

socks

标准 Socks 协议实现,兼容 Socks 4open in new window、Socks 4a 和 Socks 5open in new window

blackhole

Blackhole(黑洞)是一个出站数据协议,它会阻碍所有数据的出站,配合 路由(Routing) 一起使用,可以达到禁止访问某些网站的效果。

{
 
  "inbounds": [ ... ],
  
  "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

传输方式说明(部分)

https://www.v2fly.org/config/transport.html#streamsettingsobject https://www.v2fly.org/config/transport.html#transportobject

 对应出站入站协议中的 streamSettings 项。每一个入站、出站连接都可以分别配置不同的传输配置,都可以设置 streamSettings 来进行一些传输的配置。

{
  "inbounds": [
        {
            "port": 5600, // 服务器监听端口
            "protocol": "vless",//注意注意 协议
            "settings": {
                "decryption": "none",
                "clients": [
                    {
                        "id": "4xxx",
						"email": "yang-pc"
                    }
                ],
				"fallbacks":[{
					"alpn": "",
					"path": "",
					"dest": 5632,
					"xver": 1
				}]
            },
            "streamSettings": {
                "network": "kcp",//`network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"
                "kcpSettings": {//当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
                    "header": {
                        "type": "srtp"
                    }
                }
            }
        }
    ]
 
}
mKCP

mKCP 使用 UDP 来模拟 TCP 连接,请确定主机上的防火墙配置正确。mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。 https://www.v2fly.org/v5/config/stream/kcp.html#mkcp-stream

QUIC

QUIC 全称 Quick UDP Internet Connection,是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:

  1. 减少了握手的延迟(1-RTT 或 0-RTT)
  2. 多路复用,并且没有 TCP 的阻塞问题
  3. 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开 https://www.v2fly.org/config/transport/quic.html

实例(WS + 域名伪装)

这里配置示例

vim /usr/local/etc/v2ray/config.json 关键 Inbounds(入站), outbounds(出站) 配置

{
    "log": {
        "access": "none",
        "info": "/var/log/v2ray/info.log",
        "warning": "/var/log/v2ray/warning.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "error"
    },
    "inbounds": [
        {
            "port": 5636,
            "protocol": "vmess",
            "settings": {
                "clients": [
                    {
                        "id": "d8b90fe7-aa9e-5ee6-93c0-bbb1487d0824",
                        "level": 0,
                        "alterId": 0,
                        "email": "acc@gmail.com"
                    }
                ],
                "disableInsecureEncryption": true
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
                    "path": "/wesocket",
                    "headers": {
                        "Host": "user7e0b802d7832.expedia.com.hk"
                    }
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http"
                ]
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

实例 (TLS + 分流器) - ali

https://guide.v2fly.org/advanced/tcp_tls_shunt_proxy.html#%E5%AE%9E%E7%8E%B0

TLS 证书

https://letsencrypt.org/zh-cn/getting-started/

Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构,由非营利组织互联网安全研究组 (ISRG) 运作。

tls-shunt-proxy 分流器

https://github.com/liberal-boy/tls-shunt-proxy#%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85

它不能分流 自签 IP证书!!

分流规则

Copilot 说的..

  1. 基于 SNI(Server Name Indication)分流:

    • 配置文件里的 vhosts 数组,每个 name 对应一个 SNI(即 TLS 握手中的 server name)。
    • 可以为每个 vhost 设置不同的处理方式,比如是否解开 TLS(tlsoffloading),以及下游流量如何处理。
  2. 基于 HTTP 请求的 Path 分流:

    • 在 HTTP 流量被识别的情况下(tlsoffloading: true),可以按 HTTP 请求的 path 进行分流。
    • path 支持从上到下依次匹配,若没有匹配项则使用默认的 http handler。
    • 例如:
paths:
  - path: /vmess/ws/
	handler: proxyPass
	args: 127.0.0.1:40000
  - path: "*"
	handler: fileServer
	args: /var/www/html
  1. 协议类型分流:

    • 可以根据流量类型(HTTP、HTTP/2、Trojan 协议等)设置不同的 handler。例如:
      • http: 普通 HTTP 流量
      • http2: HTTP/2 流量
      • trojan: Trojan 协议流量
      • default: 其他不可识别流量
  2. 回落(Fallback)机制:

    • 如果无法识别 SNI 或 SNI 不在 vhosts 配置中,可以设置一个 fallback 地址,所有未被识别或匹配的流量会转发到这个地址。
  3. 路径前缀修剪(trimprefix):

    • 可通过 trimprefix 修剪 path 前缀再交给 handler。例如将 /static/logo.jpg 修剪为 /logo.jpg
  4. Proxy Protocol 支持:

    • 可以通过 args 添加 proxyProtocol,将源地址通过 Proxy Protocol v1 传递给后端。
安装

对于 linux-amd64 可以使用脚本安装,以 root 身份执行以下命令

bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh)
  • 配置文件位于 /etc/tls-shunt-proxy/config.yaml
listen: 0.0.0.0:443
# 相同吞吐量和连接数情况下,缓冲区越大,消耗的内存越大,消耗 CPU 时间越少。在网络吞吐量较低时,缓存过大可能增加延迟。
inboundbuffersize: 4
# outboundbuffersize: 出站缓冲区大小,单位 KB, 默认值 32
outboundbuffersize: 32
 
vhosts:
    # 将 example.com 改为你的域名
  - name: xgnzhnyyyyy.xyz
    
   # tlsoffloading: 解开 tls,true 为解开,解开后可以识别 http 流量,适用于 vmess over tls 和 http over tls (https) 分流等
    tlsoffloading: true
    
    # managedcert: 管理证书,开启后将自动从 LetsEncrypt 获取证书,根据 LetsEncrypt 的要求,必须监听 443 端口才能签发
    # 开启时 cert 和 key 设置的证书无效,关闭时将使用 cert 和 key 设置的证书
    managedcert: true
    alpn: h2,http/1.1
    # 如果不需要兼容 tls12, 可改为 tls13
    protocols: tls12,tls13
    # 证书路径
    cert: /usr/local/etc/self_ssl/root_ca.crt
    key: /usr/local/etc/self_ssl/root_ca.key
    http:
      handler: fileServer
      # /var/www/html 是静态网站目录
      args: /var/www/html
 
   # default: 其他流量处理方式, 转发给 rxay处理 
    default:
      handler: proxyPass
      args: 127.0.0.1:10443 
管理
  • 关于TLS证书 看他的安装脚本 可执行文件在 /usr/local/bin/, 创建了 /etc/ssl/tls-shunt-proxy 作为工作目录, 其实是acme使用管理签发证书的, 里面包括 Let’s Encrypt 签发的证书,
systemctl start tls-shunt-proxy
systemctl restart tls-shunt-proxy
systemctl status tls-shunt-proxy
systemctl stop tls-shunt-proxy
 
./tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yaml

V2ray 配置文件

vim /usr/local/etc/v2ray/config.json

inbounds 增加一个入口点

 "inbounds": [
	{
		"protocol": "vmess",
		"listen": "127.0.0.1",
		"port": 10443,
		"settings": {
			"clients": [
				{
					"id": "XXXXXXXXXXXXXXXXXXXXXXX"
				}
			]
		},
		"streamSettings": {
			"network": "tcp"
		}
	}
]

实例(vmess + QUIC)

https://www.v2fly.org/config/transport/quic.html 适合游戏, 都不加密

{
    "log": {
        "info": "/var/log/v2ray/info.log",
        "warning": "/var/log/v2ray/warning.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "protocol": "vmess",
            "port": "5633",
            "security":"zero",//vmess的 `"none"`:不加密; `"zero"`:不加密,也不进行消息认证 (v4.35.0+)
            "settings": {
                "clients": [
                    {
                        "id": "294be5ce-8356-4040-84d9-253bf7f22583",
                        "alterId": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "quic",
                "quicSettings": {
                    "security": "none",
                    "key": "",
                    "header": {
                        "type": "srtp"
                    }
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

header.type “none”:默认值,不进行伪装。 “srtp”:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。 “utp”:伪装成 uTP 数据包,会被识别为 BT 下载数据。 “wechat-video”:伪装成微信视频通话的数据包。 “dtls”:伪装成 DTLS 1.2 数据包。 “wireguard”:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)

实例(vmess+KCP)

mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。

https://www.v2fly.org/config/transport/mkcp.html

inbounds.[protocol = vmess].security //vmess的 "none":不加密; "zero":不加密,也不进行消息认证 (v4.35.0+)

{
    "log": {
        "info": "/var/log/v2ray/info.log",
        "warning": "/var/log/v2ray/warning.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "protocol": "vmess",
            "port": "5633",
            "security":"zero",
            "settings": {
                "clients": [
                    {
                        "id": "294be5ce-8356-4040-84d9-253bf7f22583",
                        "alterId": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "kcp",
                "kcpSettings": {
				    "mtu": 1300,
				    "tti": 20,
				    "uplinkCapacity": 100,
				    "downlinkCapacity": 100,
				    "congestion": true,
				    "readBufferSize": 1,
				    "writeBufferSize": 1,
				    "header": {
				        "type": "srtp"
				    },
				    "seed": "VwYdCxwawrDYrvVC"
				}
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

uplinkCapacity: number

上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s,默认值 5。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。

downlinkCapacity: number

下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s,默认值 20。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。

readBufferSize: number

单个连接的读取缓冲区大小,单位是 MB。默认值为 2

writeBufferSize: number

单个连接的写入缓冲区大小,单位是 MB。默认值为 2

headerHeaderObject

type: string 伪装类型,可选的值有:

  • "none":默认值,不进行伪装,发送的数据是没有特征的数据包。
  • "srtp":伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
  • "utp":伪装成 uTP 数据包,会被识别为 BT 下载数据。
  • "wechat-video":伪装成微信视频通话的数据包。
  • "dtls":伪装成 DTLS 1.2 数据包。
  • "wireguard":伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)

运行

在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的 config.json 文件。直接运行 v2ray 或 v2ray.exe 即可。

在 Linux 中,配置文件通常位于/etc/v2ray//usr/local/etc/v2ray/ 目录下。运行 v2ray —config=/usr/local/etc/v2ray/config.json,或使用 systemd 等工具将 V2Ray 作为服务在后台运行。

/usr/local/etc/v2ray/config.json

服务端

systemctl enable v2ray
systemctl start v2ray
systemctl disable v2ray
//
systemctl restart v2ray
systemctl status v2ray
systemctl stop v2ray
vim /usr/local/etc/v2ray/config.json

tail -f /var/log/v2ray/info.log

客户端

v2rayN 另外还需要下载 v2ray core : https://github.com/XTLS/Xray-core/releases

第三方图形客户端

https://www.v2fly.org/awesome/tools.html#%E7%AC%AC%E4%B8%89%E6%96%B9%E5%9B%BE%E5%BD%A2%E5%AE%A2%E6%88%B7%E7%AB%AF

Qv2ray 跨平台 V2Ray 客户端,支持 Linux、Windows、macOS,可通过插件系统支持 SSR / Trojan / Trojan-Go / NaiveProxy 等协议

SagerNet SagerNet 是一个基于 V2Ray 的 Android 通用代理应用。

V2rayN V2RayN 是一个基于 V2Ray 内核的 Windows 客户端。

v2rayA 基于 web GUI 的跨平台 V2Ray 客户端,在 Linux 上支持全局透明代理,其他平台上支持系统代理

KCP 传输协议

游戏加速最佳协议

KCP是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

https://github.com/skywind3000/kcp

流程

  1. 客户端链接tcp,服务端为该tcp链接分配一个整数id作为标识。
  2. 登录后服务端给客户端发送udp握手信息,包括:自己的udp端口,用户的tcp标识id,32位随机数key
  3. 客户端给服务端udp地址发送握手信息,把刚才服务端发过来的(id, key) 发送给服务端。
  4. 服务端确认udp握手,并且记录该用户udp远端地址
  5. 以后客户端和服务端udp通信,每个包都包含(id, key),
  6. 服务端用客户端发上来的(id,key),确认用户身份,并对比远端地址confirm是一个合法用户。

关于 (Full Clone/NAT Type A)

进阶必读:代理协议 UDP 全方位透彻解析 - https://v2xtls.org/%E8%BF%9B%E9%98%B6%E5%BF%85%E8%AF%BB%EF%BC%9A%E4%BB%A3%E7%90%86%E5%8D%8F%E8%AE%AE-udp-%E5%85%A8%E6%96%B9%E4%BD%8D%E9%80%8F%E5%BD%BB%E8%A7%A3%E6%9E%90/