思路来自:
新 V2Ray 白话文指南:TCP + TLS + Web

上文已经比较详细,本文作为回顾总结学习交流之用,相当于上文的补充和我个人遇到的问题的分享,限于个人水平,难免存在错讹之处,万望读者不吝指正。

另外,作者撰写此文仅具学习交流技术之目的,请勿将本文所说明之技术用于任何可能违反法律的方面

基本思路

简图如下:

原理简图
原理简图

主要步骤:

  • 以Nginx为服务器,搭建起一个网站;
  • 为这个网站申请证书并整合成Haproxy适用的格式;
  • 安装V2Ray并修改其配置文件;
  • 安装Haproxy并修改其配置文件;
  • 修改Nginx虚拟主机的配置文件;
  • 一切就绪,重启Nginx、V2Ray、Haproxy服务;

Nginx 建网站

这里的网站静态动态皆可,可能只是因为原文中这个网站只是充门面而已所以说是静态网站。而对于我来说这个网站还要作为我的个人博客,所以要复杂一些。可以参考本站另一篇文章。

申请证书

推荐使用acme.sh自动申请证书。

得到证书后需要将证书转换为haproxy需要的格式。

安装V2Ray

直接使用官方脚本即可,详见原文。

注意这里的V2Ray使用的是40001端口。

安装Haproxy并修改配置

这里一定注意需要Haproxy 1.8.15 及以上版本,否则无法支持TLS1.3。

而Ubuntu软件源里的Haproxy版本过于老旧,只好自行编译源码,可参考这里

配置方法详见原文。

再次修改Nginx配置文件

注意将80端口重定向到443端口;

另外网站需要监听一个除了443和80之外的端口,原文例为8080。

一切就绪,重启服务

重启服务(xxx为服务的名字)

systemctl xxx restart

(其他操作类比以上,将restart换成别的就好)

其他

  • 注意系统的防火墙。防火墙应当放行443和80端口(已重定向至443)。同时不要开放上文中的40001端口和8080端口(分别对应V2Ray和Nginx),这两个应当由Haproxy进行转发。

    这里强推Ubuntu,因为自带的ufw防火墙比iptablesfirewalld 要简单好多。
  • 每隔90天证书会失效,虽然 acme.sh 会自动为你更新,但生成Haproxy可用证书的那一步还是需要你亲自完成。

    Update 20.11.15: 这个地方可以利用一下 acme.shreloadcmd 参数,把拼接操作写进里面:

    acme.sh  --installcert  -d  example.com \
            --key-file  /etc/ssl/private/example.com.key\
            --cert-file /etc/ssl/private/example.com.cert.cer \
            --reloadcmd  "cat /etc/ssl/private/example.com.cert.cer /etc/ssl/private/example.com.key > /etc/ssl/private/example.com.pem && service haproxy restart"

    通过这种方式安装一次证书之后,acme.sh 就会记住这些设置用来自动更新。不出意外的话以后就不需要人为干预证书的更新了。

  • 如果启动haproxy时出现 Starting frontend GLOBAL: cannot bind UNIX socket [/run/haproxy/admin.sock] 错误,请 mkdir -p /var/run/haproxy/ 原因参考这里