起因
由于忍不住剁手新入一台韩国Kdatacenter的VPS,从南京联通出去的链路还是不错的,如图所示。
于是乎,需要给它重新配置一些东西。默认给的操作系统是CentOS6,我发工单改成了CentOS7。它家工单系统蛮有意思的,我半夜三点钟发居然十分钟后就回复了,看来是有其他时区的客服。
最近发现官方社区出了TCP+TLS的指南,不再是以前的Websocket+TLS,而是参照Trojan的TCP+TLS的思路,用Haproxy作为443前端根据流量特征进行中转,具体来说就是,如果接入流量真的是http流量的话,那么就送到nginx后端,如果是其他流量的话,那么就把它送到v2ray的VMESS端口里。以前的方式是固定web path里的统统用websocket反向代理到VMESS端口。现在这种TCP+TLS的方式根据测试延迟会比以前低一些。
我个人第一想法是感觉额外添加一个Haproxy出来不够美观,最近时间紧,我就不要去探索了,2333~~ 之前没看仔细,已经有人搭了只靠nginx转发的了。
以下所有操作默认都在root用户中执行
步骤
1.域名解析
我的域名是在Cloudflare上解析的,登录Cloudflare,之后创建A记录到我服务器的IP即可。
2.安装nginx
最省事的方法是直接用APT或者YUM装
1 | yum update |
修改配置vim /etc/nginx/nginx.conf
,找到server_name这一项,将localhost改为自己的域名
1 | server |
3.申请证书
要用正常的TLS得有签名的证书才行,这里我们采用certbot来实现 lets encrypt证书的申请和自动续期
3.1 下载certbot
1 | yum install certbot python2-certbot-nginx |
3.2 选择Certbot的运行方式
由于我们不需要nginx直接监听443,因此这里建议仅生成证书
1 | certbot certonly --nginx |
成功之后证书存在
1 | ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; # managed by Certbot |
3.3 设定自动续期
1 | echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null |
4.配置Haproxy
4.1 编译openssl 1.1.1
我们需要openssl1.1.1要支持TLS 1.3
安装依赖
1 | yum groupinstall 'Development Tools' |
下载源码
1 | wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz |
编译
1 | cd openssl-OpenSSL_1_1_1g/ |
4.2 编译haproxy
源码下载
1 | yum install -y make gcc perl pcre-devel zlib-devel pcre2 pcre2-devel |
编译
1 | make TARGET=linux2628 CPU=native USE_PCRE2=1 USE_PCRE2_JIT=1 USE_OPENSSL=1 SSL_LIB=/opt/openssl-1.1.1/lib SSL_INC=/opt/openssl-1.1.1/include USE_ZLIB=1 |
创建配置文件
1 | mkdir /etc/haproxy/ |
代码内容如下
1 | global |
HaProxy 的证书和密钥放于同一个文件,与 Caddy 和 Nginx 不同,可以使用命令 cat example.com.crt example.com.key > example.com.pem
合成证书
修改haproxy系统服务启动脚本:
vim /etc/systemd/system/haproxy.service
1 | 确保在[Service]这一栏有这样的一项 |
测试,首先测试配置是否正确,如果发现错误就根据错误改正
1 | haproxy -db -f /etc/haproxy/haproxy.cfg |
运行
1 | /etc/init.d/haproxy start |
如果没有任何提示,说明haproxy配置无误,Ctrl+C退出测试。
启动服务
1 | systemctl start haproxy |
此时输入netstat -npl |grep 443
可以看到haproxy已经开始监听443端口
1 | tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 23824/haproxy |
Haproxy常见错误排查
如果提示
1 | [ALERT] 168/131339 (22782) : Starting frontend GLOBAL: cannot bind UNIX socket [/run/haproxy/admin.sock] |
首先检查443端口是否被占用,先把apache,nginx, caddy关掉,之后的章节会提到,我们会将它的监听端口改为其他端口,用haproxy作实际443监听端口。
使用netstat -npl |grep 443
检查是否有进程占用443端口。
如果确认没有,但仍然报错,则需要手动创建/run/haproxy/这个目录:
Haproxy needs to write to
/run/haproxy/admin.sock
but it wont create the directory for you. Create the directory/run/haproxy/
first or setstats socket
to a different path.
1 | mkdir /run/haproxy/ |
请注意:
1.务必先编译openssl 1.1.1再编译haproxy,可以通过haproxy -vv |grep OpenSSL
查看当前编译时候openssl的版本,如果版本号不对,请指定正确版本的openssl路径后重新编译
1 | haproxy -vv |grep OpenSSL |
配置v2ray服务端
安装
1 | bash <(curl -L -s https://install.direct/go.sh) |
配置vim /etc/v2ray/config.json
内容如下:
1 | { |
启动服务
1 | systemctl start v2ray |
修改nginx服务端配置
vim /etc/nginx/nginx.conf
在 http{} 里面添加,这样我们只用nginx监听普通8080端口即可,因为haproxy那边本地转发前已经解包成了明文了。
1 | server { |
重启服务端
1 | systemctl restart nginx |
其他
到目前为止,所有的服务就已经搭建完毕了,在浏览器里输入 https:// + 你的域名, 如果能够正常访问,说明haproxy和nginx的链路已经通了,基本上就代表可以用了。VMESS的路一般不会出什么问题,这时候就可以用客户端试一下了。
客户端的配置以及一些延迟测试就不多介绍了,参考官方社区吧。
使用体验
油管1080P随便拽,4k流畅秒开,可以看奈飞
油管4k
Netflix
下一步计划
1.整个一套配置下来还是很繁琐的。我打算之后写一套docker-compose,以方便复用。
2.这个机器有100G硬盘呢,反正暂时又不建站,不如下一步在上面建个图床玩玩