-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
header中包含x-forwarded-host导致请求被转发至x-forwarded-host指定的地址上 #572
Comments
你的预期效果是什么? |
我认为请求头部包含 x-forwarded-host 参数,不应该被转发到 x-forwarded-host 指定的地址上,这个参数只是说明客户端第一次请求时的地址,非期望地址。 目前的这个行为通过whistle ui观测会让我以为是我的业务代码写错了 |
|
所以 现在的适用:whistle介于反向代理服务器和真实服务器之间或whistle直接作为代理服务器,x-forwarded-host是服务真实地址。此处架设whistle的用途是监听真实服务器的进入流量。 而我的场景 whistle介于正向代理服务器和真实服务器之间,正向代理服务器设置x-forwarded-host为用户请求原始地址(仅标识),跟上面用途冲突,导致请求转发错误。此处架设whistle的用途是为了监听正向代理服务器的流出流量。 |
现在的会导致如果有使用正向代理服务后添加了x-forwarded-host,再过whistle时默认又给转回去了,本身想用whistle排查正向代理服务出来的报文是否有配置错误,结果whistle还真显示了个"正向代理服务"转发错误问题。 我觉得:如果现在的行为是大多数行为,且不能改的话,那么原始请求被修改,ui上至少应该有个提示,原始报文被修改了。 我看源码中实际有个等价的x-whistle-real-host参数 |
whistle 认为这个就是原始请求,可以换个字段 |
作为代理服务器,这没有问题,可以当做原始请求。但作为抓包工具,这修改了原始的报文,原本期望抓包排查网络问题的,却意外的被抓包工具的策略引导到一个错误方向。如果不是额外用了wireshark,我一直认为是我引入zuul组件配置的问题,调试跟了半天zuul源码没发现问题,x-forwarded-host的添加是zuul作为正向代理的默认行为。 |
这么说也有道理,下个版本默认关闭 |
更新下版本,加上 |
场景描述
公司有个内部服务需要暴露到公网并增加鉴权,因此选用了Zuul集成到java中实现。
假设公网域名地址为 temp.xx.com/proxy/real-path 内部服务test.xx.com/real-path
1.客户端发起请求 temp.xx.com/proxy/real-path
2.经过zuul时按配置转发请求到 test.xx.com/real-path时,同时添加 x-forwarded-host: temp.xx.com
3.经过whistle时有段逻辑判断会修改请求url导致请求地址变成 temp.xx.com/real-path报404错误,x-forwarded-host头部也被干掉了
简单复现
curl -v -H 'x-forwarded-host:www.jd.com' http://www.taobao.com -x 127.0.0.1:8899
< HTTP/1.1 302 Found
< Server: nginx
< Date: Thu, 20 May 2021 06:16:31 GMT
< Content-Type: text/html
< Connection: keep-alive
< Location: https://www.jd.com/ 请求变成jd了
< Access-Control-Allow-Origin: *
< Timing-Allow-Origin: *
< X-Trace: 302-1621491391996-0-0-0-0-0
< Strict-Transport-Security: max-age=3600
< Transfer-Encoding: chunked
排查
404时 whistle中显示的地址是错误的 temp.xx.com/real-path 正确的应该是 test.xx.com/real-path
一开始猜测是zuul有问题把请求地址路由错了,同时使用wireshark抓了一下发现,zuul中转发的是正确的地址 test.xx.com/real-path,是whistle把地址给修改了
思考🤔
我在 MDN上看了下关于
X-Forwarded-Host
的说明:它是一个事实上的标准首部,用来确定客户端发起的请求中使用 Host 指定的初始域名。这个参数的意思按我的理解是 客户端发起请求最初的host。在我的场景中,zuul自动添加 x-forwarded-host: temp.xx.com的行为是合理的。同时使用fiddler测试是正常的转发
修改
我在项目中搜索了下发现 lib/util/index.js 中 getFullUrl 方法中会使用 x-forwarded-host 替换到url中的host,并被删掉了。
简单修改:https://github.com/hellojqk/whistle/commit/0c26047c719b612d481fb857e87af66c2d54c8a0 后可正确转发。
The text was updated successfully, but these errors were encountered: