Files
wish-pool/IP-WHITELIST-README.md
aken1023 2282eed9a1 增加ip 的白名單
總共7個IP地址,分佈在4個地點:
岡山:1個IP
汐止:2個IP
新竹:2個IP
璟茂:2個IP
2025-08-01 12:59:44 +08:00

3.8 KiB
Raw Blame History

IP 白名單功能說明

功能概述

本系統已實現完整的 IP 白名單功能,可以根據客戶端的 IP 地址來控制訪問權限。

功能特點

1. IP 顯示

  • 在頁面右上角顯示當前用戶的 IP 地址
  • 支援桌面版和手機版的不同顯示方式
  • 顯示 IP 白名單狀態(允許/拒絕)

2. IP 白名單檢查

  • 支援多種 IP 格式:
    • 單一 IP192.168.1.100
    • IP 範圍:192.168.1.0/24 (CIDR 格式)
    • 多個 IP用逗號分隔192.168.1.100, 10.0.0.50
  • 實時檢查每個請求的 IP 地址
  • 不在白名單內的 IP 會被拒絕訪問並顯示 403 錯誤頁面

3. 管理介面

  • 提供 /admin/ip-whitelist 管理頁面
  • 可以動態配置 IP 白名單
  • 顯示當前 IP 狀態和訪問權限

配置方法

1. 環境變數配置

.env.local 檔案中添加以下配置:

# 允許訪問的IP地址或IP範圍用逗號分隔
ALLOWED_IPS=127.0.0.1,::1,192.168.1.0/24,10.0.0.0/8

# 是否啟用IP白名單檢查
# true: 啟用IP檢查不在白名單內的IP將被拒絕
# false: 禁用IP檢查允許所有IP訪問
ENABLE_IP_WHITELIST=true

2. IP 格式說明

單一 IP

192.168.1.100

IP 範圍 (CIDR 格式)

192.168.1.0/24    # 允許 192.168.1.0 - 192.168.1.255
10.0.0.0/8        # 允許 10.0.0.0 - 10.255.255.255
172.16.0.0/12     # 允許 172.16.0.0 - 172.31.255.255

多個 IP 或範圍

192.168.1.100,10.0.0.50,172.16.0.0/16

使用步驟

1. 啟用 IP 白名單

  1. 設置 ENABLE_IP_WHITELIST=true
  2. ALLOWED_IPS 中配置允許的 IP 地址
  3. 重新啟動應用程式

2. 測試功能

  1. 訪問主頁面,查看右上角的 IP 顯示
  2. 使用不在白名單內的 IP 訪問,應該會看到 403 錯誤頁面
  3. 訪問 /admin/ip-whitelist 查看管理介面

3. 管理 IP 白名單

  1. 訪問 /admin/ip-whitelist 頁面
  2. 查看當前 IP 狀態
  3. 修改白名單設置
  4. 保存設置

技術實現

1. 中間件 (middleware.ts)

  • 攔截所有請求
  • 檢查客戶端 IP 是否在白名單內
  • 拒絕不在白名單內的訪問

2. IP 工具函數 (lib/ip-utils.ts)

  • isIpAllowed(): 檢查 IP 是否被允許
  • getClientIp(): 獲取客戶端真實 IP
  • isIpInRange(): 檢查 IP 是否在指定範圍內

3. API 路由 (app/api/ip/route.ts)

  • 提供 IP 信息查詢接口
  • 返回當前 IP 和白名單狀態

4. IP 顯示組件 (components/ip-display.tsx)

  • 顯示當前 IP 地址
  • 顯示白名單狀態
  • 支援響應式設計

安全注意事項

  1. IP 偽造防護:系統會檢查多個 IP 來源頭,包括:

    • x-forwarded-for
    • x-real-ip
    • x-client-ip
    • cf-connecting-ip (Cloudflare)
  2. 本地開發:開發環境中,127.0.0.1::1 通常會被自動允許

  3. 代理環境:如果使用反向代理,請確保正確配置 IP 轉發

故障排除

1. IP 顯示不正確

  • 檢查是否在代理環境中
  • 確認 getClientIp() 函數的 IP 來源配置

2. 白名單不生效

  • 確認 ENABLE_IP_WHITELIST=true
  • 檢查 ALLOWED_IPS 格式是否正確
  • 重新啟動應用程式

3. 403 錯誤頁面

  • 檢查當前 IP 是否在白名單內
  • 查看瀏覽器開發者工具中的網路請求
  • 檢查伺服器日誌

開發建議

  1. 測試環境:建議在測試環境中先配置 ENABLE_IP_WHITELIST=false
  2. IP 範圍:使用 CIDR 格式可以更靈活地管理 IP 範圍
  3. 日誌記錄:系統會記錄被拒絕的訪問,便於排查問題
  4. 備份配置:建議備份 IP 白名單配置,避免誤操作

相關檔案

  • env.template - 環境變數模板
  • middleware.ts - Next.js 中間件
  • lib/ip-utils.ts - IP 工具函數
  • app/api/ip/route.ts - IP 信息 API
  • components/ip-display.tsx - IP 顯示組件
  • app/admin/ip-whitelist/page.tsx - 管理頁面