Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

nginx在http2回落时未能传递HSTS参数 #148

Closed
SakuraSakuraSakuraChan opened this issue Sep 15, 2022 · 12 comments
Closed

nginx在http2回落时未能传递HSTS参数 #148

SakuraSakuraSakuraChan opened this issue Sep 15, 2022 · 12 comments

Comments

@SakuraSakuraSakuraChan
Copy link

SakuraSakuraSakuraChan commented Sep 15, 2022

之前在用*ray的回落时,如果在nginx的接收回落端口添加HSTS参数:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
这个参数是可以被传递的,这样在 https://www.ssllabs.com/ssltest 测试网址的话会显示HSTS有开启,并且评分为A+
但是经测试,VS的回落没法传递这一参数。
我只用了gRPC回落,不知道其他协议回落如何。
不过这个功能其实不是很重要,GFW探测应该也不管这个,纯粹是无聊测网站分数才会看,因此如果大佬觉得不知道怎么改 / 改这个太麻烦 / 不需要改的话,直接关issue也OK(能改一下当然是坠好滴)

@e1732a364fed
Copy link
Owner

你的情况应该是,vs前置,然后回落到nginx,是吧。

那么nginx怎么设置 add_header 完全是nginx自己的事情,和vs没关系,因为nginx是下游。

你试试普通的http回落或者ws回落,应该 add_header 都正常吧。

是不是h2的问题呢

@SakuraSakuraSakuraChan
Copy link
Author

你的情况应该是,vs前置,然后回落到nginx,是吧。

那么nginx怎么设置 add_header 完全是nginx自己的事情,和vs没关系,因为nginx是下游。

你试试普通的http回落或者ws回落,应该 add_header 都正常吧。

是不是h2的问题呢

我尝试把grpc注释掉了,变成了普通的TCP+TLS,上网正常,不过测试还是没有HSTS,看来不是H2的问题?因为我之前用xray就是TCP+TLS回落到nginx,一样的架构,测试是有HSTS的,说明回落可以做到这个

@e1732a364fed
Copy link
Owner

e1732a364fed commented Sep 15, 2022

搞不懂. 想不通。明明nginx做什么完全和vs无关的,vs只负责转发一下。

@e1732a364fed
Copy link
Owner

e1732a364fed commented Sep 15, 2022

你看看这个链接,有没有用

https://itlanyan.com/be-careful-with-nginx-add_header-directive/

另外你再用完全相同的配置用v2ray测一下

@SakuraSakuraSakuraChan
Copy link
Author

你看看这个链接,有没有用

https://itlanyan.com/be-careful-with-nginx-add_header-directive/

另外你再用完全相同的配置用v2ray测一下

经过最新测试,只要在server listen那里写了http2就不行,测试http失败,也没有HSTS,删掉http2就正常。但是我这个是gRPC的回落端口,感觉删掉http2不太好吧

@e1732a364fed
Copy link
Owner

e1732a364fed commented Sep 18, 2022

那么这样看来,就可能和nginx的http2有一定的关系。我也不知如何是好。。。

总之,不能算是vs的问题了吧。

@e1732a364fed e1732a364fed changed the title [Feature Request] 回落时未能传递HSTS参数 nginx在http2回落时未能传递HSTS参数 Sep 22, 2022
@SakuraSakuraSakuraChan
Copy link
Author

有道理,那我先关了吧

@SakuraSakuraSakuraChan
Copy link
Author

那么这样看来,就可能和nginx的http2有一定的关系。我也不知如何是好。。。

总之,不能算是vs的问题了吧。

佬,除了这个HSTS的问题我又发现了个新问题:之前我xray回落nginx有一个listen的server是443回落过来的,servername为空的那种,返回一个403,结果现在变成listen http2后,返回403正常,但是伪装站打不开了,这个403的listen强行占据了所有回落,只有删掉这个listen才正常,不知道我这样简单说明白了没?目前感觉gRPC的回落虽然很先进,但是跟nginx的协同似乎产生了不少问题,不一定是VS的问题,但是从伪装的角度来看我们也需要注意下

@SakuraSakuraSakuraChan
Copy link
Author

找到可能的原因了 https://trac.nginx.org/nginx/ticket/816

@SakuraSakuraSakuraChan
Copy link
Author

看Xray文档发现了:

有需要时,VLESS 才会尝试读取 TLS ALPN 协商结果,若成功,输出 info realAlpn = 到日志。 用途:解决了 Nginx 的 h2c 服务不能同时兼容 http/1.1 的问题,Nginx 需要写两行 listen,分别用于 1.1 和 h2c。 注意:fallbacks alpn 存在 "h2" 时,Inbound TLS 需设置 "alpn":["h2","http/1.1"],以支持 h2 访问。

看来似乎能通过ALPN回落解决我这个问题

@SakuraSakuraSakuraChan
Copy link
Author

我按照H2和http1.1做了详细分流回落,在ssllabs重新测试,HTTP request不再是fail了(感觉fail是一种特征),而是变成了400 bad request,但感觉这还是一种特征,不像是正常网站通常给出的反应,另外HSTS参数还是没有传递。
根据ssllabs的结果,这个400 bad request是nginx给的,但是nginx版本号跟我的nginx不匹配, @e1732a364fed 想问下VS是会返回nginx的模拟结果吗?(没有用nginx类的reject)

附上我的配置

[[listen]]
tag = "Greencloud_Trojan"
protocol = "trojans"
ip = "0.0.0.0"
port = 443
advancedLayer = "grpc"
fullcone = true

[[fallback]]
from = ["Greencloud_Trojan"]
alpn = ["http/1.1"]
dest = 54321

[[fallback]]
from = ["Greencloud_Trojan"]
alpn = ["h2"]
dest = 12345

[[dial]]
tag = "Greencloud_Trojan"
protocol = "direct"

server {
    listen 80;
    server_name fuck.gfw.com;
    location / {
		return 301 https://fuck.gfw.com${request_uri};
	}
}
server {
	listen 127.0.0.1:12345 http2;
	server_name fuck.gfw.com;
	root /usr/share/nginx/html;
	add_header Strict-Transport-Security "max-age=31536000; preload" always;
}
server {
	listen 127.0.0.1:54321;
	server_name fuck.gfw.com;
	root /usr/share/nginx/html;
	add_header Strict-Transport-Security "max-age=31536000; preload" always;
}

@SakuraSakuraSakuraChan
Copy link
Author

经过长时间摸索终于解决了问题!ssllabs跑出了A+!
原因是我之前没有设置“最终回落”这项,而http请求看起来只能回落到这块。之前用xray的时候不需要这样设置,因为它的回落不支持gRPC,现在VS的gRPC回落需要nginx监听http2,跟监听http不一样了,只需要把HSTS参数写到“最终回落”那块就行了,现在测试出来的结果和正常网站没有区别了,是很好的伪装。附上配置供其他人参考:

[[listen]]
protocol = "trojans"
ip = "0.0.0.0"
host = "fuck.gfw.com"
port = 443
fallback = ":8964"
adv = "grpc"
extra.tls_minVersion = "1.2"

[[fallback]]
from = ["Osa_Trojan"]
alpn = ["http/1.1"]
dest = 12345

[[fallback]]
from = ["Osa_Trojan"]
alpn = ["h2"]
dest = 12345

server {
    listen 80 backlog=1024;
    server_name fuck.gfw.com;
    location / {
		return 301 https://fuck.gfw.com${request_uri};
	}
}
server {
	listen 127.0.0.1:12345 http2;
	server_name fuck.gfw.com;
	root /usr/share/nginx/html;
}
server {
	listen 127.0.0.1:8964;
	server_name fuck.gfw.com;
	root /usr/share/nginx/html;
	location / {
		add_header Strict-Transport-Security "max-age=31536000; preload" always;
	}
}

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants