阿里云slb 7层代理ingress获取真实客户端ip的方法

起因:ingress 设置ip白名单之后,发现白名单里的ip 403拒绝,后续通过追踪ingress的日志发现 真实的ip 是slb的保留ip 也就是上层代理的ip。这样是无法获取到真实用户的ip的。

nginx里的解决方案:

使用X-Forwarded-For的方式获取客户端的真实IP地址。

需要添加的配置字段和信息为:

set_real_ip_from IP_address

real_ip_header X-Forwarded-For;

ingress-nginx的配置方法如下:

kubectl edit cm nginx-configuration -n kube-system

新增:

http-snippet: |
set_real_ip_from 100.121.0.0/16;
real_ip_header X-Forwarded-For;

100.121.0.0 为slb的保留地址,每个slb的保留地址是不一样的,只要针对自己的slb保留地址做配置就好了。使用七层负载均衡默认情况下real_ip获取到的是slb的保留地址如以下日志:

{ "real_ip" : "100.121.134.220" ,"time": "2019-04-02T16:41:43+08:00", "remote_addr": "", "x-forward-for": "183.129.243.163, 100.121.134.220", "request_id": "3d55a0d610116e249d6fda1b4746d9b0", "remote_user": "-", "bytes_sent": 785, "request_time": 0.065, "status": 200, "vhost": "presboss.qjdchina.com", "request_proto": "HTTP/1.1", "path": "/clms/boss/accountbank/list", "request_query": "parentId=0", "request_length": 755, "duration": 0.065, "method": "GET", "http_referrer": "https://presboss.qjdchina.com/clms/boss/customerFlow/detail?taskId=1870002&processId=1867328", "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" }

  • set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
  • real_ip_header:从哪个header头检索出要的IP地址
  • real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。
    • 在real_ip_recursive on的情况下
      • 61.22.22.22,121.207.33.33,192.168.50.121都出现在set_real_ip_from中,仅仅120.22.11.11没出现,那么他就被认为是用户的ip地址,并且赋值到remote_addr变量
    • 在real_ip_recursive off或者不设置的情况下
      • 192.168.50.121出现在set_real_ip_from中,排除掉,接下来的ip地址便认为是用 户的 ip地址

    • 例如我上面的例子:
      • ​​​​​​183.129.243.163, 100.121.134.220 排除100.121.0.0/16网段的ip 剩下的183.129.243.163就是客户端的ip

​​​​​​​​​​​​​​

​​​​​​​

发布了49 篇原创文章 · 获赞 39 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_22543991/article/details/88977443