V2RAY使用方法备忘

v2ray或者v2fly是有官方文档的,但是官方文档时不时有所错漏之处,我经过阅读他人写的文档加上自己测试,总结为这篇文章,以备我后续查用。 其路由的功能非常好用,有了路由功能就不需要经常切换网络,甚至可以直接远程配置家里的路由器。

这个文档里,配置文件的设计原则是:

  1. 尽可能保证联通性,保证该访问的到的页面都要访问的到
  2. 在保证1的基础上,尽可能的直接连接
  3. 做好保密和伪装

日志模块

在Docker里面运行的时候,我习惯把日志吐到/logs,然后再把某个文件夹挂载到/logs里面。

"log": {
    "loglevel": "warning",
    "access": "/logs/access.log",
    "error": "/logs/error.log"
},

缺点是时间一长容易忘记清理,而且也不能用在其它客户端的配置里。

所以保险起见的话:

"log": {
    "loglevel": "warning"
},

DNS

"dns": {
    "servers": [
        "114.114.114.114",
        {
            "address": "1.1.1.1",
            "port": 53,
            "domains": [
                "geosite:geolocation-!cn"
            ]
        }
    ]
},

入口配置

入口配置会在本地打开端口,一般常用的入口配置如下:

Socket代理

只建议在本地或者局域网内使用,不加密。

{
    "listen": "127.0.0.1",
    "port": 10808,
    "protocol": "socks",
    "settings": {
        "auth": "noauth",
        "udp": true,
        "userLevel": 8
    },
    "sniffing": {
        "destOverride": [
            "http",
            "tls"
        ],
        "enabled": true
    },
    "tag": "socksxxx"
},

HTTP代理

只建议在本地或者局域网内使用,不加密。

{
    "listen": "127.0.0.1",
    "port": 10809,
    "protocol": "http",
    "settings": {
        "userLevel": 8
    },
    "tag": "httpxxx"
}

VMESS协议代理

这里的VMESS Inbound有两种用途,第一种是单独用作服务器和客户端的传输渠道(这个时候加上WebSocket更好),第二种是在本地局域网搭建客户端以后利用手机上的App访问局域网内机器,这个时候只是借用一下这个协议(配置方便)。

{
    "port": 3238,
    "protocol": "vmess",
    "settings": {
        "clients": [
            {
                "id": "a83baffa-2c05-4bd9-8d86-10c7e278997a",
                "security": "auto",
                "level": 0
            }
        ]
    },
    "tag": "v2ray"
}

客户端配置

{
    "protocol": "vmess",
    "settings": {
        "vnext": [
            {
                "address": "域名或者IP",
                "port": 12345,
                "users": [
                    {
                        "id": "a83baffa-2c05-4bd9-8d86-10c7e278997a",
                        "security": "auto",
                        "level": 0
                    }
                ]
            }
        ]
    },
    "tag": "aaa"
}

WebSocket

{
    "port": 12345,
    "protocol": "vmess",
    "settings": {
        "clients": [
            {
                "id": "a83baffa-2c05-4bd9-8d86-10c7e278997a",
                "security": "auto",
                "level": 0
            }
        ]
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
            "path": "/data" // Need to match the config in nginx
        }
    }
},
Nginx配置
server {
    listen      80;
    server_name vr.xxxx.com; # 需要配置
    return      302 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    ssl_certificate /xxxxx/fullchain.cer; # 需要配置
    ssl_certificate_key //xxxxx/xxxx.key; # 需要配置
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    root /path/to/a/static/website; # 需要配置
    server_name vr.xxxx.com; # 需要配置
    location /data { # 需要配置
        proxy_redirect off;
        proxy_pass http://v2ray-server-local:12345; # 需要配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}

建好服务器以后,将需要配置的地方改一下,主要是:

  1. 域名和相应的证书
  2. 一个用于伪装的静态网站
  3. websocket的地址(和上面保持一致)
  4. 本地的v2ray服务器的地址和端口

有一个小思考,考虑到已经使用了标准的HTTPS进行加密,其实内层的协议未必需要是vmess,甚至可以是socket。但是不知会不会暴露流量特征。

客户端配置
{
    "protocol": "vmess",
    "settings": {
        "vnext": [
            {
                "address": "域名或者IP",
                "port": 12345,
                "users": [
                    {
                        "id": "a83baffa-2c05-4bd9-8d86-10c7e278997a",
                        "security": "auto",
                        "level": 0
                    }
                ]
            }
        ]
    },
    "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
            "path": "/data"
        }
    },
    "tag": "aaa"
}

路由设置

服务端比较简单,一般直连就可以,不需要任何路由配置:

{
    "protocol": "freedom",
    "settings": {},
    "tag": "direct"
},

客户端出口的配置如下:

"routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
        {//连接家里局域网的,走代理,可删除
            "type": "field",
            "ip": [
                "192.168.1.0/24"
            ],
            "outboundTag": "aaa"
        },
        {//直连中国域名
            "type": "field",
            "outboundTag": "direct",
            "domain": [
                "geosite:cn"
            ]
        },
        {//其它的中国IP和私有IP都直连
            "type": "field",
            "outboundTag": "direct",
            "ip": [
                "geoip:cn",
                "geoip:private"
            ]
        },
        // TODO 可以增加更多配置
        {//直接连接到世界的互联网
            "type": "field",
            // "balancerTag": "blancerxxx",
            "outboundTag": "aaa",
            "network": "tcp,udp"
        }
    ],
    "balancers": [//可配置负载均衡
        {
            "tag": "blancerxxx",
            "selector": [
                "aaa",
                "bbb"
            ],
            "strategy": {
                "type": "random"
            }
        }
    ]
}