@TOC
Catagory
VPS配置
VPS即虚拟专用服务器,要科学展开英语研究需要有一台具备公网IP的VPS。推荐使用 Vultr 或者其他云服务商比如Azure、AWS等(能白嫖最好)。
购买VPS
-
首先注册账号,在选择机房前可以到云服务商的支持页面测试各地服务器下载速度,选择一个合适地区的VPS尤为重要:
一般新注册用户都有活动,后续充值依靠Alipay或者Wechat Pay
蓝绿修改器(==2020年后Vultr已移除Wechat Pay==): -
接着购买你想要的套餐配置:
在VPS部署页面中,根据上一步测试的各地服务器下载速度挑一个较快的(一般不推荐东京、洛杉矶等(IP被ban高发区))
-
选择操作系统镜像和服务器配置
操作系统随意安装,推荐安装Linux Distro。套餐我们选择最便宜的那款,比如5刀/月的最基础款
部署后Vultr会自行安装所选择的操作系统镜像
配置VPS
这里可以看到服务器的IP和初始用户名密码,利用ssh远程连接上vps
ssh ${username}@${IP}
键入自动生成的密码,并使用sudo passwd
更改为新密码
建议新建一个用户,并在/etc/sudoers
文件中开放权限,用新用户登录而非root用户登录VPS
如果不想每次访问都要输入密码,可以在客户端生成非对称加密秘钥,将公钥复制到服务器上,实现公钥认证自动登录
#! in your vps server
# if there does not exist .ssh/
mkdir .ssh && cd .ssh
touch authorized_keys
#! in your client
ssh-keygen -t rsa -C "${ssh-key-name}"
scp ~/.ssh/id_rsa.pub ${username}@${IP}:~/.ssh/authorized_keys
如果不想每次都通过命令行访问,可以安装宝塔面板从浏览器访问VPS
基础配置
V2ray来自v2fly的Project V,是一群爱好自♂由的人们开发的网络协议
V2ray本身并不区分服务端和客户端,一个进程可以支持流量多入口多出口,服务器建议配置为V2ray-Server,客户端使用V2ray-Client连接即可
服务端配置
ssh远程连接后,建议使用v2fly官方安装脚本
# 包含核心文件和规则列表文件
sudo bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
安装完成后相关文件位置如下
installed: /usr/local/bin/v2ray # v2ray主文件
installed: /usr/local/bin/v2ctl # v2ctl控制文件
installed: /usr/local/share/v2ray/geoip.dat # IP规则列表
installed: /usr/local/share/v2ray/geosite.dat # 站点规则列表
installed: /usr/local/etc/v2ray/config.json # V2ray使用的配置文件
installed: /var/log/v2ray/ # 日志文件路径
installed: /var/log/v2ray/access.log
installed: /var/log/v2ray/error.log
installed: /etc/systemd/system/v2ray.service # V2ray-systemd服务信息
installed: /etc/systemd/system/v2ray@.service
使用最基础的配置测试v2ray能否正常处理流量,编写一个最简单的config.json
:
{
"inbounds": [
{
"port": 10086, // 服务器监听端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811" // 客户端UUID,标识每一个客户端
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
上面需要注意的是port
、id
这两个字段,在下一节客户端配置中使用(alterId
字段已弃用)
启动V2ray-Server:
# 设置开机自动运行V2ray服务
systemctl enable v2ray
# 启动V2ray
systemctl start v2ray
# 使用以下命令管理V2ray服务
systemctl status v2ray
systemctl stop v2ray
systemctl restart v2ray
配置文件中的服务端监听端口为10086
,需要在OS中开放端口供外部流量进入:
-
Linux自带防火墙
# 以firewalld为例 firewall-cmd --zone=public --permanent --add-port=10086/tcp
-
云服务商提供的安全组策略/端口开放
客户端配置
配置Windows客户端
首先在Windows系统上尝试使用V2ray代理,使用V2rayN作为客户端
从Release页面下载v2rayN-With-Core.zip
,该文件已包含v2fly编写的v2ray-core
核心文件和2dust编写的v2rayN
客户端,解压即用
另外一个比较有名的客户端是Clash
MacOS & iOS、Linux、Android等各个平台都有支持vmess协议的客户端,后文细讲
运行v2RayN.exe
,新版可能需要安装Microsoft .NET 6.0 Desktop Runtime
V2rayN客户端支持VMess
、VLess
、Socks
、Shadowsocks
、Trojan
这5种协议,之前的服务端简单配置了监听VMess
协议的流量入口策略,因此在V2rayN客户端中添加一个新的VMess服务器:
地址填写VPS的公网IP,端口填写之前配置的10086
,传输协议选择默认的tcp
在托盘区将V2rayN的 代理模式 改为自动配置系统代理,它会自动更改Windows的代理设置,所有检测并使用系统代理的进程的出口流量会进入V2ray-Core进行路由
V2rayN本地默认开放10808作为socks监听端口,10809作为http监听端口,代理流量需要转发至这两个端口
配置Linux客户端
Qv2ray项目自2021.8.17起不再维护,可以使用V2rayA替代
使用Qv2ray,用相应的Linux发行版提供的包管理器自行下载Qv2ray即可,相关配置步骤类似
-
ArchLinux及其发行版,比如Manjaro
sudo pacman -S qv2ray
-
CentOS8,基于OpenSUSE
cd /etc/yum.repos.d/ wget https://download.opensuse.org/repositories/home:zzndb:Qv2ray/CentOS_8/home:zzndb:Qv2ray.repo yum install Qv2ray
-
Debian及其发行版,比如Ubuntu
# 添加GPG公钥 curl https://qv2ray.net/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/qv2ray-stable-archive.gpg # 添加qv2ray官方APT存储库 echo "deb [arch=amd64] https://qv2ray.net/debian/ `lsb_releases -cs` main" | sudo tee /etc/apt/sources.list.d/qv2ray.list # 更新APT索引 sudo apt update # 从APT安装Qv2ray sudo apt install qv2ray
配置Android客户端
Android客户端非常多,比较常用的有V2rayNG、Clash for Android
配置iOS/MacOS客户端
使用Shadowrocket或者Kitsunebi
注意这两款软件没有上架AppStore国区,可以自行注册外区iOS帐号登陆购买或者租用帐号进行下载
配置Chrome SwitchyOmega
本节可以不看,使用场景很窄,大部分情况可以使用路由配置替代
如果只想让浏览器走代理,其他进程不走代理,可以将V2rayN客户端的 代理模式 改为 不改变系统代理,这样其他进程只能各自配置它们自己的代理设置将各自的流量转发到V2rayN
Chrome的SwitchyOmega插件实现客户端配置(该配置实现Chrome浏览器自动代理上网,根据规则列表,对无墙网址不进行代理)
由于Chrome应用商店被墙,开启全局代理直接访问Chrome应用商店,搜索SwitchyOmega扩展安装即可 也可到GitHub上下载该插件
在本地解压crx文件,如果不能解压请将扩展名更改为zip或者rar等
在Chrome工具栏里找到 更多工具-扩展程序-加载已解压的扩展程序
选择刚刚解压出来的switchyOmega文件夹即可
接下来按步骤配置:
规则列表地址为 https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
最后测试一下在Chrome中是否可以使用
如果你想使用全局代理,在代理模式那里选择全局即可
进阶配置
安装BBR进行TCP加速
可能你会烦恼VPS的速度不够快,可以安装锐速(Lotserver)或者BBR进行TCP加速
获取BBR安装脚本,可在Centos/Ubuntu/Debian等服务器端安装应用了Google tcp-bbr加速算法的内核
wget –-no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
chmod +x bbr.sh
./bbr.sh
该脚本会自动升级服务器端的linux内核为BBR版,升级完成后重启即可采用新的内核
或者使用其他脚本安装BBR(魔改版)、BBRPlus、Lotserver等加速算法
wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/tcp.sh"
chmod +x tcp.sh
./tcp.sh
使用TLS+WebSocket+Nginx伪装网站流量
在实际使用中,原始的ip:port
访问v2ray的方式很容易被GFW识别并对相应端口作出封禁,这十分影响科学探索
采用WebSocket作为传输协议,使用Nginx将服务端接收的数据包转发到v2ray本地监听地址,为了安全性起见,伪装网站采用HTTPS(HTTPS=HTTP+TLS/SSL)
申请域名并设置域名解析地址
这一步按照个人需求办理,推荐选择以.top
或.xyz
等为顶级域名(图一个年租便宜)的域名
目前国内域名需要在相应的域名服务商那进行个人实名认证,比如在阿里云购买域名后如果想要使用阿里云的域名解析服务,就需要在阿里云用个人身份信息备案域名,注意==这一步可能需要3个工作日==
笔者认为可以将该域名重复利用,比如发布个人博客或者将一些Web项目挂在域名的子路径下,这样科学上网只不过是顺带一做罢了
域名申请完成后,记得要设置域名解析,将域名指向的IP地址解析到你的服务器地址上,这部分通常也在各大域名服务商那有相应的教程
以阿里云为例,购买阿里云提供的域名后,在云解析DNS
的服务选项卡里设置域名解析
建站并配置TLS
建站根据你喜欢的方式来,这里只提供一个参考
如果你的服务器安装了宝塔面板,可以在面板侧边栏的网站选项中选择添加站点,填入域名和网站根目录(后者用于设置网站不同子路径下访问的对应目录)后即可建站
建站完成后,点击运行中站点的设置,找到SSL选项,使用Let’s Encrypt生成免费证书
宝塔面板自动生成的Nginx配置如下所示:
server
{
listen 80;
listen 443 ssl http2;
server_name www.penistrong.xyz;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/www.penistrong.xyz;
#支持压缩的类型
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
#SSL相关配置,请勿删除或修改下一行带注释的404规则
#SSL-START
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/www.penistrong.xyz/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/www.penistrong.xyz/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#强制HTTPS
#SSL-END
location / {
alias /www/wwwroot/www.penistrong.xyz/blog_site/;
index index.html index.htm;
}
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-00.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.penistrong.xyz.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
access_log /www/wwwlogs/www.penistrong.xyz.log;
error_log /www/wwwlogs/www.penistrong.xyz.error.log info;
}
上述Nginx配置文件中,根路径的网站目录指向静态博客文件夹,即博客页面作为网站首页,在后续配置中添加某个子路径监听WebSocket连接即可
配置v2ray
域名和TLS已经有了,下一步开始配置V2ray-Server
在v2ray配置文件config.json
的inbounds
入站配置里的InboundConfigurationObject
里添加streamSetting,并设置传输协议为WebSocket和其使用的子路径名,配置文件如下
{
"log":{
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [
{
"tag": "inbound",
"port": 12580,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [...] // 填写各个客户端的UUID
},
"streamSettings": {
"network": "ws",
"security": "auto",
"wsSettings": {
"path": "/ray",
"headers": {
"Host": "www.penistrong.xyz"
}
}
}
}
],
"outbounds": [{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blocked"
}
]
}
}
上述配置使用/ray
作为子路径,v2ray监听本地回环地址localhost:port
,我这里设置为127.0.0.1:12580
,注意这里配置的端口不再是v2ray客户端填写的端口,因为监听设置listen
并没有使用默认的0.0.0.0
表示开放监听,当前设置用于Nginx将外部流量转发到内部的12580端口上,所以最后各个v2ray客户端填写的应该是Nginx监听外部流量的端口
重启v2ray
# 查看v2ray运行状态
systemctl status v2ray
# 重启v2ray,会重新载入配置文件
systemctl restart v2ray
配置Nginx
v2ray已经开始监听发往服务端本机回环地址端口12580的数据报,接下来要配置Nginx,设置WebSocket使用的子路径
在前述使用的nginx配置文件中添加:
server
{
...
#v2ray WebSocket伪装的子路径
location /ray {
proxy_pass http://127.0.0.1:12580;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
...
}
保证Nginx采用新的nginx.conf
运行后,施工完毕(记得开放Nginx监听的端口,上述使用的443
是https的默认端口,如果使用其他端口需要自行开放)
客户端配置示例
这里以v2rayN为例,给出==新的客户端配置文件示例==:
V2ray服务端流量监控
v2ray服务搭建之后,或许你会想分享给好友,但又不想VPS的流量被挥霍一空,可以开启v2ray的API模块+信息统计模块进行流量监控(仅监控流量而已)
开启API模块
v2ray的API基于gRPC
,开启远程控制时,v2ray会自建一个出站代理,并将入站配置的tag
值作为标识,用户需要把所有入站的gRPC连接通过routing
指向该出站代理
开启API模块只需要在config.json
里添加一个以api
为名的对象ApiObject
{
...
"api": {
"tag": "api",
"service": [
"HandlerService",
"LoggerService",
"StatsService"
]
}
...
}
v2ray内建三种API服务,其中==StatsService==是我们的主要目标
API | 用处 |
---|---|
HandlerService | 用于远程编辑出入站代理 |
LoggerService | 暂时只支持内置Logger重启 |
StatsService | 内置的数据统计服务,也是流量监控的主要模块 |
开启统计信息模块
v2ray提供有关其运行状况的统计信息,为了开启该模块,首先需要在config.json
里添加一个StatsObject
来标记模块开关,并辅以PolicyObject
配置其本地策略
{
...
"stats": {},
"policy": {
"levels": {
"0": {
"statsUserUplink": true,
"statsUserDownlink": true
},
"1": {
"statsUserUplink": true,
"statsUserDownlink": true
}
},
"system": {
"statsInboundUplink": true,
"statsInboundDownlink": true,
}
}
...
}
其中levels
对应map{string:LevelPolicyObject}
,键值对映射指明对不同string所表示的”level”级用户采取的本地策略
LevelPolicyObject
支持的属性如下:
属性名 | 字段类型 | 意义 |
---|---|---|
handshake | number | 建立连接时的握手时间/s,default=4 ;握手阶段连接超时则中断 |
connIdle | number | 连接空闲时间/s,default=300 ;超出connIdle 时间后仍没数据传输,则终端该连接 |
uplinkOnly | number | ==服务器==关闭下行连接后,等待uplinkOnly 时间后中断连接/s,default=2 |
downlinkOnly | number | ==客户端==关闭上行连接后,等待downlinkOnly 时间后中断连接/s,default=5 |
statsUserUplink | bool | 开启当前等级所有用户的上行流量统计 |
statsUserDownlink | bool | 开启当前等级所有用户的下行流量统计 |
bufferSize | number | 每个连接给予的内部缓存大小/kb;值为0 时禁用内部缓存 |
SystemPolicyObject
支持的属性如下:
属性名 | 字段类型 | 意义 |
---|---|---|
statsInboundUplink | bool | 开启所有入站代理的上行流量统计 |
statsInboundDownlink | bool | 开启所有入站代理的下行流量统计 |
接着要给clients
里为各个用户添加email
信息,v2ray据此来分辨不同用户。同时,还要添加一个使用dokodemo-door
协议的入站代理,标记其tag=api
,与上一节的ApiObject
相对应。该入站代理的InboundObject
里的端口port
用于API查询流量
{
"inbounds": [
{
...
"settings":{
"clients":[
...
{
"email": "YourEmail@xxx.com",
"id": "${UUID}",
"level": 0,
"alterId": 0
}
...
]
}
},
{
"listen": "127.0.0.1",
"port": 10085,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
]
}
最后,在routing
对应的RoutingObject
里将出入站代理的标识(在这里都为api
)进行路由绑定
{
...
"routing": {
"settings": {
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
},
"strategy": "rules"
}
...
}
至此,已经可以使用v2ctl
命令进行流量查询
# 如果没有v2ctl,请到v2ray命令的同路径下找到v2ctl,以我的为例,其位于/usr/bin/v2ray/中
# 如果是使用前文的v2fly官方安装脚本,那么v2ctl在/usr/local/bin/下
# 查看系统整体统计信息
v2ctl api --server=127.0.0.1:10085 StatsService.QueryStats 'pattern: "" reset: false'
# 查看特定用户的上行流量
v2ctl api --server=127.0.0.1:10085 StatsService.GetStats 'name: "user>>>user_email@xx.com>>>traffic>>>uplink" reset: false'
# 查看特定用户的下行信息
v2ctl api --server=127.0.0.1:10085 StatsService.GetStats 'name: "user>>>user_email@xx.com>>>traffic>>>downlink" reset: false'
==需要注意的是,一旦v2ray重启,前述流量统计信息都将丢失==
服务端配置文件总览
上面分阶段详细描述了配置过程,现给出一个简单的总配置文件示例以供参考
{
"api": {
"tag": "api",
"services": [
"HandlerService",
"LoggerService",
"StatsService"
]
},
"stats":{},
"policy":{
"levels": {
"0": {
"statsUserUplink": true,
"statsUserDownlink": true
},
"1": {
"statsUserUplink": true,
"statsUserDownlink": true
}
},
"system": {
"statsInboundUplink": true,
"statsInboundDownlink": true
}
},
"log":{
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [
{
"tag": "ws_tls",
"port": 12580,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"email": "user_email@xx.com",
"id": "c4aa90d9-c3e7-4a65-b1d8-f6593cdf45b3",
"level": 0
},
{
"email": "user_email@xx.com",
"id": "66c2d7e6-2f02-489c-8d3c-00461869f668",
"level": 1
}
]
},
"streamSettings": {
"network": "ws",
"security": "auto",
"wsSettings": {
"path": "/ray",
"headers": {
"Host": "www.penistrong.xyz"
}
}
}
},
{
"listen": "127.0.0.1",
"port": 10085,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
],
"outbounds": [{
"protocol": "freedom",
"settings": {},
"tag": "freedom"
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": {
"settings": {
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
},
"strategy": "rules"
}
}
V2ray客户端进阶配置
GFW、DNS劫持,爱好自♂由的人们总是会碰到许多挫折,需要对V2ray客户端进行进一步的配置
下面以V2rayN客户端为例
路由规则配置
V2ray-core官方自带的GeoIP
和GeoSites
里预定义的域名及IP涵盖得不全,无法覆盖绝大部分使用情况,因此可以下载扩展的geoip.dat
和geosite.dat
,→v2ray-rules-dat页面
好消息,自某个版本后,v2rayN已将LoyalSoldier的v2ray扩展规则配置为默认的预定义规则来源
以下配置为V2ray 4.0+版本,目前V2ray v5的配置文件格式不同,可以去v2fly官网查阅
路由规则可以在V2rayN上方的设置-路由设置
选项卡里进行配置,可以切换不同的预定义规则列表,也可以直接修改V2rayN客户端的config.json
配置文件,路由规则在配置文件中routing
对应的RoutingObject
里定义
-
白名单模式: 白名单中的域名、IP走直连
direct
,其余统统走代理proxy
"routing": { "domainStrategy": "IPIfNonMatch", "domainMatcher": "mph", "rules": [ { "type": "field", "outboundTag": "direct", "protocol": [ "bittorrent" ] }, { "type": "field", "outboundTag": "block", "domain": ["geosite:category-ads-all"] }, { "type": "field", "outboundTag": "direct", "domain": [ "geosite:apple-cn", "geosite:icloud", "geosite:google-cn", "geosite:tld-cn", "geosite:category-games@cn" ] }, { "type": "field", "outboundTag": "proxy", "domain": ["geosite:geolocation-!cn"] }, { "type": "field", "outboundTag": "direct", "domain": [ "geosite:cn", "geosite:private" ] }, { "type": "field", "outboundTag": "direct", "ip": [ "geoip:cn", "geoip:private" ] }, { "type": "field", "outboundTag": "proxy", "network": "tcp,udp" } ] }
上述配置中,
rules
里各个RuleObject
的路由匹配顺序与配置文件里的顺序一致-
bittorrent
协议对应p2p种子下载的流量,直连不走代理 -
geosite:category-ads-all
对应各个网站的广告域名,全部阻塞既不走直连也不走代理 -
后续路由规则照葫芦画瓢即可
-
-
黑名单模式: 黑名单中的域名、IP走代理,其余统统走直连
"routing": { "rules": [ { "type": "field", "outboundTag": "block", "domain": ["geosite:category-ads-all"] }, { "type": "field", "outboundTag": "proxy", "domain": ["geosite:gfw"] }, { "type": "field", "outboundTag": "proxy", "ip": ["geoip:telegram"] }, { "type": "field", "outboundTag": "direct", "network": "tcp,udp" } ] }
DNS配置
由于国内运营商会劫持DNS,为了安全起见,给V2ray配置DNS防止DNS污染、DNS劫持
DNS在配置文件dns
对应的DnsObject
中进行配置,配置方式详见官方DNS配置文档,下面是示例
"dns": {
"hosts": {
"dns.google": "8.8.8.8",
"dns.pub": "119.29.29.29",
"dns.alidns.com": "223.5.5.5",
"geosite:category-ads-all": "127.0.0.1"
},
"servers": [
{
"address": "https://1.1.1.1/dns-query",
"domains": ["geosite:geolocation-!cn", "geosite:google@cn"],
"expectIPs": ["geoip:!cn"]
},
"8.8.8.8",
{
"address": "114.114.114.114",
"port": 53,
"domains": ["geosite:cn", "geosite:icloud", "geosite:category-games@cn"],
"expectIPs": ["geoip:cn"],
"skipFallback": true
},
{
"address": "localhost",
"skipFallback": true
}
]
}