#!/bin/bash # FRP 容器名称 CONTAINER_NAME="frps" # ipinfo.io 的 API 令牌 IPINFO_TOKEN="你的令牌。每个月能免费使用50K额度,基本够了" # 目标地区 TARGET_REGION="Sichuan" # 缓存文件路径 CACHE_FILE="/opt/banIP/ip_region_cache.txt" # 函数:检查 IP 是否为特殊或保留地址 is_special_ip() { local ip=$1 if [[ $ip =~ ^(0\.|127\.|10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|169\.254\.|::1|fc00::|fe80::) ]]; then return 0 else return 1 fi } # 函数:从缓存获取 IP 地区 get_region_from_cache() { local ip=$1 grep "^$ip," $CACHE_FILE | cut -d ',' -f2 } # 函数:将 IP 地区保存到缓存 save_region_to_cache() { local ip=$1 local region=$2 echo "$ip,$region" >> $CACHE_FILE }
docker logs "$CONTAINER_NAME" 2>&1 | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u | while read -r ip; do if is_special_ip "$ip"; then echo "Skipping special or reserved IP: $ip" continue fi
# 尝试从缓存获取地区 region=$(get_region_from_cache "$ip") if [ -z "$region" ]; then # 缓存中没有找到,使用API查询 region=$(curl -s "https://ipinfo.io/${ip}/region?token=$IPINFO_TOKEN") save_region_to_cache "$ip" "$region" fi
echo "IP: $ip, Region: $region"
if [[ "$region" != *"$TARGET_REGION"* ]]; then echo "Blocking IP: $ip, as it is not in $TARGET_REGION" # 使用 ufw 屏蔽该 IP ufw deny from "$ip" to any fi done
步骤 1: 创建脚本文件
首先,首先创建一个 /opt/banIP 目录。
1
mkdir -p /opt/banIP
然后,创建脚本文件:
1
nano /opt/banIP/block_non_sichuan_ips.sh
将之前提供的脚本内容粘贴进去,确保替换了 为你的实际 ipinfo.io API 令牌。保存并退出编辑器。