如何结合set_real_ip_from使用allow / deny?


4

我的nginx后端服务器应该只接受来自我的前端1.2.3.4的请求。但是,我也希望nginx能够记录正确的IP地址,所以我使用了set_real_ip_from。但通过执行此操作,allow配置中的规则不匹配,并且nginx将始终返回403.这是相关配置:

allow  1.2.3.4;
deny  all;

set_real_ip_from  1.2.3.4;
real_ip_heaader  X-Real-IP;

我怎样才能克服这个问题?


为什么不只是不使用set_real_ip和日志X-Real-IP标题?
阿列克谢2015年

因为这些是在通过代理(例如Amazon ELB)访问您的应用程序时使用的,因此所有流量都来自单个IP地址; 如果你不使用那些你不能过滤。
El Yobo 2015年

Answers:


2

我自己正在寻找这个,因为我花了一些时间来寻找解决方案,我会把它放在这里为其他人轻松一点。

allow / deny构造在这种情况下不起作用,因为它们不适用于真正的ip变量。

相反,您可以使用$ http_x_forwarded_for变量:

## this goes before server section
## it allows us to check if forwarded ip is allowed to make request or not
map $http_x_real_ip $allowed {
    default false;

    ## your ip goes here
    ~\s111.111.111.111 true;
    ## other ips you want to allow
}

server {
    ## ... other instructions...

    set_real_ip_from  1.2.3.4;
    real_ip_header  X-Forwarded-For;

    ## you may want to add this to get "truly" real ip
    real_ip_recursive  on;

    ## ... other instructions...

    ## or any other location you need
    location / {
        if ($allowed = false) {
            return 403;
        }
        ## ... other instructions...
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.