ufw配置

IP地址范围(可以不用看)

https://ipinfo.io/ips

基本语法

1
ufw [选项] allow/deny [协议] [端口] [from 源IP] [comment "备注"]
参数 说明 示例
from IP 指定来源 IP from 1.2.3.4
from IP/MASK 指定来源网段 from 10.0.0.0/24
to any 目标为所有本机地址 to any
port 指定端口 port 7890
proto tcp/udp 指定协议 proto tcp
comment "备注" 添加备注 comment "SOCKS5-用户A"
1
2
ufw allow from 1.2.3.4 to any port 7890 proto tcp comment "SOCKS5-用户A"
ufw allow from 1.2.3.4 to any port 7890 proto udp comment "SOCKS5-用户A"
1
2
3
4
# 不指定协议,自动同时支持 TCP + UDP
ufw allow from 1.2.3.4 to any port 7890 comment "SOCKS5-用户A"
ufw allow from 5.6.7.8 to any port 7890 comment "SOCKS5-用户B"
ufw allow from 10.20.30.0/24 to any port 7890 comment "SOCKS5-用户C子网"

文档正在补全中

UFW配置

查看完整配置

1
sudo ufw status verbose

deny (incoming)本机入站流量默认拒绝(外网主动连你服务器,默认拦)

allow (outgoing)本机出站流量默认放行(服务器主动访问外网不拦截)

deny (routed)转发流量默认拒绝

开启日志

1
2
3
# 推荐 medium,平衡日志量与信息完整度
sudo ufw logging medium
# 可选:low(少日志) / medium(均衡) / high(完整包信息,日志爆炸) / full(全部数据包)/ off(关闭日志,不记录任何流量)

添加规则

添加IP黑名单

添加黑名单IP,如下命令会智能区分IPv4/IPv6规则类型,将IP黑名单规则置于防火墙规则列表的最前端,添加黑名单必须使用这个命令,不然很可能无法处理你要拉黑的IP地址。

网段类型 置顶命令 作用范围 能否被 ufw status numbered 抓取删除
IPv4 ufw insert 1 IPv4 user.rules ✅ 能被 grep 匹配、正常删除
IPv6 ufw prepend IPv6 user6.rules ✅ 能被 grep ':' 过滤抓取删除

置顶IP,IPV4请使用如下命令;

1
sudo ufw insert 1 deny from IPV4 comment "这里是备注"

IPV6需要使用ufw status查看IPV6地址最顶部在那个编号,然后再把顶部编号替换掉下面命令中 insert n 中的 n

1
sudo ufw insert n(替换成IPV6最顶部的编号) deny from IPV6 comment "这里是备注"

或者使用

1
sudo ufw prepend deny from IPV6 comment "这里是备注"

删除规则

删除一条规则

不用每次输入Y

1
echo y | ufw delete 1

原理:echo y 输出字符 y,管道传给 ufw 交互式确认输入,自动选 y。

1
yes | ufw delete 1

yes 会持续输出 y,适配所有需要交互式确认的命令。

删除有关键字注释的规则

创建一个文件,后缀.sh的脚本,携带–dry-run –debug 仅预览,不实际修改防火墙,确认是否正确后去掉–dry-run参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/bash
# ============================================================
# 静态黑名单删除脚本(增强版,兼容 IPv4/IPv6)
# 功能:删除注释包含指定关键词的规则
# 选项:--dry-run 仅预览
# --debug 显示详细匹配过程
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_PATTERNS=(
"扫描"
"拦截"
)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
esac
done

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则删除后可能不会生效"
fi

# ---------- 构建 grep 模式 ----------
GREP_PATTERN=$(printf "|%s" "${COMMENT_PATTERNS[@]}")
GREP_PATTERN=${GREP_PATTERN:1}

# ---------- 获取匹配规则 ----------
get_rule_info() {
# 先获取所有带注释的行(调试用)
local raw_lines
raw_lines=$(ufw status numbered 2>/dev/null | grep -E "$GREP_PATTERN" || true)

if $DEBUG; then
echo "DEBUG: 原始匹配行数: $(echo "$raw_lines" | wc -l)"
echo "DEBUG: 匹配内容:"
echo "$raw_lines" | head -5
fi

echo "$raw_lines" | while IFS= read -r line; do
# 提取编号(兼容空格)
num=$(echo "$line" | awk -F'[][]' '{print $2}' | tr -d ' ')
# 提取 IP/CIDR(第7个字段,因为格式为 [n] Anywhere (v6) DENY IN IP ...)
ip=$(echo "$line" | awk '{print $7}')
# 如果 IP 以 '#' 开头,说明提取失败,尝试其他位置
if [[ "$ip" == "#"* ]]; then
ip=$(echo "$line" | awk '{print $6}')
fi
# 去掉可能的 '#' 后缀
ip=$(echo "$ip" | sed 's/#.*//')
if [[ -n "$num" && -n "$ip" ]]; then
echo "$num|$ip|$line"
fi
done | sort -t'|' -k1 -nr
}

# ---------- 执行 ----------
echo "==================== 删除匹配规则的静态黑名单 ===================="

RULE_INFO=$(get_rule_info)

if [[ -n "$RULE_INFO" ]]; then
echo "发现以下待删除的规则(按编号降序):"
echo "$RULE_INFO" | while IFS='|' read -r num ip line; do
# 判断 IP 类型
if [[ "$ip" =~ : ]]; then
type="IPv6"
else
type="IPv4"
fi
comment=$(echo "$line" | sed -n 's/.*# //p')
echo " 编号 $num : $ip ($type) 注释: $comment"
done

if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
BACKUP_FILE="/tmp/ufw_status_backup_$(date +%s).txt"
ufw status numbered > "$BACKUP_FILE"
echo "已备份当前 UFW 状态到 $BACKUP_FILE"

echo "$RULE_INFO" | cut -d'|' -f1 | while read -r num; do
echo " 删除规则编号 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,可能已不存在或编号变动"
fi
done
echo "规则删除完成。"
fi
else
echo "未找到任何匹配给定注释模式的规则。"
if ! $DRY_RUN; then
echo "如果确认规则存在,请使用 --debug 运行查看详细信息。"
fi
fi

# ---------- 重载 ----------
echo -e "\n==================== 重载防火墙 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "所有匹配的静态规则(IPv4 和 IPv6)已删除。"
fi

禁止Censys 扫描服务器

censys官网 一直扫描服务器数据,会记录很多服务器数据

屏蔽IP数据: 屏蔽IP数据

IPv4 (直接复制可用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo ufw insert 1 deny from 66.132.172.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.224.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.186.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.195.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.159.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.148.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 66.132.153.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.142.125.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 167.94.138.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 167.94.145.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 167.94.146.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 167.248.133.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 199.45.154.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 199.45.155.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 206.168.34.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 206.168.35.0/24 comment "Censys扫描段,全部拦截 封禁254台公网设备访问服务器"

IPv6 (直接复制可用)

1
2
3
4
sudo ufw prepend deny from 2602:80d:1000:b0cc:e::/80 comment "Censys扫描段,全部拦截 封禁访问服务器" && \
sudo ufw prepend deny from 2620:96:e000:b0cc:e::/80 comment "Censys扫描段,全部拦截 封禁访问服务器" && \
sudo ufw prepend deny from 2602:80d:1003::/112 comment "Censys扫描段,全部拦截 封禁访问服务器" && \
sudo ufw prepend deny from 2602:80d:1004::/112 comment "Censys扫描段,全部拦截 封禁访问服务器"

IPV4和IPV6脚本

创建一个文件 static_censys.sh 脚本,保存以下内容 格式切换成UTF-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!/bin/bash
# ============================================================
# Xpanse 静态黑名单管理脚本(合并 IPv4 + IPv6)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --debug 显示详细调试信息
# --ipv4 仅处理 IPv4(默认如未指定任何类型则全处理)
# --ipv6 仅处理 IPv6
# 示例:
# ./static_censys.sh --dry-run --debug 预览全部
# ./static_censys.sh --ipv4 --debug 仅更新 IPv4(调试)
# ./static_censys.sh --ipv6 仅更新 IPv6
# ./static_censys.sh --ipv4 --ipv6 同时更新两者
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_IPV4="Censys扫描段,全部拦截 封禁254台公网设备访问服务器"
COMMENT_IPV6="Censys扫描段,全部拦截 封禁访问服务器"

# IPv4 静态 CIDR 列表
STATIC_CIDR_IPV4=(
"66.132.159.0/24"
"66.132.148.0/24"
"66.132.153.0/24"
"66.132.224.0/24"
"66.132.186.0/24"
"66.132.195.0/24"
"66.132.172.0/24"
"162.142.125.0/24"
"167.94.138.0/24"
"167.94.145.0/24"
"167.94.146.0/24"
"167.248.133.0/24"
"199.45.154.0/24"
"199.45.155.0/24"
"206.168.34.0/24"
"206.168.35.0/24"
)

# IPv6 静态 CIDR 列表
STATIC_CIDR_IPV6=(
"2602:80d:1000:b0cc:e::/80"
"2620:96:e000:b0cc:e::/80"
"2602:80d:1003::/112"
"2602:80d:1004::/112"
)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
DO_IPV4=false
DO_IPV6=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定 --ipv4 或 --ipv6,则两者都处理
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
DO_IPV6=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号(使用临时文件,防管道阻塞) ----------
get_rule_numbers() {
local comment="$1"
local tmpfile
tmpfile=$(mktemp)
if $DEBUG; then
>&2 echo "DEBUG: 正在执行 ufw status numbered(超时 10 秒)..."
fi
timeout 10 ufw status numbered > "$tmpfile" 2>/dev/null || true
if [[ ! -s "$tmpfile" ]]; then
if $DEBUG; then
>&2 echo "DEBUG: ufw status numbered 无输出或超时,跳过旧规则查找"
fi
rm -f "$tmpfile"
return
fi
# 提取编号,管道末尾添加 || true 防止无匹配时因 pipefail 退出
grep -F "$comment" "$tmpfile" \
| awk -F'[][]' '{print $2}' \
| tr -d ' ' \
| grep -E '^[0-9]+$' \
| sort -nr || true
rm -f "$tmpfile"
}

# ---------- 函数:清理指定注释的规则 ----------
clean_old_rules() {
local comment="$1"
local type_name="$2"
echo "--- 清理 ${type_name} 旧规则 ---"
local old_rules
old_rules=$(get_rule_numbers "$comment")
if [[ -n "$old_rules" ]]; then
echo "发现旧规则编号:"
echo "$old_rules" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
for num in $old_rules; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "${type_name} 旧规则清理完成。"
fi
else
echo "未找到 ${type_name} 旧规则。"
fi
}

# ---------- 函数:检查 CIDR 是否已存在 ----------
cidr_exists() {
local cidr="$1"
ufw status | grep -q -F "$cidr"
}

# ---------- 函数:添加 CIDR 列表(IPv4 用 insert 1,IPv6 用 prepend) ----------
add_cidrs() {
local -n cidr_array="$1"
local comment="$2"
local type_name="$3" # "IPv4" 或 "IPv6"
echo "--- 添加 ${type_name} 新规则(${#cidr_array[@]} 条)---"
if $DRY_RUN; then
echo "将要添加以下 CIDR:"
for cidr in "${cidr_array[@]}"; do
echo " deny from $cidr"
done
else
# 倒序插入,保持数组顺序(先添加的排在前面)
for ((i=${#cidr_array[@]}-1; i>=0; i--)); do
local cidr="${cidr_array[i]}"
if cidr_exists "$cidr"; then
echo " $cidr 已存在,跳过"
continue
fi
# 根据类型选择命令
local cmd
if [[ "$type_name" == "IPv6" ]]; then
cmd="ufw prepend deny from $cidr comment '$comment'"
else
cmd="ufw insert 1 deny from $cidr comment '$comment'"
fi
if $DEBUG; then
echo " 执行: $cmd"
fi
if eval "$cmd" 2>/dev/null; then
echo " ✅ 添加 $cidr 成功"
else
echo " ❌ 添加 $cidr 失败(未知错误)"
fi
done
echo "${type_name} 新规则添加完成。"
fi
}

# ---------- 执行清理和添加 ----------
echo "==================== 开始处理 Internet Measurement 静态规则 ===================="

# 清理旧规则(根据类型)
if $DO_IPV4; then
clean_old_rules "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
clean_old_rules "$COMMENT_IPV6" "IPv6"
fi

# 添加新规则(根据类型)
echo -e "\n==================== 添加新规则 ===================="

if $DO_IPV4; then
add_cidrs STATIC_CIDR_IPV4 "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
add_cidrs STATIC_CIDR_IPV6 "$COMMENT_IPV6" "IPv6"
fi

# ---------- 重载防火墙 ----------
echo -e "\n==================== 重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

# ---------- 完成 ----------
echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "Censys 静态黑名单已更新。"
echo "查看全部 IPv4 规则:sudo ufw status verbose | grep '$COMMENT_IPV4'"
echo "查看全部 IPv6 规则:sudo ufw status verbose | grep '$COMMENT_IPV6'"
fi
参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览全部(默认 IPv4+IPv6) sudo ./static_censys.sh --dry-run
预览 IPv4 + 调试 sudo ./static_censys.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./static_censys.sh --dry-run --ipv6 --debug
预览两者 + 调试 sudo ./static_censys.sh --dry-run --ipv4 --ipv6 --debug
正式更新全部(默认) sudo ./static_censys.sh
正式仅更新 IPv4 sudo ./static_censys.sh --ipv4
正式仅更新 IPv6 sudo ./static_censys.sh --ipv6
正式更新两者 sudo ./static_censys.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./static_censys.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./static_censys.sh --ipv6 --debug

查询 AS398722 AS398705 AS398324

查询方式一:

1
2
3
4
5
6
7
8
9
10
11
# AS398324 全部网段
echo "==== AS398324 ===="
whois -h whois.radb.net -- '-i origin AS398324' | grep -E '^(route|route6):' | awk '{print $2}' | sort -u

# AS398722 全部网段
echo -e "\n==== AS398722 ===="
whois -h whois.radb.net -- '-i origin AS398722' | grep -E '^(route|route6):' | awk '{print $2}' | sort -u

# AS398705 全部网段
echo -e "\n==== AS398705 ===="
whois -h whois.radb.net -- '-i origin AS398705' | grep -E '^(route|route6):' | awk '{print $2}' | sort -u

查询方式二:

1
2
3
4
5
whois -h whois.radb.net -- '-i origin AS398722' | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2})|([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}/[0-9]{1,3}' | sort -u

whois -h whois.radb.net -- '-i origin AS398705' | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2})|([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}/[0-9]{1,3}' | sort -u

whois -h whois.radb.net -- '-i origin AS398324' | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2})|([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}/[0-9]{1,3}' | sort -u

快速添加AS398722 AS398705 AS398324和清理

/usr/local中创建一个TimeTask目录(这个路径可以个人喜爱自定义);下面还有注意事项,请继续查看下去

ipv4+ipv6服务器配置如下:

创建一个文件update_censys.sh,放入这个文件夹中TimeTask,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/bin/bash
# ============================================================
# Censys AS 段动态屏蔽脚本(支持 IPv4/IPv6 分别控制 + debug)
# 功能:从 RADB 查询指定 ASN 的网段并置顶屏蔽
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --ipv4 处理 IPv4 网段(默认开启,若只指定 --ipv6 则自动关闭)
# --ipv6 处理 IPv6 网段
# --debug 显示详细调试信息
# 示例:
# ./update_censys.sh --dry-run --debug 预览默认(仅 IPv4)
# ./update_censys.sh --ipv6 --debug 仅更新 IPv6
# ./update_censys.sh --ipv4 --ipv6 更新 IPv4 和 IPv6
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
AS_LIST=("AS398324" "AS398705" "AS398722")
COMMENT="Censys测绘扫描AS段,静默DROP拦截,封禁访问服务器"
WHOIS_SERVER="whois.radb.net"
BACKUP_WHOIS="whois.cymru.com"

# ---------- 参数解析 ----------
DRY_RUN=false
DO_IPV4=false
DO_IPV6=false
DEBUG=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
--debug) DEBUG=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定任何 --ipv4/--ipv6,则只处理 IPv4
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"
if $DEBUG; then
echo "🔍 调试模式已开启"
fi

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:获取匹配注释的所有规则(编号|IP|整行) ----------
get_rules_info() {
local raw
raw=$(ufw status numbered 2>/dev/null | grep -F "$COMMENT" || true)
if [[ -z "$raw" ]]; then
return
fi
if $DEBUG; then
echo "DEBUG: 匹配到的旧规则原始行:" >&2
echo "$raw" | sed 's/^/ /' >&2
fi
echo "$raw" | while IFS= read -r line; do
num=$(echo "$line" | grep -oP '\[\s*\K\d+(?=\])' || true)
ip=$(echo "$line" | grep -oP 'DENY IN\s+\K[0-9a-fA-F.:/]+' || true)
if [[ -n "$num" && -n "$ip" ]]; then
echo "$num|$ip|$line"
fi
done
}

# ---------- 函数:根据类型过滤规则编号 ----------
get_filtered_numbers() {
local want_ipv4="$1"
local want_ipv6="$2"
local rules_info
rules_info=$(get_rules_info)
if [[ -z "$rules_info" ]]; then
return
fi
if $DEBUG; then
echo "DEBUG: 提取到的规则(编号|IP):" >&2
fi
echo "$rules_info" | while IFS='|' read -r num ip line; do
if $DEBUG; then
echo "DEBUG: $num -> $ip" >&2
fi
if [[ "$ip" =~ : ]]; then
type="ipv6"
else
type="ipv4"
fi
if [[ "$type" == "ipv4" && "$want_ipv4" == true ]]; then
echo "$num"
elif [[ "$type" == "ipv6" && "$want_ipv6" == true ]]; then
echo "$num"
fi
done | sort -nr
}

# ---------- 函数:查询 AS 网段(带调试输出) ----------
fetch_cidrs() {
local asn="$1"
local type="$2" # "route" for IPv4, "route6" for IPv6
local cidrs=""
local whois_output=""
if $DEBUG; then
echo "DEBUG: 查询 $asn ($type) from $WHOIS_SERVER ..." >&2
fi
whois_output=$(whois -h "$WHOIS_SERVER" -- "-i origin $asn" 2>/dev/null || true)
if $DEBUG; then
echo "DEBUG: WHOIS 原始输出(包含 $type):" >&2
echo "$whois_output" | grep -E "^($type):" | sed 's/^/ /' >&2
fi
cidrs=$(echo "$whois_output" | grep -E "^($type):" | awk '{print $2}' | sort -u || true)
if [[ -z "$cidrs" ]]; then
if $DEBUG; then
echo "DEBUG: 主源无结果,尝试备用 $BACKUP_WHOIS" >&2
fi
whois_output=$(whois -h "$BACKUP_WHOIS" -- "-i origin $asn" 2>/dev/null || true)
if $DEBUG; then
echo "DEBUG: 备用 WHOIS 输出($type):" >&2
echo "$whois_output" | grep -E "^($type):" | sed 's/^/ /' >&2
fi
cidrs=$(echo "$whois_output" | grep -E "^($type):" | awk '{print $2}' | sort -u || true)
fi
if $DEBUG; then
echo "DEBUG: 最终提取的 $type CIDR 列表:" >&2
echo "$cidrs" | sed 's/^/ /' >&2
fi
echo "$cidrs"
}

# ---------- 第一步:清理旧规则(只清理需要处理的类型) ----------
echo "==================== 第一步:清理旧 Censys 规则(仅处理指定类型) ===================="

OLD_RULES=$(get_filtered_numbers "$DO_IPV4" "$DO_IPV6")

if [[ -n "$OLD_RULES" ]]; then
echo "发现以下旧规则编号(将被删除):"
echo "$OLD_RULES" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
BACKUP_FILE="/tmp/ufw_status_backup_$(date +%s).txt"
ufw status numbered > "$BACKUP_FILE"
echo "已备份到 $BACKUP_FILE"
for num in $OLD_RULES; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "旧规则清理完成。"
fi
else
echo "未找到需要清理的旧规则(类型匹配)。"
fi

# ---------- 第二步:拉取最新 AS 网段并添加 ----------
echo -e "\n==================== 第二步:拉取并添加新规则 ===================="

declare -a ALL_CIDRS=()
if [[ "$DO_IPV4" == true ]]; then
for ASN in "${AS_LIST[@]}"; do
echo "查询 $ASN 的 IPv4 网段..."
CIDRS=$(fetch_cidrs "$ASN" "route")
if [[ -n "$CIDRS" ]]; then
while read -r cidr; do
[[ -n "$cidr" ]] && ALL_CIDRS+=("$cidr")
done <<< "$CIDRS"
else
echo "⚠️ 未获取到 $ASN 的 IPv4 网段"
fi
done
fi

if [[ "$DO_IPV6" == true ]]; then
for ASN in "${AS_LIST[@]}"; do
echo "查询 $ASN 的 IPv6 网段..."
CIDRS6=$(fetch_cidrs "$ASN" "route6")
if [[ -n "$CIDRS6" ]]; then
while read -r cidr; do
[[ -n "$cidr" ]] && ALL_CIDRS+=("$cidr")
done <<< "$CIDRS6"
else
echo "⚠️ 未获取到 $ASN 的 IPv6 网段"
fi
done
fi

if [[ ${#ALL_CIDRS[@]} -eq 0 ]]; then
echo "❌ 未获取到任何网段,退出。"
exit 1
fi

# 去重(保留首次出现的顺序)
declare -a UNIQ_CIDRS=()
declare -A SEEN
for cidr in "${ALL_CIDRS[@]}"; do
if [[ -z "${SEEN[$cidr]+x}" ]]; then
SEEN[$cidr]=1
UNIQ_CIDRS+=("$cidr")
fi
done
ALL_CIDRS=("${UNIQ_CIDRS[@]}")

echo "共获取 ${#ALL_CIDRS[@]} 个不重复网段(将按倒序插入,最终顺序与列表一致)"
if $DEBUG; then
echo "DEBUG: 完整网段列表(按 AS 查询顺序,已去重):"
for idx in "${!ALL_CIDRS[@]}"; do
echo " [$idx] ${ALL_CIDRS[idx]}"
done
fi

if $DRY_RUN; then
for cidr in "${ALL_CIDRS[@]}"; do
echo " 将添加:deny from $cidr"
done
else
# 倒序插入以保证列表顺序(先添加的排在最前)
for ((i=${#ALL_CIDRS[@]}-1; i>=0; i--)); do
cidr="${ALL_CIDRS[i]}"
# 根据 IP 类型选择命令
if [[ "$cidr" =~ : ]]; then
cmd="ufw prepend deny from $cidr comment '$COMMENT'"
else
cmd="ufw insert 1 deny from $cidr comment '$COMMENT'"
fi
echo " 添加规则:$cmd"
if $DEBUG; then
echo " -> 执行: $cmd"
fi
# 执行命令,忽略重复插入错误
if ! eval "$cmd" 2>/dev/null; then
echo " ⚠️ 添加 $cidr 失败(可能已存在),跳过"
fi
done
echo "所有新规则已添加。"
fi

# ---------- 第三步:重载防火墙 ----------
echo -e "\n==================== 第三步:重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "Censys 网段屏蔽已更新。"
echo "查看规则:sudo ufw status verbose | grep '$COMMENT'"
fi

注意:

**一定要给update_censys.sh添加可执行权限 chmod +x update_censys.sh **

如果用windowns创建上述文件,一定要修改文件格式为Unix(LF)

参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览默认(仅 IPv4) sudo ./update_censys.sh --dry-run
预览 IPv4(显式指定) sudo ./update_censys.sh --dry-run --ipv4
预览 IPv6 sudo ./update_censys.sh --dry-run --ipv6
预览 IPv4 + IPv6 sudo ./update_censys.sh --dry-run --ipv4 --ipv6
预览 IPv4 + 调试 sudo ./update_censys.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./update_censys.sh --dry-run --ipv6 --debug
预览 IPv4+IPv6 + 调试 sudo ./update_censys.sh --dry-run --ipv4 --ipv6 --debug
正式更新 IPv4(默认) sudo ./update_censys.sh
正式更新 IPv4(显式) sudo ./update_censys.sh --ipv4
正式更新 IPv6(保留 IPv4) sudo ./update_censys.sh --ipv6
正式更新 IPv4 + IPv6 sudo ./update_censys.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./update_censys.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./update_censys.sh --ipv6 --debug
正式更新 IPv4+IPv6 + 调试 sudo ./update_censys.sh --ipv4 --ipv6 --debug

创建定时任务执行快速添加AS398722 AS398705 AS398324和清理

使用crontab做定时任务

1
sudo crontab -e

添加每周执行规则(两种任选其一)

也可以不遵循下面的方法,我这里只是提供一个示例

方案 A:每周日凌晨 2 点执行(推荐,业务低峰)

1
0 2 * * 0 /usr/local/TimeTask/update_censys.sh --ipv4 --ipv6

字段说明:分 时 日 月 星期

0 2 * * 0:每周星期天 02:00

方案 B:每 7 天(固定间隔 7 天,不按星期)

1
0 2 */7 * * /usr/local/TimeTask/update_censys.sh --ipv4 --ipv6

每 7 天凌晨 2 点跑一次。

添加完成后,记得要重启一下cron

1
sudo systemctl reload-or-restart cron.service 

禁止Cortex Xpanse 扫描服务器

日志会看到Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity也有仿冒的;

Cortex Xpanse官网给出的扫描IP地址

Cortex Xpanse官网给出的扫描IP地址1

IPv4(直接复制可用)

1
2
3
4
5
6
7
8
9
sudo ufw insert 1 deny from 35.203.210.0/23   comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 144.86.173.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 147.185.132.0/23 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.216.149.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.216.150.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 172.105.147.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 198.235.24.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 205.210.31.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 216.25.88.0/21 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器"

以下IP不知道是不是,自己判断

1
2
3
4
147.185.133.243 - - [25/Jun/2026:10:22:45 +0800] "GET / HTTP/1.1" 444 0 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity" "-"
147.185.133.106 - - [25/Jun/2026:13:57:19 +0800] "GET / HTTP/1.1" 444 0 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity" "-"
220.196.160.84 - - [25/Jun/2026:14:01:28 +0800] "GET / HTTP/1.1" 444 0 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity" "-"
180.101.245.250 - - [25/Jun/2026:14:01:28 +0800] "GET / HTTP/1.1" 444 0 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity" "-"

这里会持续更新:

1
2
3
sudo ufw insert 1 deny from 147.185.133.0/24  comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 220.196.160.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 180.101.245.0/24 comment "Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器"

IPv6(直接复制可用)

1
2
3
sudo ufw prepend deny from 2604:a940:300:5b6::/64 comment "Cortex Xpanse IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a940:301:225::/64 comment "Cortex Xpanse IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a940:302:118::/64 comment "Cortex Xpanse IPv6扫描/64网段,阻断本段所有IPv6探针"

IPV4和IPV6脚本

创建一个static_cortex_xpanse.sh文件,保存以下内容 格式切换成UTF-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#!/bin/bash
# ============================================================
# Xpanse 静态黑名单管理脚本(合并 IPv4 + IPv6)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --debug 显示详细调试信息
# --ipv4 仅处理 IPv4(默认如未指定任何类型则全处理)
# --ipv6 仅处理 IPv6
# 示例:
# ./static_cortex_xpanse.sh --dry-run --debug 预览全部
# ./static_cortex_xpanse.sh --ipv4 --debug 仅更新 IPv4(调试)
# ./static_cortex_xpanse.sh --ipv6 仅更新 IPv6
# ./static_cortex_xpanse.sh --ipv4 --ipv6 同时更新两者
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_IPV4="Cortex Xpanse扫描段,全部拦截 封禁254台公网设备访问服务器"
COMMENT_IPV6="Cortex Xpanse IPv6扫描/64网段,阻断本段所有IPv6探针"

# IPv4 静态 CIDR 列表
STATIC_CIDR_IPV4=(
"35.203.210.0/23"
"35.203.210.0/24"
"35.203.211.0/24"
"144.86.173.0/24"
"147.185.132.0/23"
"147.185.132.0/24"
"147.185.133.0/24"
"162.216.149.0/24"
"162.216.150.0/24"
"172.105.147.0/24"
"198.235.24.0/24"
"205.210.31.0/24"
"216.25.88.0/21"
"147.185.133.0/24"
"220.196.160.0/24"
"180.101.245.0/24"
)

# IPv6 静态 CIDR 列表
STATIC_CIDR_IPV6=(
"2604:a940:300:5b6::/64"
"2604:a940:301:225::/64"
"2604:a940:302:118::/64"
)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
DO_IPV4=false
DO_IPV6=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定 --ipv4 或 --ipv6,则两者都处理
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
DO_IPV6=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号(使用临时文件,防管道阻塞) ----------
get_rule_numbers() {
local comment="$1"
local tmpfile
tmpfile=$(mktemp)
if $DEBUG; then
>&2 echo "DEBUG: 正在执行 ufw status numbered(超时 10 秒)..."
fi
timeout 10 ufw status numbered > "$tmpfile" 2>/dev/null || true
if [[ ! -s "$tmpfile" ]]; then
if $DEBUG; then
>&2 echo "DEBUG: ufw status numbered 无输出或超时,跳过旧规则查找"
fi
rm -f "$tmpfile"
return
fi
# 提取编号,管道末尾添加 || true 防止无匹配时因 pipefail 退出
grep -F "$comment" "$tmpfile" \
| awk -F'[][]' '{print $2}' \
| tr -d ' ' \
| grep -E '^[0-9]+$' \
| sort -nr || true
rm -f "$tmpfile"
}

# ---------- 函数:清理指定注释的规则 ----------
clean_old_rules() {
local comment="$1"
local type_name="$2"
echo "--- 清理 ${type_name} 旧规则 ---"
local old_rules
old_rules=$(get_rule_numbers "$comment")
if [[ -n "$old_rules" ]]; then
echo "发现旧规则编号:"
echo "$old_rules" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
for num in $old_rules; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "${type_name} 旧规则清理完成。"
fi
else
echo "未找到 ${type_name} 旧规则。"
fi
}

# ---------- 函数:检查 CIDR 是否已存在 ----------
cidr_exists() {
local cidr="$1"
ufw status | grep -q -F "$cidr"
}

# ---------- 函数:添加 CIDR 列表(IPv4 用 insert 1,IPv6 用 prepend) ----------
add_cidrs() {
local -n cidr_array="$1"
local comment="$2"
local type_name="$3" # "IPv4" 或 "IPv6"
echo "--- 添加 ${type_name} 新规则(${#cidr_array[@]} 条)---"
if $DRY_RUN; then
echo "将要添加以下 CIDR:"
for cidr in "${cidr_array[@]}"; do
echo " deny from $cidr"
done
else
# 倒序插入,保持数组顺序(先添加的排在前面)
for ((i=${#cidr_array[@]}-1; i>=0; i--)); do
local cidr="${cidr_array[i]}"
if cidr_exists "$cidr"; then
echo " $cidr 已存在,跳过"
continue
fi
# 根据类型选择命令
local cmd
if [[ "$type_name" == "IPv6" ]]; then
cmd="ufw prepend deny from $cidr comment '$comment'"
else
cmd="ufw insert 1 deny from $cidr comment '$comment'"
fi
if $DEBUG; then
echo " 执行: $cmd"
fi
if eval "$cmd" 2>/dev/null; then
echo " ✅ 添加 $cidr 成功"
else
echo " ❌ 添加 $cidr 失败(未知错误)"
fi
done
echo "${type_name} 新规则添加完成。"
fi
}

# ---------- 执行清理和添加 ----------
echo "==================== 开始处理 Internet Measurement 静态规则 ===================="

# 清理旧规则(根据类型)
if $DO_IPV4; then
clean_old_rules "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
clean_old_rules "$COMMENT_IPV6" "IPv6"
fi

# 添加新规则(根据类型)
echo -e "\n==================== 添加新规则 ===================="

if $DO_IPV4; then
add_cidrs STATIC_CIDR_IPV4 "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
add_cidrs STATIC_CIDR_IPV6 "$COMMENT_IPV6" "IPv6"
fi

# ---------- 重载防火墙 ----------
echo -e "\n==================== 重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

# ---------- 完成 ----------
echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "Cortex Xpanse 静态黑名单已更新。"
echo "查看全部 IPv4 规则:sudo ufw status verbose | grep '$COMMENT_IPV4'"
echo "查看全部 IPv6 规则:sudo ufw status verbose | grep '$COMMENT_IPV6'"
fi
参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览全部(默认 IPv4+IPv6) sudo ./static_cortex_xpanse.sh --dry-run
预览 IPv4 + 调试 sudo ./static_cortex_xpanse.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./static_cortex_xpanse.sh --dry-run --ipv6 --debug
预览两者 + 调试 sudo ./static_cortex_xpanse.sh --dry-run --ipv4 --ipv6 --debug
正式更新全部(默认) sudo ./static_cortex_xpanse.sh
正式仅更新 IPv4 sudo ./static_cortex_xpanse.sh --ipv4
正式仅更新 IPv6 sudo ./static_cortex_xpanse.sh --ipv6
正式更新两者 sudo ./static_cortex_xpanse.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./static_cortex_xpanse.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./static_cortex_xpanse.sh --ipv6 --debug

禁止Internet Measurement 扫描服务器所有端口

Internet Measurement 互联网测量项目官网

Internet Measurement 互联网测量项目屏蔽IP

IPv4(直接复制可用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo ufw insert 1 deny from 87.236.176.0/24    comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 185.247.137.0/24 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 193.163.125.0/24 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 195.96.139.0/24 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 45.55.151.3/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 45.55.153.86/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 45.55.158.168/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 45.55.185.224/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 45.55.186.92/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 64.227.99.138/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 64.227.108.146/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 64.227.109.89/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 64.227.110.161/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 107.170.65.169/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 128.199.8.140/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 157.245.243.118/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 157.245.245.246/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 159.65.216.50/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 159.65.219.252/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.243.114.171/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.243.116.182/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 162.243.208.127/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 167.99.234.119/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器" && \
sudo ufw insert 1 deny from 192.241.179.235/32 comment "Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器"

IPv6(直接复制可用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sudo ufw prepend deny from 2a06:4880::/29 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:0:202a::b41:8000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:0:202a::b41:a000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:0:202a::b41:b000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:0:202a::b42:d000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:0:202a::b42:e000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:4:1d0::2fa6:a000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:4:1d0::2fa6:b000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:4:1d0::2fa6:c000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:4:1d0::2fa6:d000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:4:1d0::2fa6:e000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:400:d1::91e4:a000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:400:d1::91e4:b000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:400:d1::91e4:c000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:400:d1::91e4:d000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:400:d1::91e4:e000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:800:14::5633:8000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:800:14::5633:9000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:800:14::5633:a000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:800:14::5633:b000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针" && \
sudo ufw prepend deny from 2604:a880:800:14::5633:c000/124 comment "Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针"

IPV4和IPV6脚本

创建一个文件 static_internet_measurement.sh 脚本,保存以下内容 格式切换成UTF-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#!/bin/bash
# ============================================================
# Internet Measurement 静态黑名单管理脚本(最终修复版)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# IPv4 使用 ufw insert 1,IPv6 使用 ufw prepend
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --debug 显示详细调试信息
# --ipv4 仅处理 IPv4(默认如未指定任何类型则全处理)
# --ipv6 仅处理 IPv6
# 示例:
# ./static_internet_measurement.sh --dry-run --debug 预览全部
# ./static_internet_measurement.sh --ipv4 --debug 仅更新 IPv4(调试)
# ./static_internet_measurement.sh --ipv6 仅更新 IPv6
# ./static_internet_measurement.sh --ipv4 --ipv6 同时更新两者
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_IPV4="Internet Measurement扫描段,全部拦截 封禁254台公网设备访问服务器"
COMMENT_IPV6="Internet Measurement IPv6扫描/64网段,阻断本段所有IPv6探针"

# IPv4 静态 CIDR 列表
STATIC_CIDR_IPV4=(
"87.236.176.0/24"
"185.247.137.0/24"
"193.163.125.0/24"
"195.96.139.0/24"
"45.55.151.3/32"
"45.55.153.86/32"
"45.55.158.168/32"
"45.55.185.224/32"
"45.55.186.92/32"
"64.227.99.138/32"
"64.227.108.146/32"
"64.227.109.89/32"
"64.227.110.161/32"
"107.170.65.169/32"
"128.199.8.140/32"
"157.245.243.118/32"
"157.245.245.246/32"
"159.65.216.50/32"
"159.65.219.252/32"
"162.243.114.171/32"
"162.243.116.182/32"
"162.243.208.127/32"
"167.99.234.119/32"
"192.241.179.235/32"
)

# IPv6 静态 CIDR 列表
STATIC_CIDR_IPV6=(
"2a06:4880::/29"
"2604:a880:0:202a::b41:8000/124"
"2604:a880:0:202a::b41:a000/124"
"2604:a880:0:202a::b41:b000/124"
"2604:a880:0:202a::b42:d000/124"
"2604:a880:0:202a::b42:e000/124"
"2604:a880:4:1d0::2fa6:a000/124"
"2604:a880:4:1d0::2fa6:b000/124"
"2604:a880:4:1d0::2fa6:c000/124"
"2604:a880:4:1d0::2fa6:d000/124"
"2604:a880:4:1d0::2fa6:e000/124"
"2604:a880:400:d1::91e4:a000/124"
"2604:a880:400:d1::91e4:b000/124"
"2604:a880:400:d1::91e4:c000/124"
"2604:a880:400:d1::91e4:d000/124"
"2604:a880:400:d1::91e4:e000/124"
"2604:a880:800:14::5633:8000/124"
"2604:a880:800:14::5633:9000/124"
"2604:a880:800:14::5633:a000/124"
"2604:a880:800:14::5633:b000/124"
"2604:a880:800:14::5633:c000/124"
)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
DO_IPV4=false
DO_IPV6=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定 --ipv4 或 --ipv6,则两者都处理
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
DO_IPV6=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号(使用临时文件,防管道阻塞) ----------
get_rule_numbers() {
local comment="$1"
local tmpfile
tmpfile=$(mktemp)
if $DEBUG; then
>&2 echo "DEBUG: 正在执行 ufw status numbered(超时 10 秒)..."
fi
timeout 10 ufw status numbered > "$tmpfile" 2>/dev/null || true
if [[ ! -s "$tmpfile" ]]; then
if $DEBUG; then
>&2 echo "DEBUG: ufw status numbered 无输出或超时,跳过旧规则查找"
fi
rm -f "$tmpfile"
return
fi
# 提取编号,管道末尾添加 || true 防止无匹配时因 pipefail 退出
grep -F "$comment" "$tmpfile" \
| awk -F'[][]' '{print $2}' \
| tr -d ' ' \
| grep -E '^[0-9]+$' \
| sort -nr || true
rm -f "$tmpfile"
}

# ---------- 函数:清理指定注释的规则 ----------
clean_old_rules() {
local comment="$1"
local type_name="$2"
echo "--- 清理 ${type_name} 旧规则 ---"
local old_rules
old_rules=$(get_rule_numbers "$comment")
if [[ -n "$old_rules" ]]; then
echo "发现旧规则编号:"
echo "$old_rules" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
for num in $old_rules; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "${type_name} 旧规则清理完成。"
fi
else
echo "未找到 ${type_name} 旧规则。"
fi
}

# ---------- 函数:检查 CIDR 是否已存在 ----------
cidr_exists() {
local cidr="$1"
ufw status | grep -q -F "$cidr"
}

# ---------- 函数:添加 CIDR 列表(IPv4 用 insert 1,IPv6 用 prepend) ----------
add_cidrs() {
local -n cidr_array="$1"
local comment="$2"
local type_name="$3" # "IPv4" 或 "IPv6"
echo "--- 添加 ${type_name} 新规则(${#cidr_array[@]} 条)---"
if $DRY_RUN; then
echo "将要添加以下 CIDR:"
for cidr in "${cidr_array[@]}"; do
echo " deny from $cidr"
done
else
# 倒序插入,保持数组顺序(先添加的排在前面)
for ((i=${#cidr_array[@]}-1; i>=0; i--)); do
local cidr="${cidr_array[i]}"
if cidr_exists "$cidr"; then
echo " $cidr 已存在,跳过"
continue
fi
# 根据类型选择命令
local cmd
if [[ "$type_name" == "IPv6" ]]; then
cmd="ufw prepend deny from $cidr comment '$comment'"
else
cmd="ufw insert 1 deny from $cidr comment '$comment'"
fi
if $DEBUG; then
echo " 执行: $cmd"
fi
if eval "$cmd" 2>/dev/null; then
echo " ✅ 添加 $cidr 成功"
else
echo " ❌ 添加 $cidr 失败(未知错误)"
fi
done
echo "${type_name} 新规则添加完成。"
fi
}

# ---------- 执行清理和添加 ----------
echo "==================== 开始处理 Internet Measurement 静态规则 ===================="

# 清理旧规则(根据类型)
if $DO_IPV4; then
clean_old_rules "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
clean_old_rules "$COMMENT_IPV6" "IPv6"
fi

# 添加新规则(根据类型)
echo -e "\n==================== 添加新规则 ===================="

if $DO_IPV4; then
add_cidrs STATIC_CIDR_IPV4 "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
add_cidrs STATIC_CIDR_IPV6 "$COMMENT_IPV6" "IPv6"
fi

# ---------- 重载防火墙 ----------
echo -e "\n==================== 重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

# ---------- 完成 ----------
echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "Internet Measurement 静态黑名单已更新。"
echo "查看全部 IPv4 规则:sudo ufw status verbose | grep '$COMMENT_IPV4'"
echo "查看全部 IPv6 规则:sudo ufw status verbose | grep '$COMMENT_IPV6'"
fi
参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览全部(默认 IPv4+IPv6) sudo ./static_internet_measurement.sh --dry-run
预览 IPv4 + 调试 sudo ./static_internet_measurement.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./static_internet_measurement.sh --dry-run --ipv6 --debug
预览两者 + 调试 sudo ./static_internet_measurement.sh --dry-run --ipv4 --ipv6 --debug
正式更新全部(默认) sudo ./static_internet_measurement.sh
正式仅更新 IPv4 sudo ./static_internet_measurement.sh --ipv4
正式仅更新 IPv6 sudo ./static_internet_measurement.sh --ipv6
正式更新两者 sudo ./static_internet_measurement.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./static_internet_measurement.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./static_internet_measurement.sh --ipv6 --debug

禁止Onyphe 扫描服务器所有端口

onypheg官网
onypheg IP列表

IPV4和IPV6脚本

创建一个文件 static_Onyphe.sh 脚本,保存以下内容 格式切换成UTF-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#!/bin/bash
# ============================================================
# Xpanse 静态黑名单管理脚本(合并 IPv4 + IPv6)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --debug 显示详细调试信息
# --ipv4 仅处理 IPv4(默认如未指定任何类型则全处理)
# --ipv6 仅处理 IPv6
# 示例:
# ./static_Onyphe.sh --dry-run --debug 预览全部
# ./static_Onyphe.sh --ipv4 --debug 仅更新 IPv4(调试)
# ./static_Onyphe.sh --ipv6 仅更新 IPv6
# ./static_Onyphe.sh --ipv4 --ipv6 同时更新两者
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_IPV4="Onyphe扫描段,全部拦截 封禁254台公网设备访问服务器"
COMMENT_IPV6="Onyphe扫描段,全部拦截 封禁访问服务器"

# IPv4 静态 CIDR 列表
STATIC_CIDR_IPV4=(
# Onyphe 扫描器 IPv4 网段(AS213412)
"91.196.152.0/24"
"91.231.89.0/24"
"195.184.76.0/24"
"91.230.168.0/24"
"94.231.206.0/24"
"51.254.49.96/28"
)

# IPv6 静态 CIDR 列表
STATIC_CIDR_IPV6=(
# Onyphe 扫描器 IPv6 网段
"2a14:f100::/29"
"2001:41d0:33a:a00::400/124"
"2001:41d0:33d:9200::400/124"
)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
DO_IPV4=false
DO_IPV6=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定 --ipv4 或 --ipv6,则两者都处理
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
DO_IPV6=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号(使用临时文件,防管道阻塞) ----------
get_rule_numbers() {
local comment="$1"
local tmpfile
tmpfile=$(mktemp)
if $DEBUG; then
>&2 echo "DEBUG: 正在执行 ufw status numbered(超时 10 秒)..."
fi
timeout 10 ufw status numbered > "$tmpfile" 2>/dev/null || true
if [[ ! -s "$tmpfile" ]]; then
if $DEBUG; then
>&2 echo "DEBUG: ufw status numbered 无输出或超时,跳过旧规则查找"
fi
rm -f "$tmpfile"
return
fi
# 提取编号,管道末尾添加 || true 防止无匹配时因 pipefail 退出
grep -F "$comment" "$tmpfile" \
| awk -F'[][]' '{print $2}' \
| tr -d ' ' \
| grep -E '^[0-9]+$' \
| sort -nr || true
rm -f "$tmpfile"
}

# ---------- 函数:清理指定注释的规则 ----------
clean_old_rules() {
local comment="$1"
local type_name="$2"
echo "--- 清理 ${type_name} 旧规则 ---"
local old_rules
old_rules=$(get_rule_numbers "$comment")
if [[ -n "$old_rules" ]]; then
echo "发现旧规则编号:"
echo "$old_rules" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
for num in $old_rules; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "${type_name} 旧规则清理完成。"
fi
else
echo "未找到 ${type_name} 旧规则。"
fi
}

# ---------- 函数:检查 CIDR 是否已存在 ----------
cidr_exists() {
local cidr="$1"
ufw status | grep -q -F "$cidr"
}

# ---------- 函数:添加 CIDR 列表(IPv4 用 insert 1,IPv6 用 prepend) ----------
add_cidrs() {
local -n cidr_array="$1"
local comment="$2"
local type_name="$3" # "IPv4" 或 "IPv6"
echo "--- 添加 ${type_name} 新规则(${#cidr_array[@]} 条)---"
if $DRY_RUN; then
echo "将要添加以下 CIDR:"
for cidr in "${cidr_array[@]}"; do
echo " deny from $cidr"
done
else
# 倒序插入,保持数组顺序(先添加的排在前面)
for ((i=${#cidr_array[@]}-1; i>=0; i--)); do
local cidr="${cidr_array[i]}"
if cidr_exists "$cidr"; then
echo " $cidr 已存在,跳过"
continue
fi
# 根据类型选择命令
local cmd
if [[ "$type_name" == "IPv6" ]]; then
cmd="ufw prepend deny from $cidr comment '$comment'"
else
cmd="ufw insert 1 deny from $cidr comment '$comment'"
fi
if $DEBUG; then
echo " 执行: $cmd"
fi
if eval "$cmd" 2>/dev/null; then
echo " ✅ 添加 $cidr 成功"
else
echo " ❌ 添加 $cidr 失败(未知错误)"
fi
done
echo "${type_name} 新规则添加完成。"
fi
}

# ---------- 执行清理和添加 ----------
echo "==================== 开始处理 Internet Measurement 静态规则 ===================="

# 清理旧规则(根据类型)
if $DO_IPV4; then
clean_old_rules "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
clean_old_rules "$COMMENT_IPV6" "IPv6"
fi

# 添加新规则(根据类型)
echo -e "\n==================== 添加新规则 ===================="

if $DO_IPV4; then
add_cidrs STATIC_CIDR_IPV4 "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
add_cidrs STATIC_CIDR_IPV6 "$COMMENT_IPV6" "IPv6"
fi

# ---------- 重载防火墙 ----------
echo -e "\n==================== 重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

# ---------- 完成 ----------
echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "Onyphe 静态黑名单已更新。"
echo "查看全部 IPv4 规则:sudo ufw status verbose | grep '$COMMENT_IPV4'"
echo "查看全部 IPv6 规则:sudo ufw status verbose | grep '$COMMENT_IPV6'"
fi
参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览全部(默认 IPv4+IPv6) sudo ./static_Onyphe.sh --dry-run
预览 IPv4 + 调试 sudo ./static_Onyphe.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./static_Onyphe.sh --dry-run --ipv6 --debug
预览两者 + 调试 sudo ./static_Onyphe.sh --dry-run --ipv4 --ipv6 --debug
正式更新全部(默认) sudo ./static_Onyphe.sh
正式仅更新 IPv4 sudo ./static_Onyphe.sh --ipv4
正式仅更新 IPv6 sudo ./static_Onyphe.sh --ipv6
正式更新两者 sudo ./static_Onyphe.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./static_Onyphe.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./static_Onyphe.sh --ipv6 --debug

添加静态黑名单IP列表

这个列表会持续更新

IPv4添加静态黑名单IP列表

创建一个文件名。后缀.sh文件,放入以下内容 ,运行脚本时候,携带 –dry-run参数,仅预览,不实际修改防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
# ============================================================
# 静态黑名单管理脚本(健壮版 v2)
# 功能:清除旧静态规则(按注释标记),批量置顶添加新 CIDR
# 选项:--dry-run 仅预览,不实际修改防火墙
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_STATIC="多个ipv4扫描服务器,全部拦截访问本服务器"

STATIC_CIDR=(
# Censys扫描段
"66.132.159.0/24"
"66.132.148.0/24"
"66.132.153.0/24"
"66.132.224.0/24"
"66.132.186.0/24"
"66.132.195.0/24"
"66.132.172.0/24"
"162.142.125.0/24"
"167.94.138.0/24"
"167.94.145.0/24"
"167.94.146.0/24"
"167.248.133.0/24"
"199.45.154.0/24"
"199.45.155.0/24"
"206.168.34.0/24"
"206.168.35.0/24"

# Cortex Xpanse扫描段
"35.203.210.0/23"
"144.86.173.0/24"
"147.185.132.0/23"
"162.216.149.0/24"
"162.216.150.0/24"
"172.105.147.0/24"
"198.235.24.0/24"
"205.210.31.0/24"
"216.25.88.0/21"
"147.185.133.0/24"
"220.196.160.0/24"
"180.101.245.0/24"

# Internet Measurement扫描段
"87.236.176.0/24"
"185.247.137.0/24"
"193.163.125.0/24"
"195.96.139.0/24"
"45.55.151.3/32"
"45.55.153.86/32"
"45.55.158.168/32"
"45.55.185.224/32"
"45.55.186.92/32"
"64.227.99.138/32"
"64.227.108.146/32"
"64.227.109.89/32"
"64.227.110.161/32"
"107.170.65.169/32"
"128.199.8.140/32"
"157.245.243.118/32"
"157.245.245.246/32"
"159.65.216.50/32"
"159.65.219.252/32"
"162.243.114.171/32"
"162.243.116.182/32"
"162.243.208.127/32"
"167.99.234.119/32"
"192.241.179.235/32"

# 未知的扫描
"85.217.149.0/24"
"85.217.140.0/24"
)

# ---------- 参数解析 ----------
DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=true
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令,请先安装 ufw"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 当前未激活,规则将添加但不会生效,请先启用 ufw"
fi

# ---------- 函数:稳健提取规则编号 ----------
get_rule_numbers() {
# 方法:使用 grep -oP 提取方括号内的数字(忽略前导空格)
ufw status numbered 2>/dev/null \
| grep -F "$COMMENT_STATIC" \
| grep -oP '\[\s*\K\d+(?=\])' \
| sort -nr
}

# ---------- 第一步:清理旧规则 ----------
echo "==================== 第一步:清理旧静态黑名单规则 ===================="

OLD_RULES=$(get_rule_numbers)

if [[ -n "$OLD_RULES" ]]; then
echo "发现以下旧静态规则(编号):"
echo "$OLD_RULES" | sed 's/^/ /'

if [[ "$DRY_RUN" == true ]]; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
BACKUP_FILE="/tmp/ufw_status_backup_$(date +%s).txt"
ufw status numbered > "$BACKUP_FILE"
echo "已备份当前 ufw 状态到 $BACKUP_FILE"

for num in $OLD_RULES; do
echo " 删除规则编号 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,可能已不存在或编号变动,继续处理其余规则"
fi
done
echo "旧规则清理完成。"
fi
else
echo "未找到任何匹配 '$COMMENT_STATIC' 的旧规则,无需清理。"
fi

# ---------- 第二步:添加新规则 ----------
echo -e "\n==================== 第二步:批量置顶添加静态黑名单 ===================="

if [[ "$DRY_RUN" == true ]]; then
echo "将要添加以下 CIDR(试运行):"
for cidr in "${STATIC_CIDR[@]}"; do
echo " deny from $cidr (comment: $COMMENT_STATIC)"
done
else
# 倒序插入,以保证数组第一个最终排在规则列表最前面(因为 insert 1 会把新规则放到最前面)
for ((i=${#STATIC_CIDR[@]}-1; i>=0; i--)); do
cidr="${STATIC_CIDR[i]}"
echo " 添加规则:deny from $cidr"
if ! ufw insert 1 deny from "$cidr" comment "$COMMENT_STATIC" 2>/dev/null; then
echo " ⚠️ 添加规则 $cidr 失败,跳过"
fi
done
echo "所有新规则已添加。"
fi

# ---------- 第三步:重载防火墙 ----------
echo -e "\n==================== 第三步:重载防火墙生效 ===================="

if [[ "$DRY_RUN" == true ]]; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

echo -e "\n==================== 完成 ===================="
if [[ "$DRY_RUN" == true ]]; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数再运行。"
else
echo "静态黑名单已更新。查看当前规则:"
echo "sudo ufw status verbose | grep '$COMMENT_STATIC'"
fi

IPv6添加静态黑名单IP列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
# ============================================================
# 静态 IPv6 黑名单加载脚本(支持预览模式)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# 选项:--dry-run 仅预览,不实际修改防火墙
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_STATIC="多个ipv6扫描服务器,全部拦截访问本服务器"

STATIC_CIDR=(
# Censys扫描段
"2602:80d:1000:b0cc:e::/80"
"2620:96:e000:b0cc:e::/80"
"2602:80d:1003::/112"
"2602:80d:1004::/112"

# Cortex Xpanse扫描段
"2604:a940:300:5b6::/64"
"2604:a940:301:225::/64"
"2604:a940:302:118::/64"

# Internet Measurement扫描段
"2a06:4880::/29"
"2604:a880:0:202a::b41:8000/124"
"2604:a880:0:202a::b41:a000/124"
"2604:a880:0:202a::b41:b000/124"
"2604:a880:0:202a::b42:d000/124"
"2604:a880:0:202a::b42:e000/124"
"2604:a880:4:1d0::2fa6:a000/124"
"2604:a880:4:1d0::2fa6:b000/124"
"2604:a880:4:1d0::2fa6:c000/124"
"2604:a880:4:1d0::2fa6:d000/124"
"2604:a880:4:1d0::2fa6:e000/124"
"2604:a880:400:d1::91e4:a000/124"
"2604:a880:400:d1::91e4:b000/124"
"2604:a880:400:d1::91e4:c000/124"
"2604:a880:400:d1::91e4:d000/124"
"2604:a880:400:d1::91e4:e000/124"
"2604:a880:800:14::5633:8000/124"
"2604:a880:800:14::5633:9000/124"
"2604:a880:800:14::5633:a000/124"
"2604:a880:800:14::5633:b000/124"
"2604:a880:800:14::5633:c000/124"
)

# ---------- 参数解析 ----------
DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=true
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号 ----------
get_rule_numbers() {
ufw status numbered 2>/dev/null \
| grep -F "$COMMENT_STATIC" \
| grep -oP '\[\s*\K\d+(?=\])' \
| sort -nr
}

# ---------- 第一步:清理旧规则 ----------
echo "==================== 第一步:清理旧静态黑名单规则 ===================="

OLD_RULES=$(get_rule_numbers)

if [[ -n "$OLD_RULES" ]]; then
echo "待删除旧静态规则编号:"
echo "$OLD_RULES" | sed 's/^/ /'
if [[ "$DRY_RUN" == false ]]; then
for num in $OLD_RULES; do
echo "删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
else
echo "(试运行:不会实际删除)"
fi
else
echo "无旧静态黑名单规则"
fi

# ---------- 第二步:批量置顶添加 ----------
echo -e "\n==================== 第二步:批量置顶添加静态黑名单 ===================="

if [[ "$DRY_RUN" == true ]]; then
echo "将要添加以下 IPv6 CIDR(试运行):"
for cidr in "${STATIC_CIDR[@]}"; do
echo " 置顶屏蔽:$cidr"
done
else
# 倒序插入,使数组第一个最终排在最前面
for ((i=${#STATIC_CIDR[@]}-1; i>=0; i--)); do
cidr="${STATIC_CIDR[i]}"
echo "置顶屏蔽:$cidr"
if ! ufw insert 1 deny from "$cidr" comment "$COMMENT_STATIC" 2>/dev/null; then
echo " ⚠️ 添加 $cidr 失败,跳过"
fi
done
fi

# ---------- 第三步:重载 ----------
echo -e "\n==================== 第三步:重载防火墙生效 ===================="
if [[ "$DRY_RUN" == true ]]; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

echo -e "\n===== 静态黑名单加载完成 ====="
if [[ "$DRY_RUN" == true ]]; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "查看全部静态屏蔽规则:sudo ufw status verbose | grep '$COMMENT_STATIC'"
fi

IPV4和IPV6脚本

创建一个文件 static_blacklist.sh 脚本,保存以下内容 格式切换成UTF-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#!/bin/bash
# ============================================================
# Xpanse 静态黑名单管理脚本(合并 IPv4 + IPv6)
# 功能:删除旧规则 → 批量置顶添加新 CIDR → 重载 UFW
# 选项:
# --dry-run 仅预览,不实际修改防火墙
# --debug 显示详细调试信息
# --ipv4 仅处理 IPv4(默认如未指定任何类型则全处理)
# --ipv6 仅处理 IPv6
# 示例:
# ./static_blacklist.sh --dry-run --debug 预览全部
# ./static_blacklist.sh --ipv4 --debug 仅更新 IPv4(调试)
# ./static_blacklist.sh --ipv6 仅更新 IPv6
# ./static_blacklist.sh --ipv4 --ipv6 同时更新两者
# ============================================================

set -euo pipefail

# ---------- 配置 ----------
COMMENT_IPV4="多个ipv4扫描服务器,全部拦截访问本服务器"
COMMENT_IPV6="多个ipv6扫描服务器,全部拦截访问本服务器"

# IPv4 静态 CIDR 列表
STATIC_CIDR_IPV4=(
# 未知的扫描
"85.217.149.0/24"
"85.217.140.0/24"
"2.57.122.0/24"
"80.94.92.180"
"5.226.140.0/24"
"31.14.254.0/24"
"37.10.113.0/24"
"69.5.169.0/24"
"81.19.216.0/24"
"81.19.219.0/24"
"89.21.67.0/24"
"89.37.172.0/24"
"185.216.145.0/24"
"185.223.235.0/24"
"188.240.59.0/24"
"193.176.29.0/24"
"193.176.31.0/24"
"194.50.235.0/24"
"194.88.98.0/24"
"195.140.214.0/24"
"213.166.84.0/24"
"217.146.80.0/24"
"45.154.98.0/24"
"5.231.242.0/24"
"62.60.130.0/24"
"194.165.16.0/24"
"88.214.25.0/24"
"92.118.39.0/24"
"139.162.184.0/2"
)

# IPv6 静态 CIDR 列表
STATIC_CIDR_IPV6=(

)

# ---------- 参数解析 ----------
DRY_RUN=false
DEBUG=false
DO_IPV4=false
DO_IPV6=false

for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--debug) DEBUG=true ;;
--ipv4) DO_IPV4=true ;;
--ipv6) DO_IPV6=true ;;
*) echo "未知参数: $arg" && exit 1 ;;
esac
done

# 默认行为:如果没有指定 --ipv4 或 --ipv6,则两者都处理
if [[ "$DO_IPV4" == false && "$DO_IPV6" == false ]]; then
DO_IPV4=true
DO_IPV6=true
fi

if $DRY_RUN; then
echo "⚠️ 试运行模式(--dry-run):仅显示操作,不会实际修改防火墙"
fi
if $DEBUG; then
echo "🔍 调试模式已开启"
fi
echo "将要处理的类型:IPv4=${DO_IPV4} IPv6=${DO_IPV6}"

# ---------- 前置检查 ----------
if [[ $EUID -ne 0 ]]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi

if ! command -v ufw &>/dev/null; then
echo "错误:未找到 ufw 命令"
exit 1
fi

if ! ufw status | grep -q "Status: active"; then
echo "⚠️ 警告:UFW 未激活,规则可能不会生效"
fi

# ---------- 函数:稳健提取规则编号(使用临时文件,防管道阻塞) ----------
get_rule_numbers() {
local comment="$1"
local tmpfile
tmpfile=$(mktemp)
if $DEBUG; then
>&2 echo "DEBUG: 正在执行 ufw status numbered(超时 10 秒)..."
fi
timeout 10 ufw status numbered > "$tmpfile" 2>/dev/null || true
if [[ ! -s "$tmpfile" ]]; then
if $DEBUG; then
>&2 echo "DEBUG: ufw status numbered 无输出或超时,跳过旧规则查找"
fi
rm -f "$tmpfile"
return
fi
# 提取编号,管道末尾添加 || true 防止无匹配时因 pipefail 退出
grep -F "$comment" "$tmpfile" \
| awk -F'[][]' '{print $2}' \
| tr -d ' ' \
| grep -E '^[0-9]+$' \
| sort -nr || true
rm -f "$tmpfile"
}

# ---------- 函数:清理指定注释的规则 ----------
clean_old_rules() {
local comment="$1"
local type_name="$2"
echo "--- 清理 ${type_name} 旧规则 ---"
local old_rules
old_rules=$(get_rule_numbers "$comment")
if [[ -n "$old_rules" ]]; then
echo "发现旧规则编号:"
echo "$old_rules" | sed 's/^/ /'
if $DRY_RUN; then
echo "(试运行:不会实际删除)"
else
echo "开始倒序删除..."
for num in $old_rules; do
echo " 删除规则 $num"
if ! ufw --force delete "$num" 2>/dev/null; then
echo " ⚠️ 删除规则 $num 失败,跳过"
fi
done
echo "${type_name} 旧规则清理完成。"
fi
else
echo "未找到 ${type_name} 旧规则。"
fi
}

# ---------- 函数:检查 CIDR 是否已存在 ----------
cidr_exists() {
local cidr="$1"
ufw status | grep -q -F "$cidr"
}

# ---------- 函数:添加 CIDR 列表(IPv4 用 insert 1,IPv6 用 prepend) ----------
add_cidrs() {
local -n cidr_array="$1"
local comment="$2"
local type_name="$3" # "IPv4" 或 "IPv6"
echo "--- 添加 ${type_name} 新规则(${#cidr_array[@]} 条)---"
if $DRY_RUN; then
echo "将要添加以下 CIDR:"
for cidr in "${cidr_array[@]}"; do
echo " deny from $cidr"
done
else
# 倒序插入,保持数组顺序(先添加的排在前面)
for ((i=${#cidr_array[@]}-1; i>=0; i--)); do
local cidr="${cidr_array[i]}"
if cidr_exists "$cidr"; then
echo " $cidr 已存在,跳过"
continue
fi
# 根据类型选择命令
local cmd
if [[ "$type_name" == "IPv6" ]]; then
cmd="ufw prepend deny from $cidr comment '$comment'"
else
cmd="ufw insert 1 deny from $cidr comment '$comment'"
fi
if $DEBUG; then
echo " 执行: $cmd"
fi
if eval "$cmd" 2>/dev/null; then
echo " ✅ 添加 $cidr 成功"
else
echo " ❌ 添加 $cidr 失败(未知错误)"
fi
done
echo "${type_name} 新规则添加完成。"
fi
}

# ---------- 执行清理和添加 ----------
echo "==================== 开始处理 Internet Measurement 静态规则 ===================="

# 清理旧规则(根据类型)
if $DO_IPV4; then
clean_old_rules "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
clean_old_rules "$COMMENT_IPV6" "IPv6"
fi

# 添加新规则(根据类型)
echo -e "\n==================== 添加新规则 ===================="

if $DO_IPV4; then
add_cidrs STATIC_CIDR_IPV4 "$COMMENT_IPV4" "IPv4"
fi

if $DO_IPV6; then
add_cidrs STATIC_CIDR_IPV6 "$COMMENT_IPV6" "IPv6"
fi

# ---------- 重载防火墙 ----------
echo -e "\n==================== 重载防火墙生效 ===================="
if $DRY_RUN; then
echo "(试运行:不会实际重载)"
else
if ufw reload; then
echo "✅ UFW 重载成功"
else
echo "❌ UFW 重载失败,请手动执行 'sudo ufw reload'"
exit 1
fi
fi

# ---------- 完成 ----------
echo -e "\n==================== 完成 ===================="
if $DRY_RUN; then
echo "试运行结束,如需正式执行,请去掉 --dry-run 参数。"
else
echo "black list 静态黑名单已更新。"
echo "查看全部 IPv4 规则:sudo ufw status verbose | grep '$COMMENT_IPV4'"
echo "查看全部 IPv6 规则:sudo ufw status verbose | grep '$COMMENT_IPV6'"
fi
参数组合 是否支持 说明
--dry-run 预览模式,不实际修改防火墙
--debug 显示详细执行日志
--ipv4 仅处理 IPv4
--ipv6 仅处理 IPv6
多个参数组合(如 --dry-run --ipv6 --debug 所有参数可任意组合,互不冲突
操作说明 命令(直接复制)
预览全部(默认 IPv4+IPv6) sudo ./static_blacklist.sh --dry-run
预览 IPv4 + 调试 sudo ./static_blacklist.sh --dry-run --ipv4 --debug
预览 IPv6 + 调试 sudo ./static_blacklist.sh --dry-run --ipv6 --debug
预览两者 + 调试 sudo ./static_blacklist.sh --dry-run --ipv4 --ipv6 --debug
正式更新全部(默认) sudo ./static_blacklist.sh
正式仅更新 IPv4 sudo ./static_blacklist.sh --ipv4
正式仅更新 IPv6 sudo ./static_blacklist.sh --ipv6
正式更新两者 sudo ./static_blacklist.sh --ipv4 --ipv6
正式更新 IPv4 + 调试 sudo ./static_blacklist.sh --ipv4 --debug
正式更新 IPv6 + 调试 sudo ./static_blacklist.sh --ipv6 --debug