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技术, 持久化存储, 无后门, 系统管理, 网络访问控制, 网络防护, 自动化运维, 逆向工具, 防火墙规则