kubernetes中通过ingress转发到nginx获取ip

avatar 2023年8月4日18:31:28 评论 248 次浏览

先说一下我的情况,我的环境是通过slb转发到ingress,然后在ingress中通过路由转发到nginx,在nginx配置反向代理到不同的服务,首先,我的ingress能够获取到用户的真是IP,但是我的nginx无法获取到,在nginx里remote_addr 获取到都是ingress的pod ip地址,这种方式不是我想要的,我想要的是ingress能够获取到用户的真实ip,nginx同样也可以获取到用户的真实IP,ingress获取用户的真实IP可以参考:https://www.wulaoer.org/?p=2122

我们要想让nginx能够获取到用户的真实IP就需要在nginx里进行配置,首先我们需要定义一下信任的IP地址,另外需要把ingress获取的字段进行转换,这样就可以了。

 set_real_ip_from 10.244.0.0/16;   # 定义信任地址
 real_ip_header X-Forwarded-For;   # 将 X-Forwarded-For 字段包含的 IP 替换原 $remote_addr 值 
 # 将 $remote_addr 值替换为由 real_ip_header 指令定义的请求标头字段包含地址中最后一个不受信任的地址,即排除配置中定义的信任地址。
 real_ip_recursive on;             

这里定义的信任地址是pod的地址段,不是server的地址段。把上面的信息可以放在http里也可以放在server里,看自己的情况,因为这个配置是写到基础镜像里的,如果基础镜像在k8s之外有使用建议放在server里。

     server {
         listen       80;
 
         set_real_ip_from 173.32.0.0/12;
         real_ip_header   X-Forwarded-For; 
         real_ip_recursive on;
         .................................... 
         client_max_body_size 100m;
         client_body_buffer_size 30M;
         client_header_timeout    120s;
         client_header_buffer_size 4096k;
         large_client_header_buffers 4 4096k;
         proxy_set_header X-Forwarded-For $remote_addr;
 ...............................................        

我的配置,配置后重启一下nginx,即可,在看日志就会发现获取的日志是用户的真实ip地址了。没有了看些别的吧。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: