[toc]
nginx访问控制
访问控制类别
基于IP的访问控制
http_access_module
基于用户登陆认证的访问控制
http_auth_basic_module
1.1 基于IP的访问控制
语法:
- allow|deny address
1.1.1 访问控制配置示例1, 拒绝指定的IP,其他全部允许
location /nginx_status {
stub_status;
access_log off;
deny 10.0.0.51;
allow all;
}
10.0.0.51访问,权限拒绝
$ curl www.abc.com/nginx_status
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
10.0.0.52访问,可以访问
$ curl www.abc.com/nginx_status
Active connections: 1
server accepts handled requests
26 26 31
Reading: 0 Writing: 1 Waiting: 0
1.1.2 访问控制配置示例2,只允许谁能访问,其它全部拒绝
location / {
root /website;
index index.php index.html index.htm;
allow 192.168.9.0/24;
allow 10.0.0.51;
deny all;
}
10.0.0.51访问,可以访问
$ curl www.abc.com
www.abc.com 的网站根目录
10.0.0.52访问,权限拒绝
$ curl www.abc.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
http_access_module
局限性
当客户端通过代理服务器访问真实的后端服务器时,通过remote_addr
能获取到代理服务器的IP地址,但是无法获取客户端的IP地址
在nginx主配置文件/etc/nginx/nginx.conf
中访问日志格式有如下定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
nginx访问日志/var/log/nginx/access.log
中如下,可以看到使用$remote_addr
可以获取直接访问后端真实web的代理服务器的IP,但是最后边的"-"
表明无法获取真实客户端的IP
10.0.0.51 - - [16/Jun/2020:00:27:30 +0800] "GET / HTTP/1.0" 200 10 "-" "curl/7.29.0" "-"
现在在代理服务器和后端真实web中的nginx头文件proxy_params
中加上参数X-Forwarded-For
以获取客户端真实IP,然后模拟访问过程如下
客户端10.0.0.10-->通过代理服务器10.0.0.51-->访问后端真实web 10.0.0.52
代理服务器10.0.0.51 nginx配置
#编辑nginx反向代理配置文件
cat > /etc/nginx/conf.d/www.abc.com.conf <<EOF
server {
listen 80;
server_name www.abc.com;
index index.html index.htm;
location / {
proxy_pass http://10.0.0.52;
include proxy_params;
}
}
EOF
#编辑nginx头文件,加上参数X-Forwarded-For
cat > /etc/nginx/proxy_params <<'EOF'
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
EOF
后端真实web 10.0.0.52操作
#编辑nginx配置文件
cat > /etc/nginx/conf.d/www.abc.com.conf <<EOF
server {
listen 80;
server_name www.abc.com;
location / {
root /website;
index index.html index.htm;
include proxy_params;
}
}
EOF
#编辑nginx头文件,加上参数X-Forwarded-For
cat > /etc/nginx/proxy_params <<'EOF'
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
EOF
#创建网站根目录
mkdir /website && echo '10.0.0.52' >/website/index.html
加上X-Forwarded-For
参数后,nginx的访问日志中就可以获取到客户端的真实IP地址了
10.0.0.51 - - [16/Jun/2020:10:35:12 +0800] "GET / HTTP/1.0" 200 10 "-" "curl/7.29.0" "10.0.0.10"