Nginx IP授权页面实现步骤

目标:

一、创建白名单文件

bash 复制代码
sudo mkdir -p /usr/local/nginx/conf/whitelist
sudo touch /usr/local/nginx/conf/whitelist/temporary.conf

二、创建Python认证服务

文件路径:/opt/script/auth_server.py

python 复制代码
import os
import time
from flask import Flask, request, abort
import sys

app = Flask(__name__)

# 配置参数
USERS = [
    {"username": "admin1", "password": "111111"},
    {"username": "admin2", "password": "222222"}
]
TEMP_CONF = "/usr/local/nginx/conf/whitelist/temporary.conf"
IP_LOG = "/usr/local/nginx/conf/whitelist/ip_time.log"  # 存储IP和添加时间

def update_whitelist():
    """更新临时白名单文件"""
    current_time = time.time()
    valid_ips = []
    
    # 读取所有IP并过滤过期项
    if os.path.exists(IP_LOG):
        with open(IP_LOG, "r") as f:
            for line in f.readlines():
                parts = line.strip().split()
                if len(parts) == 2:
                    ip, timestamp = parts
                    if current_time - float(timestamp) < 7200:  # 2小时=7200秒
                        valid_ips.append(ip)
    
    # 生成新的白名单配置
    with open(TEMP_CONF, "w") as f:
        for ip in set(valid_ips):  # 去重
            f.write(f"allow {ip};\n")
    
    # 重载Nginx
    os.system("sudo /usr/local/nginx/sbin/nginx -s reload")

@app.route('/auth', methods=['POST'])
def auth():
    # 获取客户端提交的凭证
    submitted_user = request.form.get('user')
    submitted_pass = request.form.get('pass')

    # 验证用户名密码 - 支持多个账号
    authenticated = False
    for user in USERS:
        if submitted_user == user["username"] and submitted_pass == user["password"]:
            authenticated = True
            break

    if not authenticated:
        abort(401)
    
    # 获取真实客户端IP
    client_ip = request.headers.get('X-Real-IP', request.remote_addr)
    
    # 记录IP和当前时间戳
    with open(IP_LOG, "a") as f:
        f.write(f"{client_ip} {time.time()}\n")
    
    # 更新白名单文件
    update_whitelist()
    
    return "认证成功!您的IP已加入白名单,有效期2小时。", 200

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == "update":
        update_whitelist()
    else:
        app.run(host='127.0.0.1', port=5000)

三、创建登录页面

文件路径:/usr/local/nginx/html/auth.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>访问授权</title>
</head>
<body>
    <h2>请输入管理员凭据</h2>
    <form action="/auth" method="POST">
        <label>用户名: <input type="text" name="user"></label><br>
        <label>密码: <input type="password" name="pass"></label><br>
        <button type="submit">授权我的IP</button>
    </form>
</body>
</html>

四、配置Nginx

在**nginx.conf** 的http块内添加:

javascript 复制代码
server {
    listen 80;
    server_name your_domain.com;  # 改为你的域名或IP

    # 授权页面
    location = /auth.html {
        alias /usr/local/nginx/html/auth.html;
    }

    # Python认证服务代理
    location = /auth {
        proxy_pass http://127.0.0.1:5000/auth;
        proxy_set_header X-Real-IP $remote_addr;  # 传递真实IP
    }

    # 需要保护的资源
    location /protected {
        if ($whitelist = 0) {
            return 302 /auth.html;  # 重定向到登录页
        }
        
        # 这里放被保护的内容(例如反向代理)
        # proxy_pass http://your_backend;
    }
}

五、设置定时清理任务

创建清理脚本:/usr/local/nginx/scripts/clean_whitelist.py

python 复制代码
#!/usr/bin/env python3
import os
import time
import sys

IP_LOG = "/usr/local/nginx/conf/whitelist/ip_time.log"

def main():
    # 读取并过滤过期IP
    valid_entries = []
    current_time = time.time()
    
    if not os.path.exists(IP_LOG):
        return
    
    with open(IP_LOG, "r") as f:
        for line in f:
            parts = line.strip().split()
            if len(parts) == 2:
                ip, timestamp = parts
                if current_time - float(timestamp) < 7200:  # 保留未过期IP
                    valid_entries.append(line)
    
    # 更新日志文件
    with open(IP_LOG, "w") as f:
        f.writelines(valid_entries)
    
    # 调用认证服务更新白名单
    os.system("sudo /usr/bin/python3 /usr/local/nginx/scripts/auth_server.py update")

if __name__ == '__main__':
    main()

添加cron任务

bash 复制代码
# 添加cron任务
sudo crontab -e
# 每10分钟检查一次
*/10 * * * * /usr/bin/python3 /opt/script/clean_whitelist.py

六、启动服务

启动Python认证服务:

bash 复制代码
sudo pip3 install flask
sudo -b nohup python3 auth_server.py > /var/log/auth_server.log 2>&1

重载Nginx配置:

bash 复制代码
sudo /usr/local/nginx/sbin/nginx -s reload

七、验证功能

  1. 访问 http://your_domain.com/protected

  2. 将被重定向到登录页

  3. 输入用户名 admin1 和密码 111111

  4. 成功后:

    • 你的IP会被添加到 temporary.conf

    • 可访问 /protected 资源

    • 2小时后IP自动删除

注意

bash 复制代码
# 确保所有脚本有执行权限
chmod +x /opt/script/*.py

相关推荐
Dorcas_FE13 分钟前
【tips】动态el-form-item中校验的注意点
前端·javascript·vue.js
小小前端要继续努力17 分钟前
前端新人怎么更快的融入工作
前端
四岁爱上了她23 分钟前
input输入框焦点的获取和隐藏div,一个自定义的下拉选择
前端·javascript·vue.js
互联网老欣42 分钟前
2025年保姆级教程:阿里云服务器部署Dify+Ollama,打造专属AI应用平台
服务器·阿里云·ai·云计算·dify·ollama·deepseek
fouryears_2341744 分钟前
现代 Android 后台应用读取剪贴板最佳实践
android·前端·flutter·dart
boolean的主人1 小时前
mac电脑安装nvm
前端
用户1972959188911 小时前
WKWebView的重定向(objective_c)
前端·ios
烟袅1 小时前
5 分钟把 Coze 智能体嵌入网页:原生 JS + Vite 极简方案
前端·javascript·llm
18你磊哥1 小时前
Django WEB 简单项目创建与结构讲解
前端·python·django·sqlite
KangJX1 小时前
iOS 语音房(拍卖房)开发实践
前端·前端框架·客户端