nftables-blacklist配置全解析:从基础设置到高级自定义
nftables-blacklist配置全解析:从基础设置到高级自定义
【免费下载链接】nftables-blacklistA bash script to ban large numbers of IP addresses published in blacklists.项目地址: https://gitcode.com/gh_mirrors/ip/nftables-blacklist
nftables-blacklist是一款基于Bash脚本的安全工具,能够自动下载公共IP黑名单并通过nftables实现高效拦截,保护Linux服务器免受脚本小子、僵尸网络和恶意流量的侵扰。该工具全面支持IPv4和IPv6协议,具备CIDR聚合、内置白名单、定时更新和服务器IP自动检测等实用功能,是服务器安全防护的得力助手。
快速上手:5分钟完成基础部署
系统要求与依赖安装 📦
nftables-blacklist对系统环境有以下要求:
- Debian 10+/Ubuntu 20.04+或其他支持nftables的Linux发行版
- nftables防火墙
- iprange工具(用于IP范围合并和白名单处理)
- 基础命令行工具(curl、grep、sed、sort、wc,通常已预装)
在Debian/Ubuntu系统中,可通过以下命令安装所需依赖:
sudo apt install curl iprange一键安装部署流程 ⚡
- 下载核心脚本
sudo curl -fsSL -o /usr/local/sbin/update-blacklist.sh \ https://raw.githubusercontent.com/trick77/nftables-blacklist/master/update-blacklist.sh sudo chmod +x /usr/local/sbin/update-blacklist.sh- 创建配置目录并获取默认配置
sudo mkdir -p /etc/nftables-blacklist if [ -f /etc/nftables-blacklist/nftables-blacklist.conf ]; then echo "Config already exists, skipping download" else sudo curl -fsSL -o /etc/nftables-blacklist/nftables-blacklist.conf \ https://raw.githubusercontent.com/trick77/nftables-blacklist/master/nftables-blacklist.conf fi- 执行首次更新
sudo /usr/local/sbin/update-blacklist.sh /etc/nftables-blacklist/nftables-blacklist.conf- 验证部署结果
# 列出黑名单表 sudo nft list table inet blacklist # 查看IPv4集合内容 sudo nft list set inet blacklist blacklist4 # 查看IPv6集合内容 sudo nft list set inet blacklist blacklist6 # 检查拦截统计 sudo nft list chain inet blacklist input成功部署后,你将看到类似以下的拦截统计信息:
chain input { type filter hook input priority -200; policy accept; ip saddr @blacklist4 counter packets 1523 bytes 91380 drop comment "IPv4 blacklist" ip6 saddr @blacklist6 counter packets 42 bytes 3360 drop comment "IPv6 blacklist" }核心配置详解:打造个性化防护策略
配置文件结构与路径
nftables-blacklist的主配置文件为nftables-blacklist.conf,默认位于/etc/nftables-blacklist/目录下。该文件采用Bash语法,主要包含以下配置区域:
- 文件路径定义
- 行为控制开关
- 黑名单源配置
- 白名单设置
- 高级参数覆盖
必知关键配置项 🔑
| 设置项 | 默认值 | 描述 |
|---|---|---|
ENABLE_IPV4 | yes | 是否拦截IPv4地址 |
ENABLE_IPV6 | yes | 是否拦截IPv6地址 |
FORCE | yes | 自动创建nftables表和集合(推荐保持默认) |
AUTO_WHITELIST | no | 自动检测并白名单服务器自身IP(推荐设为yes) |
BLOCK_FORWARD | no | 是否同时拦截转发链流量(如容器流量) |
NFT_CHAIN_PRIORITY | -200 | 规则检查优先级(值越低越优先) |
CURL_CONNECT_TIMEOUT | 10 | 黑名单服务器连接超时(秒) |
CURL_MAX_TIME | 30 | 单个黑名单下载最大时间(秒) |
自定义黑名单源
默认配置已包含多个高质量公共黑名单源,你可以根据需求在BLACKLISTS数组中增删条目:
BLACKLISTS=( # 本地自定义列表 "file:///etc/nftables-blacklist/custom.list" # 公共黑名单 "https://www.spamhaus.org/drop/drop_v4.json" "https://lists.blocklist.de/lists/all.txt" # 国家/地区屏蔽(取消注释并修改国家代码) # "https://raw.githubusercontent.com/ipverse/country-ip-blocks/master/country/ru/ipv4-aggregated.txt" )小贴士:使用IPverse可以查询ASN、IP所有者和网络范围,帮助你选择需要屏蔽的国家或网络。
白名单策略:避免误拦截的终极指南
手动白名单配置
编辑配置文件中的WHITELIST数组,添加需要保护的IP或CIDR范围:
WHITELIST=( "203.0.113.10" # 单个服务器IP "203.0.113.0/24" # 整个网段 "2001:db8::1" # IPv6地址 "file:///etc/nftables-blacklist/extra.list" # 外部白名单文件 )对于IPv4,白名单中的CIDR范围会自动排除该范围内的所有IP;而IPv6白名单目前仅支持精确匹配单个IP。
外部白名单文件
当需要管理大量白名单条目时,推荐使用外部文件:
- 创建白名单文件:
/etc/nftables-blacklist/extra.list - 按行添加IP/CIDR,支持
#开头的注释:
# 办公网络 192.168.1.0/24 # VPN服务器 203.0.113.50 # IPv6地址 2001:db8::/32- 在配置文件中引用:
"file:///etc/nftables-blacklist/extra.list"
自动检测服务器IP(推荐)
启用自动白名单功能可避免因服务器IP出现在公共黑名单而导致的自拦截问题:
AUTO_WHITELIST=yes该功能会自动检测:
- 本地网卡IP地址(排除私有地址)
- 通过外部服务获取的公网IP(使用o11.net和icanhazip.com作为数据源)
启用后,你将在更新日志中看到自动白名单的IP:
Auto-detecting server IPs for whitelist... Whitelisted: 2001:db8:305:2100::1 Whitelisted: 203.0.113.10高级应用:从定时更新到性能优化
配置系统服务实现开机自启
为确保黑名单在服务器重启后自动加载,创建系统服务文件:
sudo cat <<'EOF' > /etc/systemd/system/nftables-blacklist.service [Unit] Description=nftables IP blacklist After=network.target [Service] Type=oneshot ExecStart=/usr/local/sbin/update-blacklist.sh /etc/nftables-blacklist/nftables-blacklist.conf RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF启用服务:
sudo systemctl daemon-reload sudo systemctl enable --now nftables-blacklist.service设置定时自动更新 ⏰
创建定时器配置,实现黑名单每日自动更新:
sudo cat <<'EOF' > /etc/systemd/system/nftables-blacklist-update.timer [Unit] Description=Update nftables IP blacklist daily [Timer] OnCalendar=*-*-* 23:33:00 Persistent=true RandomizedDelaySec=14400 [Install] WantedBy=timers.target EOF sudo cat <<'EOF' > /etc/systemd/system/nftables-blacklist-update.service [Unit] Description=Update nftables IP blacklist After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/update-blacklist.sh --cron /etc/nftables-blacklist/nftables-blacklist.conf EOF启用定时器:
sudo systemctl daemon-reload sudo systemctl enable --now nftables-blacklist-update.timer最佳实践:每日更新1-2次即可,过于频繁可能导致被黑名单提供商封禁。
处理大型IP集合(10万+条目)
当黑名单包含大量IP时,可能会遇到"消息过长"或"无缓冲空间"错误,可通过调整内核网络缓冲区解决:
# 创建sysctl配置文件 sudo cat <<'EOF' > /etc/sysctl.d/99-nftables.conf net.core.rmem_max = 8388608 net.core.rmem_default = 8388608 EOF # 应用配置 sudo sysctl -p /etc/sysctl.d/99-nftables.conf测试模式与日志分析
使用--dry-run参数测试配置而不实际应用规则:
update-blacklist.sh --dry-run /etc/nftables-blacklist/nftables-blacklist.conf对于定时任务,使用--cron参数生成结构化日志:
update-blacklist.sh --cron /etc/nftables-blacklist/nftables-blacklist.conf查看拦截统计:
sudo nft list chain inet blacklist input故障排除与常见问题
"nftables table does not exist"错误
当出现此错误时,确保配置文件中FORCE=yes(默认已设置),脚本会自动创建所需的nftables表和集合。
检查特定IP是否被拦截
# 检查IPv4 sudo nft get element inet blacklist blacklist4 '{ 1.2.3.4 }' # 检查IPv6 sudo nft get element inet blacklist blacklist6 '{ 2001:db8::1 }'与现有防火墙规则的集成
nftables-blacklist使用独立的inet blacklist表,不会干扰现有防火墙规则。默认优先级-200确保黑名单规则在大多数其他规则之前检查,如需调整可修改NFT_CHAIN_PRIORITY参数。
转发流量未被拦截
默认情况下,黑名单仅作用于input链(保护服务器自身)。要同时保护转发流量(如Docker容器),需设置:
BLOCK_FORWARD=yes迁移指南:从ipset-blacklist升级
如果你之前使用的是旧版ipset/iptables版本,可按以下步骤迁移:
- 清理旧版本
# 移除iptables规则和ipset iptables -D INPUT -m set --match-set blacklist src -j DROP ipset destroy blacklist # 移除旧定时任务 rm -f /etc/cron.d/update-blacklist # 移除旧脚本和配置 rm -f /usr/local/sbin/update-blacklist.sh rm -rI /etc/ipset-blacklist- 按照本文档的"快速上手"部分安装新版
注意:Debian Trixie及更新版本用户需确保使用nftables后端:
update-alternatives --set iptables /usr/sbin/iptables-nft update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
完全卸载指南
如需彻底移除nftables-blacklist:
- 停止并禁用服务
sudo systemctl disable --now nftables-blacklist-update.timer sudo systemctl disable --now nftables-blacklist.service- 删除nftables表
sudo nft delete table inet blacklist- 移除系统文件
sudo rm -f /etc/systemd/system/nftables-blacklist.service sudo rm -f /etc/systemd/system/nftables-blacklist-update.service sudo rm -f /etc/systemd/system/nftables-blacklist-update.timer sudo systemctl daemon-reload sudo rm -f /usr/local/sbin/update-blacklist.sh sudo rm -rI /etc/nftables-blacklist- 移除内核参数调整(如之前设置过)
sudo rm -f /etc/sysctl.d/99-nftables.conf sudo sysctl --system完成以上步骤后,系统将恢复到安装前状态,所有被拦截的流量将恢复正常。
【免费下载链接】nftables-blacklistA bash script to ban large numbers of IP addresses published in blacklists.项目地址: https://gitcode.com/gh_mirrors/ip/nftables-blacklist
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
