V2Ray
V2Ray is a unified platform for anti-censorship.
安装
V2Ray
服务端与客户端使用相同的程序,所以安装方式相同,关键是配置文件的区别
安装需要su
权限
bash <(curl -L -s https://install.direct/go.sh)
# or
wget https://install.direct/go.sh && chmod +x go.sh && sudo ./go.sh
配置
配置文件/etc/v2ray/config.json
服务端
{
"log":{
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"port": 80,
"protocol": "vmess",
"settings": {
"clients": [{
"id": "de408bc1-f9d3-526d-1462-76dd94bf5010",
"alterId": 10
}]
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}
服务端与客户端的id
必须一致,类似于密码。
格式必须是uuid
的格式,可以使用v2ctl uuid
命令生成或者使用Online UUID Generator生成
客户端
{
"log":{
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"port": 1080,
"protocol": "socks",
"sniffing":{
"enable": true,
"destOverride": ["http", "tls"]
},
"setting":{
"auth": "noauth",
"udp": true
}
}],
"outbounds": [{
"protocol": "vmess",
"settings": {
"vnext":[{
"address": "server_address",
"port": 80,
"users":[{
"id": "de408bc1-f9d3-526d-1462-76dd94bf5010",
"alterId": 10
}]
}]
}
},{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [{
"type": "field",
"outboundTag": "direct",
"domain": ["geosite:cn"]
},{
"type": "field",
"ip": ["geoip:private", "geoip:cn"],
"outboundTag": "direct"
}]
}
}
outbounds
中的tag
为标签名,可以随意取名,供routing
中的rules
使用
routing
中的rules
中的outboundTag
即指定outbounds
中的tag
,指明满足哪些条件的流量使用指定protocol
上述routing
配置中指定局域网与大陆IP使用direct
所指向的protocol
,即freedom
,表示直连
运行
在运行前可以需要先检测配置文件是否符合规范
/usr/bin/v2ray/v2ray -test -config /etc/v2ray/config.json
如果配置文件有错误会指出具体那里有错,如果没有问题会出现如下信息:
V2Ray 4.18.0 (Po) 20190228
A unified platform for anti-censorship.
Configuration OK.
确认配置文件没有问题就可以启动了
sudo systemctl start v2ray
广告屏蔽
广告屏蔽是通过客户端的路由配置完成的,所以只需修改客户端的配置即可
首先为客户端的outbounds
添加一项blackhole
协议
{
"protocol": "blackhole",
"settings": {},
"tag": "adblock"
}
在路由配置项routing
中添加广告服务的域名,将其导向blackhole
{
"type": "field",
"outboundTag": "adblock",
"domain": ["geosite:category-ads"]
}
其中geosite:category-ads
的广告域名列表保存在/usr/bin/v2ray/geosite.dat
文件中
该列表由domain-list-community负责维护
WebSocket + TLS + Web
注册域名
使用freenom注册免费域名,或使用其它方法注册付费域名.
假设注册的域名为domain.me
搭建Web服务(Caddy)
yum install epel-release
yum install caddy
在caddy
配置中添加反向代理
domain.me {
root /var/www/html
proxy /path localhost:8080 {
websocket
header_upstream -Origin
}
}
caddy
可以保留原有的Web
服务配置,但是将其中的某个特定路径(eg: /path
)访问转向v2ray
。
caddy
只有在接收到/path
路径请求时才会转向v2ray
, 这样访问原有的网站服务不受影响。
由于https
的保护,外界无法知道你访问的是网站的那个路径
修改V2ray配置
服务端
{
"log":{
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"port": 8080,
"listen":"127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [{
"id": "de408bc1-f9d3-526d-1462-76dd94bf5010",
"alterId": 10
}]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/path"
}
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}
客户端
{
"log":{
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"port": 1080,
"protocol": "socks",
"sniffing":{
"enable": true,
"destOverride": ["http", "tls"]
},
"setting":{
"auth": "noauth",
"udp": true
}
}],
"outbounds": [{
"protocol": "vmess",
"settings": {
"vnext":[{
"address": "domain.me",
"port": 443,
"users":[{
"id": "de408bc1-f9d3-526d-1462-76dd94bf5010",
"alterId": 10
}]
}]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/path"
}
}
},{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}]
}
streamSettings
配置中的wsSettings
的path
需要的caddy
中代理的路径相同。
客户端的"security": "tls"
是供caddy
使用的,所以服务端没有
添加CDN
在WebSocket + TLS + Web
的基础上添加CDN
, 这里以Cloudflare
为例
- 由于
Caddy
会自动注册申请LetsEncrypt
证书,这要求其必须与外界直接连接,在嵌套CDN
后这一步则无法完成。 Cloudflare
默认使用HTTP
与后台服务通信,而Caddy
会将其重定向到HTTPS
,进而引起rederict loop
注册Cloudflare
获得注册油箱cloudflare@gmail.com
与Global API Key
: 1234567890asdfjkl1234567890asdfjkl
获取Nameserver
地址: ns.cloudflare.com
- 将域名DNS指向服务器所在地址
- 将
SSL/TLS encryption mode
设为Full
或者Full(Strict)
(解决上面的问题2)
修改域名服务商DNS
配置
将在Freenom
注册的域名domain.me
的nameserver
设置成ns.cloudflare.com
修改Caddy
配置以支持Cloudflare
- 安装
cloudflare
插件,使caddy
支持cloudflare
curl https://getcaddy.com | bash -s personal tls.dns.cloudflare
修改/etc/caddy/caddy.conf
domain.me {
root /var/www/html
proxy /path localhost:8080 {
websocket
header_upstream -Origin
}
tls {
dns cloudflare
}
}
- 修改启动环境
修改/etc/systemd/system/multi-user.target.wants/caddy.service
添加cloudflare
环境
Environment=CLOUDFLARE_EMAIL=cloudflare@gmail.com
Environment=CLOUDFLARE_API_KEY=1234567890asdfjkl1234567890asdfjkl
重启服务
systemctl daemon-reload
systemctl restart caddy
reference
logrotate
v2ray
的日志文件会随时间逐渐增大,可以利用linux
自带的logrotate
自动管理日志
在/etc/logrotate.d/
目录下添加文件
/etc/logrotate.d/v2ray
/var/log/v2ray/access.log{
daily
rotate 7
dateext
missingok
minisize 1M
}
/var/log/v2ray/error.log{
daily
rotate 7
dateext
missingok
notifempty
}
其他平台
Mac
# install
brew tap v2ray/v2ray
brew install v2ray-core
# update
brew update
brew upgrade v2ray-core
# uninstall
brew uninstall v2ray-core
brew untap v2ray/v2ray
# edit the default config
vim /usr/local/etc/v2ray/config.json
# run v2ray-core without starting at login
brew services run v2ray-core
# run v2ray-core and register it to launch at login
brew services start v2ray-core
Android
Android
平台可以使用v2rayNG
或BifrostV
BifrostV
与Shadowsocks
的Android
版很像,可以查看实时传输速度,功能也更全,但是包含广告。
v2rayNG
没有广告,但功能非常基本,也不显示实时传输速度
注意,v2ray
启动是会在手机上自动添加一个VPN
配置,
如果你手机配置过一个VPN
,且将这个VPN
设置为了Always-on VPN
的话,则会导致无法配置新的VPN
,
v2ray
启动时报错permission denied to create a VPN service
这时只要将那个VPN
的Always-on VPN
选项关闭即可
跨平台客户端
ClashR
Issues
不定时断流
clntIP:Port1 rejected v2ray.com/core/proxy/vmess/encoding: failed to read request header > read tcp servIP:Port2->clntIP:Port1: i/o timeout
用Android
手机通过v2rayNG
在YouTube
上连播听歌时突然连接断开,然后发现所有外网都连不上。
v2rayNG
的tap to check connection
有时能成功,有时不能。
在到服务端发现v2rayaccess.log
日志出现上述错误
同时用身旁处于同一网络环境,相同V2Ray
客户端配置的电脑能够正常访问外网。
于是判断问题位于手机上,仅仅重启服务无效,但重启整个v2rayNG
应用后恢复正常