首页 > 系统相关 >Nginx 获取与传递真实访问IP

Nginx 获取与传递真实访问IP

时间:2023-06-10 16:34:50浏览次数:53  
标签:http addr header IP 访问 Nginx nginx ip

1. 环境

首先,我这里的环境为nginx-1.1.2.2,通过yum安装。如果想要源码安装,需要通过如下参数,启用ngx_http_realip_module模块。

--with-http_realip_module

而传递真实IP到后端,需要使用到ngx_http_proxy_module模块,此模块默认会编译。

对于Nginx的安装和添加nginx模块等,有问题可参考:

《centos7 nginx 安装与配置实现负载均衡》

《Centos7 nginx 不中断服务添加新模块或第三方模块》

 

2. 配置nginx

然后修改nginx的配置,在http{}的配置中,按如下添加配置:

# 编译nginx配置文件,我这里是yum安装的。
$ vim /etc/nginx/nginx.conf
-------------------------------------------------------------------
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format weblog '$msec | $time_local | $host | $status | $bytes_sent | $remote_addr | $upstream_addr | $request | $request_time | $upstream_response_time | $request_length | $http_referer | $http_user_agent';

    # 注意,这里我使用的日志格式为我自定义的weblog日志格式,其中会输出$remote_addr 远程客户端地址。
    access_log  /var/log/nginx/access.log  weblog;

    # 下面三行为重点,添加后就可以获取到客户端真实IP
    set_real_ip_from 0.0.0.0/0;
    real_ip_header  X-Forwarded-For;
    real_ip_recursive on;

    # 下面三行为常见反向代理传递真实客户端IP的配置,配置在http{}中,则全局应用在下面的所有server中
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

}
-------------------------------------------------------------------

# 重载配置生效,我这里是yum安装
$ systemctl reload nginx

获取真实IP

获取真实IP使用到的ngx_http_realip_module模块,会通过配置提取用户真实IP,并将其负值到$remote_addr,共有三个配置参数,分别是:

  • set_real_ip_from:定义接受从哪个信任前代理处获得真实用户ip,可以定义多行,可定义为ip,ip段,支持ipv4和ipv6
  • real_ip_header:定义从接收到报文的哪个http头部去获取前代理传送的用户ip,默认为X-Real-IP
  • real_ip_recursive:递归搜索,默认为off

参数配置说明:

set_real_ip_from为定义信任ip,如果发送方的ip不在信任中,则不处理,$remote_addr就还会是发送发的地址。如果ip在信任中,则会根据下一个参数real_ip_header的设定,将指定的header头字段的数据作为$remote_addr。

如果real_ip_header中定义的header头字段,只传来了一个IP,比如默认的X-Real-Ip,则会直接将这个ip作为$remote_addr。这时候,如果像阿里云SLB,CDN,或者别的nginx等这类代理传来的,其真实IP可以是通过别的header字段传来的,那么跟去实际情况,定义此字段,这里我用的常见的X-Forwarded-For字段

这里需要说明一下X-Forwarded-For这个header信息,用于记录此请求所进过的ip,假设本nginx为第3层代理,那么获取到的X-Forwarded-For就会记录3个ip,分别顺序为:

用户IP 第一层代理IP 第二层代理IP

这时候就会用到real_ip_recursive参数,如果此参数不开启,就会从右往左,取第一个出现在信任中的IP的左边一位的IP作为$remote_addr,我们这里是全信任,所以就会取到第一层代理IP,这明显就并不一定对。如果开启了real_ip_recursive,那么就会从右边往左一直取到第一个不信任的IP作为$remote_addr,如果像我这里是全部信任,那么最左边的IP则会被作为$remote_addr。

传递真实IP

在上面的配置中,使用proxy_set_header,通过设置header信息来传递真实IP,由于上面我们获取到了真实IP,然后可以通过默认的X-Real-IP头,将获取到的$remote_addr传递过去。也可以通过X-Forwarded-For 使用$proxy_add_x_forwarded_for在获取到的X-Forwarded-For末尾添加上自身的IP然后传递到下一层。设置Host为主机名,当发送发发来的header中有Host的header信息,则会作为$Host传递,如果没有则为nginx服务器主机名。这也是一种传递客户端信息的方式。

上面三行proxy_set_header为最常见的传递参数,注意由于很多时候header中不一定有Host字段,所以基本都是以IP作为客户端标识。

标签:http,addr,header,IP,访问,Nginx,nginx,ip
From: https://www.cnblogs.com/yanzi2020/p/17471481.html

相关文章

  • nginx及常用部署方式与性能优化
    nginx做反向代理服务器nginx配置:upstreambackend_server{server123.34.34.34weight=1server123.34.34.35weight=1}server{location/{proxy_passhttp://backend_server;proxy_set_headerHost$http_hosti:$http_host:$proxy_port;......
  • 【Ubuntu22.04】配置静态IP地址和FTP服务
    ##一、配置静态IP1.使用命令`ipa`查看当前网卡名称,Ubuntu22.04默认网卡为ens33:![](https://img2023.cnblogs.com/blog/3081210/202306/3081210-20230610143107393-250043837.png)2.使用命令`tree/etc/netplan`查看默认网卡配置文件:![](https://img2023.cnblogs.com/blog/......
  • NGINX配置详解
    NGINX配置详解关于ngx虽然一直在用,但是对其配置及详细作用有些一知半解,本周趁有时间刚好一起梳理下。本篇文章将包括常用的ngx功能,如代理及负载均衡等,争取内容尽量全面丰富一些。什么是NGXNginx是开源的轻量级Web服务器、反向代理服务器,以及负载均衡器和HTTP缓存器。其特......
  • javascript简单介绍
    javaScript简介介绍:一种弱类型世界上最流行的脚本语言,其源代码不需要经过编译,而是由浏览器直接运行,控制网页的行为。表现层CSScss层叠样式表是一门标记语言,并不是编程语言,因此不能进行自定义变量,不可以引用等,就是不具备任何语法支持。前端人员提供了一种css的预处理器,提供css......
  • 8、利用构建好的Ubuntu镜像构建Nginx镜像
    利用DockerFile文件执行dockerbuild基于基础镜像自动构建nginx镜像做的时候可以找一台宿主机边执行命令,边写Dockerfile应用级镜像一定要有一个进程是前台执行,进程存在不至于程序启动就退出CMD:容器启动命令第一步:按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多......
  • 系统架构设计师笔记第10期:访问控制和数字签名
    访问控制技术访问控制是计算机系统中一种重要的安全机制,用于管理和控制用户对系统资源的访问权限。它的主要目标是确保只有经过授权的用户或实体能够访问资源,从而保护系统的安全性和保密性。访问控制技术的原理和主要技术如下:原理: 访问控制的原理基于授权和认证机制。授权指的是系......
  • [NOIP2001 提高组] 数的划分(剪枝)
    题目描述将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,51,5,15,1,1问有多少种不同的分法。输入格式nk (6<≤2006<n≤200,2≤≤62≤k≤6)输出格式1 个整数,即不同的分法。输入输出样例输入#1复......
  • django 中存储手机号的字段, 使用 Django 库 pip install django-phonenumber-field[ph
    原文参见:https://www.delftstack.com/zh/howto/django/django-phone-number-field/使用第三方Django应用程序的 PhoneNumberField 存储电话号码要存储电话号码,我们可以使用实现此字段的第三方Django应用程序或库:PhoneNumberField。你可以在此处找到此库或应用程序的Git......
  • nginx-clojure 源码构建一些问题
    因为nginx-clojure就是一个标准的nginx模块,一些是尝试基于源码进行构建发现一些问题的说明简单说明nginx当前1.25版本的构建是有问题的,1.24版本构建是可以的,1.23版本实际上官方已经提供了但是如果查看nginx官方文档会发现1.23版本的下载官方是似乎移除了,没直接提......
  • nginx-clojure 0.6.0 的一些新特性
    昨天制作了0.6.0的docker镜像,并说明了一些问题,以下简单说明下一些新特性新特性所有的handler可以在http以及servercontext使用了,可以方便进行组合使用nginx1.23.x支持jdk19支持,支持协程了官方提供的二进制构建基于1.23.3说明昨天也说明了,官方提供的二进制包缺......