前言
Xray
已经出来一段时间了,之前一直使用VLESS+tls+ws方式科学上网。但是了解了下XTLS
黑科技,再看看Xray性能测试,这货简直爆炸,性能是TLS的数倍。但是Xray
要监听443端口(不监听也行,但是不够完美),影响做站。虽然有解决方法,可是不够完整,一不小心就跳坑里面去了。Xray
已经带了SNI回落功能,Nginx
也带SNI功能,我还是觉得用Nginx
的比较好,免得折腾Xray
影响网站运行。
问题
因为服务器上有几个站点,装完Xray
后实现SNI分流,过程非常顺利,但是chrome上有问题,几个二级域名访问的内容全部和第一个访问的域名一样。
例如:我先访问a.example.com然后在访问b.example.com,b.example.com响应内容和a.example.com一模一样,然后再访问c.example.com还是和a.example.com一样。开chrome隐身模式直接访问c.example.com正常,然后访问a.example.com或b.example.com内容又全是c.example.com 的(不一定会每次都这样,要看浏览器是否使用现有连接或服务器是否断开了之前的连接)。
这个问题折腾我很长时间,最后发现和HTTP/2有关,我所有站点不使用HTTP/2就会正常,只要有一个站点使用了HTTP/2,你先访问HTTP/2站点,那么后面的其他子域名都会变成它的内容。
最开始我使用Xray
的SNI也是这样,我还以为是Xray SNI的问题,之后换成Nginx
使用SNI还是这样。chrome中有这个问题,用手机safari浏览器完全正常。
经过网上一番搜刮,终于找到了问题根源:通配符域名证书。
由于原始服务器10.0.3.2使用的TLS证书具有通配符名称*.example.com,因此Web浏览器可以建立服务器名称为b.example.com的TLS连接,并对HTTP/2请求使用相同的连接到a.example.com。这可能会在网站和应用程序中导致未定义的行为。
因为HTTP/2会保持TCP连接,导致你访问了a.example.com后,在访问b.example.com的时候使用的同一个连接,SNI跟失效了一样,直接使用该连接访问之前的服务。
解决办法有两种:
- 不使用HTTP/2。
- 不使用通配符域名证书,站点域名证书一个个申请。
配置Nginx SNI
由于默认安装的Nginx
不会构建http_realip
及stream_ssl_preread
模块,需手动添加--with-http_realip_module --with-stream_ssl_preread_module
两个参数再编译安装Nginx
,使用nginx -V
命令可查看已安装的模块。
在主配置文件nginx.conf
的events
和http
之间插入stream_ssl_preread
模块,插入后的配置文件如下:
|
|
伪装站点及业务站点的配置:
|
|
配置Xray
服务端配置:
|
|
最后开启服务端防火墙的443和80端口,如果有另外的软件限制服务器内部端口之间的访问,也要打开相应的端口。
Linux客户端使用VLESS+TCP+XTLS配置:
|
|
Linux客户端使用VMESS+WS+TLS配置:
|
|
- 原文作者:百年孤独
- 原文链接:https://qoanty.github.io/2021/05/xray-nginx-sni/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。