nginx动态配置白名单
为什么写这篇文章呢,因为我之前一直使用allow ip; deny all;这样的方式来限制,而且公司对外ip是动态的,造成我写的脚本每天都要去获取一次外网ip,然后对nginx配置进行批量替换,这样的效率太低了,而且nginx配置文件有很多时,要等上一会才会完成,如果中途有什么操作的话就会出现问题,故今天改成了下面这样的方式.
系统:centos 7.x(64位)
1.先修改nginx主配置文件(nginx.conf)
vim /etc/nginx/nginx.conf
user nginx nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
use epoll;
accept_mutex off;
worker_connections 65535;
multi_accept on;
}
http {
geo $remote_addr $ip_whitelist {
default 0;
include ip_white.conf;
}
include mime.types;
default_type application/octet-stream;
....
省略一些内容,不然配置太多大家都看不完.
server {
listen 80 default;
server_name _;
return 500;
}
include /etc/nginx/conf.d/*.conf;
}
2.修改需要ip限制的配置文件
vim /etc/nginx/conf.d/xxx.conf
server {
listen 80;
server_name xxxx;
access_log /var/log/nginx/xxxx.access.log main;
error_log /var/log/nginx/xxxx.error.log;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
location / {
if ($ip_whitelist = 1) {
proxy_pass http://127.0.0.1:3000;
break;
}
return 403;
}
location ~ /\. {
deny all;
}
}
3.创建白名单配置文件
touch /etc/nginx/ip_white.conf.default
touch /etc/nginx/ip_white.conf
vim /etc/nginx/ip_white.conf.default
127.0.0.1
192.168.10.0/24
ps:加入本机ip和服务器内网ip.
4.创建获取动态域名ip脚本
vim /root/soft_shell/getip.sh
#!/bin/sh # Author rocdk890 ADDR3="w3.xxx.cn" ADDR2="w2.xxx.cn" ADDR1="w1.xxx.cn" TMPSTR1=`ping ${ADDR1} -s 1 -c 1 | grep ${ADDR1} | cut -d'(' -f 2 | cut -d')' -f1|head -n1` TMPSTR2=`ping ${ADDR2} -s 1 -c 1 | grep ${ADDR2} | cut -d'(' -f 2 | cut -d')' -f1|head -n1` TMPSTR3=`ping ${ADDR3} -s 1 -c 1 | grep ${ADDR3} | cut -d'(' -f 2 | cut -d')' -f1|head -n1` default_file=/etc/nginx/ip_white.conf.default new_file=/etc/nginx/ip_white.conf \cp $default_file $new_file echo $TMPSTR1 >> $new_file echo $TMPSTR2 >> $new_file echo $TMPSTR3 >> $new_file sed -i 's/$/ 1;/' $new_file sleep 3; /usr/bin/systemctl reload nginx
ps:
公司有动态ip,我做了ddns,每一个域名代表了公司一个外网ip地址,这样有些网站只让公司才能访问,其他人只会看到403的错误信息.
5.最后把getip.sh脚本加入到定时任务里
(crontab -l;echo '0 */4 * * * /bin/bash /root/soft_shell/getip.sh > /dev/null 2>&1 &') | crontab
好了,这样以后有同一个服务器的其他网站要加限制只需要执行第二步就可以了.
评论: