nginx动态配置白名单

post by rocdk890 / 2020-10-14 16:15 Wednesday linux技术
      为什么写这篇文章呢,因为我之前一直使用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

好了,这样以后有同一个服务器的其他网站要加限制只需要执行第二步就可以了.
夜空- 本站版权
1、本站所有主题由该文章作者发表,该文章作者与夜空享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和夜空的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:blog.slogra.com/post-774.html

标签: nginx centos 配置 crontab 定时 白名单 ddns 动态域名

评论: