nginx通过x_forwarded_for实现黑白名单访问策略

nginx通过防护墙、F5设备过来之后,remote_addr 的地址是防护墙、F5的地址, 客户端真是的IP地址是在 x_forwarded_for中的, 这样这样 nginx 默认的 deny 和 allow 就不能用了。

我们需要在每个域名中判断一个 x_forwarded_for 钟是否有我们要拒绝的IP地址,如果有就返回403,不在往后代理。

我们定义一个map 拒绝的IP地址列表。

cat x_forwarded_for_deny.conf

1
2
3
4
5
6
map $http_x_forwarded_for $allowed {
default allow;
#~\s*192.168.0.100$ deny; # 拒绝一个IP地址
#~\s*192.168.0.\d+$ deny; # 拒绝一个网段IP地址
include x_forwarded_for_deny_list/*.conf;
}

include x_forwarded_for_deny_list/*.conf
这个目录下禁止IP地址的文件
如:

cat x_forwarded_for_deny_list/2019-07-08.conf

1
2
~\s*192.168.0.100$ deny;
~\s*8.8.8.8$ deny;

nginx 配置文件需要 include x_forwarded_for_deny.conf

vim nginx.conf 添加

1
2
3
.......
include x_forwarded_for_deny.conf;
.......

每个域名的location中需要添加判断
如:

1
2
3
4
5
6
7
8
server {
listen 80;
server_name ....;
location / {
if ( $allowed = "deny" ) { return 403; }
proxy_pass .....;
}
}

这样就可以拒绝你设置好的IP地址访问, nginx access日志用会有拒绝的IP得知日志,放回状态是403

感谢您的支持!