X-Forwarded-For
记录代理服务器的地址,每经过一个代理,该字段会加上一个记录,由于是记录来源地址,所以该字段不会保存最后一个代理服务器的地址。
- 存储客户端Ip和反向代理服务器的Ip列表,以逗号 + 空格分隔。
- 记录最后直连实际服务器之间的整个代理过程。
- 可能会被伪造Ip,但是直连实际服务器这段不会伪造。
X-Real-IP
也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换。
- 请求实际服务器的 IP
- 每过一层 代理都会被覆盖掉,只需第一层设置 代理
- IP可以被伪造,但如果存在一级以上的 dai li,它就不会收到影响,因为每经过一次dai li,它就会被覆盖
第一层 代理 已经拿到了真实的 ip,并在 header 中设置了 X-Real-IP,因此第二层 代理不需要再去设置 X-Real-IP,只需要做转发就可以
remote_addr
表示上一个客户端连接的地址,不存在代理 就表示客户端的地址,存在 代理 就表示最后一个 代理 服务器的地址
- remote_addr无法伪造,
- remote_addr 字段不是通过请求头来决定的,而是服务端在建立tcp连接时获取的的客户端地址
可以这样理解,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求
Go 中可以通过 req.RemoteAddr 代码获取请求地址的 ip