viczem/nftables-ipset

GitHub: viczem/nftables-ipset

一个基于 SQLite 和 nftables 的极简 IP 屏蔽列表管理器,解决本地黑名单持久化与自动化防火墙规则生成问题。

Stars: 0 | Forks: 0

# nftables-ipset – 简单的 IP 屏蔽列表管理器 一个轻量级命令行工具,用于在 SQLite 数据库中维护**持久化 IP 屏蔽列表**,并生成可直接使用的 *nftables* 集合文件。 它刻意保持极简:仅一个 Python 脚本,无外部服务,所有数据均本地存储。 典型工作流程: 1. **添加**单个或多个 IP 地址(可选附带元数据)。 2. **移除**单个或多个 IP 地址。 3. **导出**整个列表为 nftables 兼容文件(`20‑blocklist‑ipv4.nft`)。 该文件可放入 `/etc/nftables.d/` 并被全局 nftables 配置自动包含。 ## 安装 ``` git clone https://github.com/viczem/nftables-ipset.git cd nftables-ipset uv run nftables-ipset ``` ## 配置 ### 数据库位置 | 变量 | 默认值 | 示例 | |------|--------|------| | `DIR` | *脚本所在目录* | `export DIR=/var/lib/nftables-ipset` | - 该目录必须对运行脚本的用户(或使用的 systemd 服务)**可写**。 - 数据库文件始终命名为 `nftables-ipset.db`。 ### nftables 文件布局(作者使用的“规范”布局) ``` /etc/nftables.d/ ├── 10-blocklist.nft # static table / chain definition (never overwritten) ├── 20-blocklist-ipv4.nft # generated by `nftables-ipset --export` └── 20-blocklist-ipv6.nft ``` **10‑blocklist.nft**(随 README 提供,复制到主机) ``` table inet blocklists { set blocklist_ipv4 { type ipv4_addr flags interval } set blocklist_ipv6 { type ipv6_addr flags interval } chain earlydrop { type filter hook prerouting priority -300; policy accept; ip saddr @blocklist_ipv4 drop ip6 saddr @blocklist_ipv6 drop } } ``` **20‑blocklist‑ipv4.nft**(生成) ``` add element inet blocklists blocklist_ipv4 { 1.1.1.1, 2.2.2.2, … } ``` **20‑blocklist‑ipv4.nft**(生成) ``` add element inet blocklists blocklist_ipv6 { 2001:db8::/32, 2606:4700:4700::1111, … } ``` **/etc/nftables.conf**(主文件,大多数发行版也提供) ``` #!/usr/sbin/nft -f flush ruleset #... include "/etc/nftables.d/*.nft" ``` `include` 行会自动加载 `10‑blocklist.nft` 和 `20‑blocklist‑ipv4.nft`(以及 `20‑blocklist‑ipv6.nft`)。 运行 `nftables-ipset --export` 时,生成的文件会被**原地覆盖**,因此下次执行 `nft -f /etc/nftables.conf` 重载即可更新列表。 ## 用法 ``` uv run nftables-ipset -h ``` ``` usage: nftables-ipset [-h] [-a IP | -A | -r IP | -R] [-c COMMENT] [-e] Manage an IP blocklist (IPv4 & IPv6) stored in a SQLite database. The DB location can be overridden with the DIR environment variable. options: -h, --help show this help message and exit -a, --add IP Add a single IP address or network. -A, --batch-add Add many IPs/networks from stdin. -r, --remove IP Remove a single IP address (hosts only). -R, --batch-remove Remove many IPs from stdin. -c, --comment COMMENT Comment stored for every added host IP. -e, --export Export blocklists to nftables files. ``` ### 添加单个地址 ``` uv run nftables-ipset --add 203.0.113.45 # 带注释(例如代码块来源) uv run nftables-ipset --add 203.0.113.45 --comment "spam‑source:spamhaus" ``` ### 批量添加多个地址 ``` # 从文件中 cat bad_ips.txt | uv run nftables-ipset --batch-add # 从另一个命令 curl -s https://example.com/blocked.txt | uv run nftables-ipset --batch-add ``` *批量模式按行读取 IP 地址。空行或 `Ctrl‑D` 结束输入。* 若输入文件包含**注释**(`#` 后的内容),会自动剥离。 若希望**所有行使用相同注释**,可通过 `-c "your‑note"` 指定;该注释会覆盖每行独立注释。 ### 移除单个地址 ``` uv run nftables-ipset --remove 203.0.113.45 ``` ### 批量移除多个地址 ``` cat to_remove.txt | uv run nftables-ipset --batch-remove ``` ### 导出到 nftables ``` uv run nftables-ipset --export ``` 该命令执行以下操作: 1. 从数据库读取**所有行**。 2. 将它们写入 `20-blocklist-ipv4.nft`(或/和 `20-blocklist-ipv6.nft`),保存至**脚本所在目录**(或通过 `DIR` 指定)。 导出后,将文件复制到 `/etc/nftables.d/20-blocklist-ipv4.nft`(需要 root 权限)并重载 nftables: ``` sudo nft -f /etc/nftables.conf # 或者,如果存在 systemd 服务: sudo systemctl reload nftables ```
标签:Awesome, CLI, iptables替代, IP封禁, IP黑名单, nftables, Python, SQLite, WiFi技术, 持久化存储, 无后门, 系统管理, 网络访问控制, 网络防护, 自动化运维, 逆向工具, 防火墙规则