如题,Nginx 本身是带有日志功能的,默认设置下可以看到哪些 IP,访问了哪个路由,用的什么设备等等。但是通常业务端还想记录一些业务相关的内容,比如由哪个用户进行访问,使用了什么配置、什么权限等等,这些信息必须要到业务端的日志里才能获取到。但是经过 nginx 反代之后原始的 IP 信息会丢失,业务端日志里看到的请求者全都是 nginx,很令人迷惑,而 nginx 里某一 IP 的对应业务端记录,又不知道去哪个节点里找,
这种问题一般要怎么解决呢?
1
Ptu2sha 2021-02-15 20:25:07 +08:00
你是没用过 proxy ? foward_ip 啊转发带过来
|
2
Lax 2021-02-15 20:28:11 +08:00
Google 关键词:nginx proxy_add_x_forwarded_for
|
3
wunonglin 2021-02-15 20:28:44 +08:00
又是你哈哈哈哈哈哈。
你 nginx 配置了 proxy_pass_request_body on;和 proxy_pass_request_headers on;没 |
4
wunonglin 2021-02-15 20:30:47 +08:00
还有个$proxy_add_x_forwarded_for;和$remote_addr;着两个变量可以给你用。
还有要配 proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;这个,应该就能拿到了 |
5
LeeReamond OP @Ptu2sha 感谢,搜索了一下解决了
|
6
LeeReamond OP @wunonglin 大佬住在 v 站么,每次发帖你都能看到。不过我联想到一个问题,看这个 nginx 推 IP 的方式,似乎就是在 http headers 里面加一些信息而已。想起来之前看到 web 后端一般识别路由等都需要依赖 headers 里面的 host 来进行判断,所以有恶意修改 host 的攻击方式。
我在 fastapi 官网的中间件部分看到这个,它有一个限制可信 host 的中间件专门防止这种攻击。但是我用他这个的话,我的 vue 前端没法控制所有请求的 host 啊,比如 vue 请求 html 的时候会加上 host,请求 js 文件之类的时候,请求会直接进入后端,不跟前端发生关系,没法自定义 host,chrome 默认就加载不出来┓( ´∀` )┏ |
7
wunonglin 2021-02-15 20:50:24 +08:00
fastapi 没接触过,这个是 python 的东西吧?
前端的话是因为页面发出 xhr 请求的时候是不能修改请求头的 host 的,但是你为啥有会要用页面控制 host 的需求? |
8
wunonglin 2021-02-15 20:58:43 +08:00
@LeeReamond #6 而且,后端识别路由是不由 path 来决定的么
|
9
LeeReamond OP @wunonglin 毕竟我 web engine 不是我自己实现的,我也不清楚里面实现细节,不清楚他的解析实现是否有风险,其实我也是第一次听说恶意修改 headers 里面的 host 还能用来攻击。我后来试了一下,也是用那个 nginx 推 headers 的办法可以解决,nginx 可以自动给没有预设 host 参数的请求自动补上,然后由业务端中间件校验一下合法性,似乎可以防御这种攻击。
|
10
wunonglin 2021-02-16 01:55:36 +08:00
@LeeReamond #9 这种我也没碰到过,我是用 nginx 做反代的,server_name 那里就已经根据请求 url 的 host 来分配 vhost 了,如果是自己写的 web 服务器的话估计需要注意下这个问题
|
11
julyclyde 2021-02-16 13:05:15 +08:00
@LeeReamond 你以为按 host 识别,说明你的知识领域还仅仅在于开发这方面,而不了解 http 标准
|
12
LeeReamond OP @julyclyde 确实不是很了解,大佬了解大佬讲讲标准规范是啥样的。不过 http 协议,想了解也没个集中说明的地方吧,总不可能把标准书背下来,一般都是用到哪里查哪里记哪里,不用的就忽略了
|
13
julyclyde 2021-02-16 18:39:33 +08:00
@LeeReamond 觉得协议标准没有个集中说明的地方,说明你学习方法有问题啊。http 标准 RFC2616
web 服务器要先看 host header 然后才能区分虚拟主机。在配置正确的情况下,nginx 不会把“不区分 host 所有的请求”都发给你的应用程序,你的应用程序收到的只有按照 host header 筛选过的部分请求 |