抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

因为做课题需要用到谷歌,以前一直用的clash,买的别人搭建好的订阅链接。最近写文章要用到谷歌学术,买的订阅链接这个时候全都挂了…..不如自己配置个更稳定的节点,于是在RackNerd买了一台VPS,准备自己折腾折腾访问谷歌学术和github用。

以前用国内的服务器搭建过校园网的反向代理,当时用的frp这个反代软件,可以看底下这篇博客:

校园网代理服务器的搭建 - 我的小破站 (shelven.com)

这次的目的不一样,想要绕过GFW访问谷歌,需要有一台可以在国内访问公网ip的海外服务器。将我们(客户端)发出的http请求发送到代理服务器(服务端),代理服务器转发给目标服务器,再将响应返回到我们手上。整个过程隐藏了我们客户端的ip,也就是一个正向代理的过程。

1. 服务器

1.1 购买海外服务器

海外服务器比较有名的是RackNerd,在多个主机论坛里都有相关测评对比。主打一个价格便宜,KVM虚拟,纯SSD raid10阵列,solusvm面板,自带一个IPV4,1Gbps带宽,多个机房可选。

年费超过14美元才可以选洛杉矶的机房,洛杉矶和纽约都是美国服务器主要的节点,几乎所有国外服务器商在这两个地方都有节点。对于国内而言,洛杉矶机房在地理位置上更近,意味着网络延迟(ping值)较小。

说的太多有打广告的嫌疑,具体可以在RackNerd官网查看:RackNerd - Introducing Infrastructure Stability

顺便提一下在RackNerd购买的服务器72小时内可以更换一次ipv4,之后再次更换需要收3美刀。因为我搭建这个节点是为了访问谷歌学术,如果ip被封了会提示:

Your client does not have permission to get URL

连人机验证都没有,说明以前有人用这个ip干过爬虫一类的被谷歌学术直接封了。这个时候就要赶紧提工单换ip,或者申请ipv6(RackNerd似乎没有免费提供ipv6),谷歌学术一般封的是ipv4,这是后话。

购买的VPS可以通过SolusVM面板进行控制,邮件中有用户名和密码:https://nerdvm.racknerd.com/

1.2 测试服务器性能

这一步不是必要的,毕竟你在选配置的时候信息对性能也有个预估。这里就简单记几个测试的脚本:

VPS规格测试:

1
2
# 测试linux系统信息、IO读写和全球下载速度
curl -Lso- bench.sh | bash

GB6跑分:

1
2
# 和上面类似
curl -sL yabs.sh | bash

三网和教育网测速:

1
bash <(curl -sL bash.icu/speedtest)

回程路由:

1
wget -qO- git.io/besttrace | bash

流媒体解锁:

1
bash <(curl -L -s media.ispvps.com)

其他测试:

1
2
3
4
5
# ping测试
https://ping.pe

# 硬盘测试
wget -q https://github.com/Aniverse/A/raw/i/a && bash a

2. V2Ray

虽然直接用nginx就可以实现http正向代理的过程(https代理需要安装插件),但是为了数据安全,以及防止被墙检测,还是用更成熟的代理软件更为合适。常用的代理软件一个是clash,另一个就是V2Rayclash的配置比较灵活,支持规则、代理组和混淆等功能;V2Ray配置相对简单(我觉得),更适合我这种小白。

V2Ray有非常详细的中文部署文档和白话文教程:新手上路 · Project V 官方网站 (v2ray.com)

没有必要重复造轮子了,只是提一下客户端(自己的电脑)和服务端(海外服务器)部署的时候需要注意的地方

  1. 客户端和服务端时区可以不同,但是转换时区后的时间差要小于90秒

  2. https://install.direct/go.sh这个linux一键安装脚本已经不能用了,需要运行如下命令安装和更新V2Ray

    1
    bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
  3. 服务端设置完成之后记得放行对应的防火墙端口,并重载防火墙使其生效,常用的相关命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 放行16823端口:
    firewall-cmd --add-port=16823/tcp --zone=public --permanent
    # 重载防火墙:
    systemctl restart firewalld
    # 查看放行的端口:
    firewall-cmd --list-port
    # 查看进程:
    ps -ef | grep v2ray
    # 启动v2ray:
    systemctl start v2ray
  4. 客户端和服务端的"alterId"都设置为0,用户手册说可以指定额外ID数量,但是我这里不为0的话流量只能走直连,写的其他规则全都无法生效(不知道算不算bug)。

  5. 用户ID使用的是UUID格式,不推荐手打!可能会引发未知错误,推荐工具Online UUID Generator Tool

以我的配置简单做个示范。

服务端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"inbounds": [
{
"port": 16823, // 服务器监听端口
"protocol": "vmess", // 主传入协议,vmess是v2ray特有的协议
"settings": {
"clients": [
{
"id": "********-****-****-****-************", // 用户 ID,客户端与服务器必须相同
"alterId": 0
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom", // 主传出协议
"settings": {}
}
]
}

客户端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{
"log": {
"loglevel": "warning"
},

"inbounds": [{
"port": 1080,
"listen": "127.0.0.1",
"tag": "http-inbound",
"protocol": "http",
"settings": {
"auth": "noauth",
"udp": false,
"ip": "127.0.0.1"
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}],

"outbounds": [{
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "***.***.***.***", // 服务器ip
"port": 16823,
"users": [{
"id": "********-****-****-****-************", // 用户ID,与服务端匹配
"alterId": 0
}]
}]
},
"tag": "rule"
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
},{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}],

"routing": {
"domainStrategy": "IPOnDemand",
"rules":[
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
},{
"type": "field",
"domain": ["geosite:category-ads"],
"outboundTag": "blocked"
},{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:private",
"geoip:cn"
]
},{
"type": "field",
"outboundTag": "direct",
"domain": [
"domain:taobao.com",
"domain:jd.com",
"domain:baidu.com"
]
}
]
},

"dns": {
"hosts": {
"domain:v2ray.com": "www.vicemc.net",
"domain:github.io": "pages.github.com",
"domain:wikipedia.org": "www.wikimedia.org",
"domain:shadowsocks.org": "electronicsrealm.com"
},
"servers": [
"1.1.1.1",
{
"address": "114.114.114.114",
"port": 53,
"domains": [
"geosite:cn"
]
},
"8.8.8.8",
"localhost"
]
},

"policy": {
"levels": {
"0": {
"uplinkOnly": 0,
"downlinkOnly": 0
}
},
"system": {
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
},

"other": {}
}

官网给的客户端例子是走的socks协议,只有火狐(firefox)浏览器才可以设置socks协议代理,其他浏览器像是edge、chrome都是直接跳转计算机中的代理设置(不用插件的话)。因此直接在客户端的inbound设置http协议,然后在客户端直接设置代理地址127.0.0.1,端口1080即可。

3. 优化

把服务端和客户端的V2Ray都设置好之后,就可以在客户端运行v2ray.exe,正常浏览谷歌学术了(ip没被封的话)

细心的你可能会发现,现在浏览网页的速度非常慢,完全不像是刚开始给VPS做三网测速的速度好吗喂!

在测速网站测试一下代理速度:https://www.speedtest.net/

这个下载速度有点过于绝望了,别说浏览网页,下载个文献都费劲。

另外,TCP连接本身不提供数据加密,传输的数据在网络上可能会被窃听或篡改。这里介绍下主流的V2Ray优化方案:WebSocket + TLS + Nginx(Web) + cloudflare(CDN)

总的来说,WebSocket监听服务端V2Rayinbounds端口,转发流量到HTTP服务器(同一个服务器),再由HTTP服务器经过TLS加密传数据到cloudflare CDN服务器。隐蔽性比直接tcp连接更高,cloudflare加速也十分给力。

3.1 cloudflare

cloudflare要求有域名。我是在阿里云注册了一个.com的域名,先在域名注册商那里解析域名到服务器ip地址

在cloudflare官网右侧点击ADD a site,输入注册的二级域名,点击不要钱的那个plan。之后会让你在域名注册商那里修改DNS服务器(Name Server),注意有两个DNS服务器。

修改好之后回到cloudflare,就会发现之前添加的二级域名状态变成了activate,并且两条DNS解析记录也被提取了出来(没有两条可以自己手动添加,一条www,一条二级域名)。

这个时候就可以在自己电脑上ping域名,可以ping成功说明设置没有问题。

在DNS里先关闭代理状态(橙色的云改成灰色的云)。

3.2 nginx

用其他的web服务软件比如apache之类的都是可以的,我的博客服务器用的apache,这里稍微折腾下nginx以后就都有经验了,嗯。

nginx官网下载稳定版本,这里以1.25.5为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 解压,编译,安装nginx,一定要装ssl模块!除非你不用TLS
tar -xvf nginx-1.25.5.tar.gz
cd nginx-1.25.5/
./configure --prefix=/usr/soft/nginx --with-http_ssl_module
make
make install

# 开启80端口,443端口(ssl经常用的端口,也可以指定别的)
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
systemctl restart firewalld

#启动nginx
/usr/soft/nginx/sbin/nginx

这个时候访问ip:80端口就可以成功访问到nginx的初始界面了。

因为我们后面要改nginx的配置,所以这里先关掉….

1
2
3
4
# 查找80端口被什么进程占用,这里nginx默认使用80端口
netstat -nlp |grep :80
# kill对应的进程,进程号改成自己的
kill 16242

3.3 TLS证书(SSL)

这部分和我之前再apache服务器申请SSL证书一模一样….TLS是SSL的继任者,理解成一个意思就行。

3.3.1 zerossl证书

1
2
3
4
5
6
7
# 安装一些软件包和脚本,刷新环境变量
yum install socat
curl https://get.acme.sh | sh
source ~/.bashrc

# 注册zerossl账号
acme.sh --register-account -m 你的Email地址 --server zerossl

回到cloudflare,搜索API界面,点击生成全局的cloudflare API key

1
2
3
4
5
6
# 添加环境变量
export CF_Key="你的API key"
export CF_Email="你的Email地址"

# 生成TLS证书
acme.sh --server zerossl --issue -d 你的域名 --dns dns_cf

以上操作会在/root/.acme.sh/路径下生成TLS证书,安装证书换一个方便自己找的地方。

1
2
# 安装证书,自定义证书的路径和名称
acme.sh --installcert -d 你的域名 --fullchainpath /etc/crt/你的域名.crt --keypath /etc/crt/你的域名.key

zerossl证书有效期是90天,不过acme会创建一个cronjob自动更新证书,还是挺省心的(据说zerossl不支持免费ssl证书更换了,为了避免未来可能存在的问题,我还是用了下面方法)。

3.3.2 cloudflare证书

还有种比较简单的证书,就是cloudflare自己的Orign CA,证书免费,周期15年。

回到cloudflare,搜索SSL/TLS界面,选择Create Certificate,直接创建并上传到服务器就可以了。

不管用哪种方式申请的证书,需要在SSL/TLS界面将加密模式修改为Full或者Full(strict)这个时候再在DNS设置中打开代理状态(灰色的云改成橙色的云)。

这样修改后你的服务器到CDN服务器之间也采用了ssl/tls加密的方式传输数据,更不容易被检测。

3.4 修改nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 修改nginx.conf内容
# 前面自定义了nginx安装位置,我这里是/usr/soft/nginx/conf目录下
# 只展示需要修改的80和443端口
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 80;
server_name 你的域名;
location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:16823; # v2ray服务器端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}

server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /etc/crt/你的域名.crt;
ssl_certificate_key /etc/crt/你的域名.key;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;

location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:16823; # v2ray服务器端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}

这个时候启动nginx,以你的域名去访问也可以正常显示页面(地址栏没有红锁头),说明TSL就设置成功了。

3.5 修改v2ray设置

服务端修改配置并重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"inbounds": [
{
"port": 16823,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "********-****-****-****-************",
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/"
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

与前面相比只是多了一个"streamSettings",设置的是WebSocket转发的规则,注意路径要与nginx中设置的一样。实际运行的时候我这有个小bug,设置别的路径都会报错404,只有"/"可以正常代理。

客户端只需要在原来的基础上,在"outbounds"添加"streamSettings"相关内容,以及修改"settings"端口和域名地址,如下(只展示部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"outbounds": [{
"protocol": "vmess",
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/"
}
},
"settings": {
"vnext": [{
"address": "你的域名",
"port": 443,
"users": [{
"id": "********-****-****-****-************",
"alterId": 0
}]
}]
},

客户端运行时记得打开计算机代理!

3.6 优化后的下载速度对比

不管是从数据安全性还是下载速度上,优化后的比之前纯v2ray搭建的节点要强很多。

我这里校园网带宽只有20Mbps,测不到这个节点的下载速度上限;开了手机热点,测的等效带宽是50Mbps,比之前3Mbps提高了20倍,实际上还没有测到上限。这下下载文献是没问题了。

欢迎小伙伴们留言评论~