Shudan Wang

没有人不爱惜他的生命,但很少人珍视他的时间。

  • 主页
  • 随笔
所有文章 友链 关于我

Shudan Wang

没有人不爱惜他的生命,但很少人珍视他的时间。

  • 主页
  • 随笔

科学上网工具V2Ray简介及具体搭建过程

2020-02-10

前言

原本在 搬瓦工 上面购买的 VPS 上面搭建的 VPN 不能用了,具体原因就是 GTW 经过一波加强,可以通过 TCP 阻断来封锁一些用于搭建 VPN 的 VPS。TCP 阻断的结果就是在国内无法通过 tcp 来连接访问国外的 VPS,从而在国内无法 SSH 登录 VPS,但是使用 ping 工具【基于 ICMP】却能 ping 通被 tcp 阻断的服务器。
当 VPS 被 TCP 阻断时,原本基于 shadowsocks 的科学上网方式就不能使用了,本文就是针对被 TCP 阻断的 VPS,通过 V2Ray 来实现科学上网。当然对于没有被 TCP 阻断的 VPS 使用该方法来搭梯子也不容易被封。

基础条件

搭建V2Ray的基础条件与SSR基本一致,无(一)甚(贯)特(尿)殊(性):

  1. 购买一台国外VPS服务器:选择自己喜欢的服务商即可【这里有评比】,不建议选择主流服务商像vultr,搬瓦工等,即使正常使用也很有可能被墙。我这次选择的是hostwinds最低配置Linux vps(建议位置选择Seattle,系统选择以稳定著称的CentOS 7),4.49美元/月,有1T流量,最重要的是支持免费更换ip,不限次数(注意购买hostwinds时,不要使用代理ip,直接用本机ip访问hostwinds官网购买,否则会导致购买完成后,vps显示“Pending”状态,不能即时创建服务,需要联系客服进行人工审核)。
  2. 购买一个域名:V2Ray的节点可以伪装成正常的网站,将其流量与正常的网页流量混淆以避开第三方干扰,自然就需要有域名。我这里选择的是namesilo,在域名搜索框搜索自己喜欢的域名,找域名后缀最便宜的购买即可,我的域名后缀是club,1.59美元/年。

点击刚刚注册的域名“DNS Records”选项“update”(画着蓝色小球)打开如下页面:

删除上图的示例记录,将刚刚购买的VPS服务器的IP填入A记录,设置结果如下图示,至此域名解析完成:

实现过程

Vmess + WebSocket + TLS (以下简称 wss)是V2Ray服务端主流的工作方式,因其特征如同 HTTPS 流量,可以隐藏 V2Ray 路径,主动侦测会得到正常 HTTP 网站响应,具有良好的伪装能力,目前被广泛用于反审查。但如此强大的伪装能力,需要付出严重的性能代价:TLS 1.3 握手需要消耗 1-rtt,WS 握手也需要消耗 1-rtt,增大了握手延迟。V2Ray 增加了 mux 以减少握手的发生,然而实际使用中 mux 体验并不好,很多用户选择关闭。

服务端搭建

本文V2Ray服务端采用Vmess + TCP + TLS的工作方式进行网站伪装,省下WS的握手延迟。工作原理:HaProxy 监听 443 端口,处理 TLS 之后,将 HTTP 流量交由 Web 服务器处理,非 HTTP 流量交由 V2Ray 按 Vmess 处理。
本次方案使用 HaProxy,Caddy/Nginx(Web 服务器还可以用 httpd 等替代),V2Ray,服务器系统为 Centos 7。
1.使用Xshell以root身份登录到远程主机(购买的VPS服务器),特别注意,V2Ray 对于时间有比较严格的要求,要求服务器和客户端时间差绝对值不能超过 2 分钟【不要求时区一致】,所以一定要保证时间足够准确。
2.安装HaProxy,为了较好的支持 TLS1.3,HaProxy 版本应大于 1.8.15,OpenSSl 版本应大于 1.1.1,如果您使用的发行版仓库自带的版本较低,您可能需要自行编译安装:

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
[root@hwsrv-698253 ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017

//自行编译安装openssl
[root@hwsrv-698253 ~]# mkdir soft && cd soft
[root@hwsrv-698253 soft]# wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
[root@hwsrv-698253 soft]# tar -xvf openssl-1.1.1g.tar.gz && cd openssl-1.1.1g
[root@hwsrv-698253 openssl-1.1.1g]# ./config --prefix=/usr/local/openssl
[root@hwsrv-698253 openssl-1.1.1g]# make && make install

//保存并替换当前系统旧版本的openssl
[root@hwsrv-698253 ~]# cd ~
[root@hwsrv-698253 ~]# mv /usr/bin/openssl /usr/bin/openssl.old
[root@hwsrv-698253 ~]# mv /usr/lib64/openssl /usr/lib64/openssl.old
[root@hwsrv-698253 ~]# mv /opt/puppetlabs/puppet/lib/libssl.so.1.0.0 /opt/puppetlabs/puppet/lib/libssl.so.1.0.0.old
[root@hwsrv-698253 ~]# mv /opt/puppetlabs/puppet/lib/libssl.so /opt/puppetlabs/puppet/lib/libssl.so.old
[root@hwsrv-698253 ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@hwsrv-698253 ~]# ln -s /usr/local/openssl/include/openssl /usr/include/openssl
[root@hwsrv-698253 ~]# ln -s /usr/local/openssl/lib/libssl.so /opt/puppetlabs/puppet/lib/libssl.so
[root@hwsrv-698253 ~]# echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
[root@hwsrv-698253 ~]# ldconfig -v
[root@hwsrv-698253 ~]# openssl version
OpenSSL 1.1.1g 21 Apr 2020

//Centos7.8.2003, 发行版仓库自带的haproxy版本为1.5.18,So依然自行编译安装
[root@hwsrv-698253 ~]# cd soft
[root@hwsrv-698253 soft]# yum install -y openssl-devel systemd-devel.x86_64 pcre-devel
[root@hwsrv-698253 soft]# wget http://www.haproxy.org/download/2.1/src/haproxy-2.1.4.tar.gz
[root@hwsrv-698253 soft]# tar -xvf haproxy-2.1.4.tar.gz && cd haproxy-2.1.4
//使用uname -r查看内核,如:3.10.0-514.el7,此时TARGET=linux310
[root@hwsrv-698253 haproxy-2.1.4]# make TARGET=linux310 USE_OPENSSL=1 USE_SYSTEMD=1 USE_PCRE=1 USE_ZLIB=1 && make install
[root@hwsrv-698253 haproxy-2.1.4]# mkdir /etc/haproxy /var/lib/haproxy
[root@hwsrv-698253 haproxy-2.1.4]# touch /var/lib/haproxy/stats
[root@hwsrv-698253 haproxy-2.1.4]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

新增执行用户useradd haproxy -p /sbin/nologin,将haproxy注册到系统服务:

1
2
3
[root@hwsrv-698253 haproxy-2.1.4]# cp examples/haproxy.init /etc/init.d/haproxy
[root@hwsrv-698253 haproxy-2.1.4]# chmod 755 /etc/init.d/haproxy
[root@hwsrv-698253 haproxy-2.1.4]# systemctl daemon-reload

HaProxy 1.79及以后的版本没有自带haproxy.cfg配置文件,我们要自行找模版【万能搜索】编写下 /etc/haproxy/haproxy.cfg(检查配置文件 haproxy -c -f /etc/haproxy/haproxy.cfg),最后启动Haproxy:

1
2
systemctl start haproxy
systemctl enable haproxy

3.安装 Web 服务器,Caddy 参考这个教程,本文选用Apache:

1
2
3
4
5
6
7
8
9
10
[root@hwsrv-698253 ~]# yum -y install httpd

[root@hwsrv-698253 ~]# /usr/sbin/sestatus
SELinux status: disabled
//如果服务器打开了防火墙,你需要运行如下命令以打开80和443端口
[root@hwsrv-698253 ~]# firewall-cmd --permanent --zone=public --add-service=http
[root@hwsrv-698253 ~]# firewall-cmd --permanent --zone=public --add-service=https
[root@hwsrv-698253 ~]# firewall-cmd --reload

[root@hwsrv-698253 ~]# systemctl start httpd

4.安装 V2Ray,V2Ray 提供了一个在 Linux 中的自动化安装脚本。这个脚本会自动检测有没有安装过 V2Ray,如果没有,则进行完整的安装和配置;如果之前安装过 V2Ray,则只更新 V2Ray 二进制程序而不更新配置。

1
[root@hwsrv-698253 ~]# bash <(curl -L -s https://install.direct/go.sh)

修改 V2Ray 配置文件/etc/v2ray/config.json,以 Vmess + TCP 方式监听 40001 端口:

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
{
"inbounds": [
{
"port": 40001,
"protocol": "vmess",
"listen": "127.0.0.1",
"settings": {
"clients": [
{
"id": "f2435e5c-9ad9-4367-836a-8341117d0a5f",
"alterId": 64
}
]
},
"streamSettings": {
"network": "tcp"
}
}],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

5.修改Web服务器配置文件,部署HTTP服务于8080端口,以Apache为例:

1
2
3
[root@hwsrv-698253 ~]# vim /etc/httpd/conf/httpd.conf
修改Listen 80 为 Listen 8080
修改ServerName... 为 ServerName sdwangzone.club:8080

6.修改HaProxy配置文件/etc/haproxy/haproxy.cfg,内容如下所示:

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
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# 仅使用支持 FS 和 AEAD 的加密套件
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
# ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
# 禁用 TLS 1.2 之前的 TLS
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11

tune.ssl.default-dh-param 2048

defaults
log global
# 我们需要使用 tcp 模式
mode tcp
option dontlognull
timeout connect 5s
# 空闲连接等待时间,这里使用与 V2Ray 默认 connIdle 一致的 300s
timeout client 300s
timeout server 300s


frontend tls-in
# 监听 443 tls,tfo 根据自身情况决定是否开启,证书放置于 /etc/ssl/private/example.com.pem
bind *:443 tfo ssl crt /etc/ssl/private/3567773_sdwangzone.club.pem
tcp-request inspect-delay 5s
tcp-request content accept if HTTP
# 将 HTTP 流量发给 web 后端
use_backend web if HTTP
# 将其他流量发给 vmess 后端
default_backend vmess

backend web
server server1 127.0.0.1:8080

backend vmess
server server1 127.0.0.1:40001

7.重启各项服务:

1
2
3
systemctl restart haproxy
systemctl restart httpd
systemctl restart v2ray

客户端配置

下载相应客户端予以配置,本文以Mac OSX为例:

1
brew cask install v2rayx

点击Config选项卡,配置如下界面:

对于非图形化配置的客户端,可将客户端的 config.json 文件修改成下面的内容,修改后重启 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
29
30
31
32
{
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks"
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "f2435e5c-9ad9-4367-836a-8341117d0a5f",
"security": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls"
}
}
]
}

赏

谢谢你请我吃糖果

支付宝
微信
  • V2Ray

扫一扫,分享到微信

微信分享二维码
《Docker从入门到实践》之基础篇
Laravel进阶之事件篇
  1. 1. 前言
  2. 2. 基础条件
  3. 3. 实现过程
    1. 3.1. 服务端搭建
    2. 3.2. 客户端配置
© 2023 Shudan Wang
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • CI框架源码解析
  • HTTP原理
  • 网络技术
  • Laravel
  • Linux基础篇
  • Linux之常用命令
  • php杂集
  • 随笔
  • PHP
  • 网络安全
  • GO
  • mysql
  • Apache
  • Git
  • SSH
  • V2Ray
  • 数据结构
  • HTML
  • Nginx
  • NoSQL
  • Docker
  • Memcached

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 廖雪峰
  • 阮一峰
  • 陈皓
很惭愧

只做了一点微小的工作
谢谢大家