前置基础
- 已经购买或者拥有一台国外的服务器
- 服务器配置好ssh,可以通过本地终端连接
- 已经拥有一个域名并且已经解析到服务器IP(收费or免费域名都行)
- 本教程基于CentOS 7系统其他系统类似 
服务端配置
服务器更新
在通过ssh首次连接到购买的VPS后,首先要做的就是刷新软件源和更新系统,执行如下代码:1
2yum update
yum upgrade
对于新购买的VPS,在执行yum upgrade之后可能需要耗费一段时间进行系统更新,具体花费的时间根据服务器配置的不同而有所差异。
申请TLS证书
在注册好域名之后务必添加一个A 记录指向你的服务器IP。
在确认域名已经解析到我们购买的VPS的IP地址之后,我们先申请对应域名的TLS证书。
首先通过ssh连接到服务器,输入如下命令安装TLS证书申请工具:1
curl  https://get.acme.sh | sh
如果报错,可能是由于服务器没有安装curl工具,执行yum install curl安装完成后重新执行上述命令即可。
安装完acme证书申请工具后即可进行域名证书的申请:1
~/.acme.sh/acme.sh --issue -d 改成对应的域名 --standalone -k ec-256
注意: 该命令会临时监听80端口,请确保执行该命令前80端口没有使用。
证书申请完毕后会存放在/root/.acme.sh/域名_ecc文件夹内,这个路径要记住,后面配置nginx要用到。
Nginx的安装与配置
Nginx安装
由于nginx软件并不在默认的软件列表中,因此我们在安装nginx之前要现将包含nginx的软件源添加到软件源列表,执行如下命令:1
yum install epel-release
然后进行nginx的安装:1
yum install nginx
在终端执行一下指令生成dhparam1
2mkdir -p /etc/nginx/ssl
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
至此Nginx安装完毕,下一步要进行配置。
Nginx配置
通过yum install nginx方式安装Nginx之后,对应的配置文件在/etc/nginx/文件夹中。
首先要修改的是nginx的默认配置文件,我们使用vi /etc/nginx/nginx.conf打开默认配置文件,将里面的内容修改成如下:
| 1 | # * Official English Documentation: http://nginx.org/en/docs/ | 
接下来进入nginx的站点配置文件夹,并新建我们对应域名的配置文件:1
2cd /etc/nginx/conf.d
touch 域名.conf
接着编辑域名的配置文件,我们使用vi 域名.conf指令打开文件进行编辑,输入如下内容: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
49server
{
    listen 80;
    server_name 你的域名;
    #将http重定向到https
    return 301 https://你的域名$request_uri;
}
server
{
    listen 443 ssl http2;
    server_name 你的域名;
    ssl on;
    ssl_certificate /root/.acme.sh/你的域名_ecc/fullchain.cer; 
    ssl_certificate_key /root/.acme.sh/你的域名_ecc/你的域名.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    access_log off;
    
    location / {
        
        #向后端传递访客IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        #设定需要反代的域名,可以加端口号
        proxy_pass https://www.iqiyi.com/;
        #替换网站内容
        sub_filter 'www.iqiyi.com' '你的域名';
        # websocket设定,V2ray使用,这里的设置要和v2ray的设置一致。
        location /自定义/ {
            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;
            proxy_intercept_errors on;
            if ($http_upgrade = "websocket" ){
                    proxy_pass http://127.0.0.1:自定义v2ray端口;
            }
        }
    }
}
配置文件中的指定内容记得修改成自己的域名、SSL证书路径填写我们上一步申请证书时记录的路径、自定义部分可以自己修改。
这个配置文件主要实现两个功能:
- 域名反代,实现人们在访问你的域名的时候得到的页面是其他网页的页面。这省去了自己搭建站点来提高混淆的麻烦,这部分设置在配置文件中的 location / {}部分,请对应修改成需要的内容。
- 实现v2ray特征流量的转发在配置文件中的 location /自定义/ {}部分,可以将/自定义/修改成任何信息,甚至是乱码,比如/haha。
 它的作用是告诉nginx,路径为/haha的流量全部转发到指定端口proxy_pass http://127.0.0.1:自定义v2ray端口部分请自己随机设置端口,比如12345端口,nginx就是将v2ray流量通过这个端口转发给服务端v2ray的。
至此,nginx的安装和配置已经完毕,最后可以在终端输入nginx -t进行nginx配置文件的语法检查,如果显示success则表示配置无误,如果报错,则相应的检查报错文件的报错行数,通常是遗漏符号的问题导致报错。
安装和配置V2ray
做了那么多前期准备,现在终于到了核心的部分。其实在做了那么多准备工作之后,v2ray的安装和配置就显得格外的简单。
V2ray的安装
输入如下指令进行v2ray的下载安装:1
2wget https://install.direct/go.sh
bash go.sh
如果报错,可能是没有安装wget,输入指令yum install wget安装完之后重新执行上述命令即可。
V2ray配置
完成安装之后,就差配置文件了。
都说V2ray的配置复杂,这是限制很多人不愿意使用V2ray的原因之一。
但是,Don’t Worry About It! v2ray的配置看似复杂,其实只要根据模版修改需要的内容即可,非常简单。
我们进入V2ray的配置文件夹,并新建一个配置文件:1
2cd /etc/v2ray
touch config.json
我们通过vi config.json命令打开配置文件,将如下内容粘贴进去即可(注意修改对应内容为自己服务器的信息):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
117
118{
    "dns": null,
    "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "info"
    },
    "outbound": {
    "protocol": "freedom",
    "streamSettings": null,
    "tag": null,
    "settings": null,
    "mux": null
    },
    "stats": {},
    "api": {
        "services": [
            "StatsService"
        ],
        "tag": "api"
    },
    "routing": {
        "strategy": "rules",
        "settings": {
            "domainStrategy": null,
            "rules": [
            {
                "port": null,
                "domain": null,
                "type": "field",
                "outboundTag": "blocked",
                "ip": [
                    "0.0.0.0/8",
                    "10.0.0.0/8",
                    "100.64.0.0/10",
                    "169.254.0.0/16",
                    "172.16.0.0/12",
                    "192.0.0.0/24",
                    "192.0.2.0/24",
                    "192.168.0.0/16",
                    "198.18.0.0/15",
                    "198.51.100.0/24",
                    "203.0.113.0/24",
                    "::1/128",
                    "fc00::/7",
                    "fe80::/10"
                ]
            },
            {
                "inboundTag": [
                    "api"
                ],
                "type": "field",
                "outboundTag": "api"
            }]
        }
    },
    "inbound": {
        "port": nginx中设置的自定义端口,
        "streamSettings": {
            "wsSettings": {
                "connectionReuse": true,
                "headers": {
                    "host": "随便填写一个网址"
                },
                "path": "/nginx中配置的自定义内容/"
            },
           "tlsSettings": {},
           "kcpSettings": null,
           "network": "ws",
           "security": "",
           "httpSettings": null,
           "tcpSettings": null
        },
    "tag": "A",
    "settings": {
    "clients": [
        {
            "id": "12345432-85eb-4385-b760-22222c061109",
            "alterId": 64
        }]
    },
    "protocol": "vmess"
    },
    
    "policy": {
        "levels": {
            "0": {
                "statsUserDownlink": true,
                "statsUserUplink": true
            }
        },
        "system": {
            "statsInboundUplink": true,
            "statsInboundDownlink": true
        }
    },
 
    "inboundDetour": [
        {
            "protocol": "dokodemo-door",
            "settings": {
            "address": "127.0.0.1"
        },
        "tag": "api",
        "port": 23243,
        "listen": "127.0.0.1"
        }
    ],
 
    "outboundDetour": [
        {
            "protocol": "blackhole",
            "settings": null,
            "tag": "blocked"
        }]
}
需要修改的信息:
- inbound中的- Port修改为nginx配置中我们设定的自定义端口
- inbound中的- path修改为nginx配置中设置的- /自定义/部分,注意- /也要一致!
- inbound中- header部分的- Host修改为任意网址,可以高混淆
- clients中的- id修改为任意的uuid码,可以通过网页生成
其他部分不需要修改,最后ESC -> :wq进行保存退出,至此,v2ray的配置就宣告结束。
防火墙配置
由于有的服务商对CentOS 7 系统默认安装了防火墙,因此在上述配置后,还需要设置防火墙打开对应端口才可以使用。
可以输入如下指令查看已经开放的端口:1
firewall-cmd --zone=public --list-ports
如果显示错误,提示没有找到firewall-cmd指令,那么说明系统没有安装防火墙,此时可以跳过防火墙配置,运行nginx和v2ray。
接着通过如下指令开放我们nginx中配置的v2ray转发端口:1
firewall-cmd --permanent --zone=public --add-port=端口号/tcp
推荐开放的端口号:443,80,22,nginx转发端口
端口开启完毕之后,执行如下命令并显示新的端口开放信息:1
2firewall-cmd --reload
firewall-cmd --zone=public --list-ports
确认端口都开放无误后,防火墙的配置就结束。
开启服务并配置开机自启动
完成以上配置之后,即可开启nginx和v2ray服务:1
2systemctl start nginx
systemctl start v2ray
如果没有报错,说明一切配置正确。
最后设置一下nginx和v2ray开机自启动:1
2systemctl enable nginx
systemctl enable v2ray
至此,V2ray + WS + Nginx反代 + TLS 的服务端配置完毕,下面配置客户端即可开始使用。
客户端配置
在完成服务端配置后,客户端的配置信息如下,根据不同的客户端填入相应信息即可使用:
- Address: 你的域名
- 端口: 443
- id: v2ray配置文件中自己创建的uuid码
- 传输方式: ws- 路径: /自定义/#即nginx配置和v2ray配置文件中的/自定义/部分,/号别遗漏!
- 域名(Host): v2ray配置中header部分的自定义Host网址
- alterId: 64#和v2ray配置文件中的相同即可
 
- 路径: 
- TLS: 开启,允许不安全的连接
至此,便可以开心的使用代理啦,不同的v2ray客户端软件可能还有全局或者PAC模式,可以自己探索一下。
