403?也许不只是前端问题

403?也许不只是前端问题

跟运维联调过程中,运维同学告诉我,请求服务时,接口判断源地址,本来是服务器,没有问题;但是你本地起了一个 proxy,所以就判断你本地 proxy 地址了
原理上根据 request_header 的 remote_addr 判断的

http请求头中的 remote-addr, x-forward-for, x-real-ip

  • remote-addr

表示发出请求的远程主机的ip地址,remote-addr代表客户端的ip,但它的值不是由客户端提供,而是服务端根据客户端的IP指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(nginx,apache。。。)就会把remote-addr设为你的机器ip,如果你用了某个代理,那么你的浏览器就会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote-addr设为这台代理机器的ip

  • x-forward-for

代表客户端,也就是http的请求端真实的ip。只有在通过了http代理或者负载均衡服务器时才会添加该项,正如上边所述,当你使用了代理服务器时,web服务器就不知道你的真实ip了,为了避免这个情况,代理服务器就会增加一个叫x-forward-for的头信息,把连接它的客户端ip(即你上网的机器ip)加到这个头信息里,这样就能保证网站的web服务器能获取到真实ip,格式一般为:

Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理

在这里插入图片描述

场景1

是很简单的场景,Nginx Proxy直接把请求往后转发,没有做任何处理

Nginx Proxy
192.168.107.107 nginx.conf
location /test {
    proxy_pass http://192.168.107.112:8080;
}
192.168.107.112 nginx.conf
location /test {
    proxy_pass http://192.168.107.114:8080;
}
Nginx Proxy就是简单的把请求往后转发。
Nginx Backend
192.168.107.114 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr || $http_x_forwarded_for";
}

Nginx Backend输出客户端IP( r e m o t e a d d r ) 和 X − F o r w a r d e d − F o r 请 求 头 ( remote_addr)和X-Forwarded-For请求头( remoteaddrXForwardedForhttp_x_forwarded_for),当访问服务时输出结果如下所示:

192.168.107.112 ||

分析
1.$remote_addr代表客户端IP,当前配置的输出结果为最后一个代理服务器的IP,并不是真实客户端IP;

2.在没有特殊配置情况下,X-Forwarded-For请求头不会自动添加到请求头中,即Nginx Backend的$http_x_forwarded_for输出为空。

场景2

通过添加X-Real-IP和X-Forwarded-For捕获客户端真实IP。

Nginx Proxy
192.168.107.107 nginx.conf
location /test {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.107.112:8080;
}
192.168.107.112 nginx.conf
location /test {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.107.114:8080;
}
Nginx Backend
192.168.107.114 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr ||$http_x_real_ip  ||$http_x_forwarded_for";
}

当访问服务时,输出结果为:

192.168.107.112 || 192.168.162.16 || 192.168.162.16, 192.168.107.107

分析
1.在离用户最近的反向代理NginxProxy 1,通过“proxy_set_header X-Real-IP r e m o t e a d d r ” 把 真 实 客 户 端 I P 写 入 到 请 求 头 X − R e a l − I P , 在 N g i n x B a c k e n d 输 出 remote_addr”把真实客户端IP写入到请求头X-Real-IP,在NginxBackend输出 remoteaddrIPXRealIPNginxBackendhttp_x_real_ip获取到了真实客户端IP;而Nginx Backend的“$remote_addr”输出为最后一个反向代理的IP;
2.“proxy_set_headerX-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for”的…remote_addr用逗号合起来,如果请求头中没有X-Forwarded-For则KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for为remote_addr。
X-Forwarded-For代表了客户端IP,反向代理如Nginx通过KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for添加…remote_addr并不是真实客户端IP。

  • x-real-ip

当有多个代理时候,可以在第一个反向代理上配置“proxy_set_header X-Real-IP $remote_addr” 获取真实客户端IP;

总结

X-Forwarded-For一般是每一个非透明代理转发请求时会将上游服务器的IP地址追加到X-Forwarded-For的后面,使用英文逗号分割
X-Real-IP一般是最后一级代理将上游IP地址添加到该头中
X-Forwarded-For是多个IP地址,而X-Real-IP是一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值