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配置中的wsSettingspath需要的caddy中代理的路径相同。
客户端的"security": "tls"是供caddy使用的,所以服务端没有

添加CDN

WebSocket + TLS + Web的基础上添加CDN, 这里以Cloudflare为例

  1. 由于Caddy会自动注册申请LetsEncrypt证书,这要求其必须与外界直接连接,在嵌套CDN后这一步则无法完成。
  2. Cloudflare默认使用HTTP与后台服务通信,而Caddy会将其重定向到HTTPS,进而引起rederict loop

注册Cloudflare

获得注册油箱cloudflare@gmail.comGlobal API Key: 1234567890asdfjkl1234567890asdfjkl
获取Nameserver地址: ns.cloudflare.com

  1. 将域名DNS指向服务器所在地址
  2. SSL/TLS encryption mode设为Full或者Full(Strict)(解决上面的问题2)

修改域名服务商DNS配置

将在Freenom注册的域名domain.menameserver设置成ns.cloudflare.com

修改Caddy配置以支持Cloudflare

  1. 安装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
	}
}
  1. 修改启动环境

修改/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

CaddyServer and Cloudflare

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平台可以使用v2rayNGBifrostV
BifrostVShadowsocksAndroid版很像,可以查看实时传输速度,功能也更全,但是包含广告。
v2rayNG没有广告,但功能非常基本,也不显示实时传输速度

注意,v2ray启动是会在手机上自动添加一个VPN配置,
如果你手机配置过一个VPN,且将这个VPN设置为了Always-on VPN的话,则会导致无法配置新的VPN
v2ray启动时报错permission denied to create a VPN service
这时只要将那个VPNAlways-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手机通过v2rayNGYouTube上连播听歌时突然连接断开,然后发现所有外网都连不上。 v2rayNGtap to check connection有时能成功,有时不能。
在到服务端发现v2rayaccess.log日志出现上述错误
同时用身旁处于同一网络环境,相同V2Ray客户端配置的电脑能够正常访问外网。
于是判断问题位于手机上,仅仅重启服务无效,但重启整个v2rayNG应用后恢复正常

Reference