340 lines
8.1 KiB
Markdown
340 lines
8.1 KiB
Markdown
# BIP (Block-IP) - C语言实现
|
||
|
||
基于 nftables 的自动封禁恶意IP工具,支持IPv4/IPv6和CIDR格式。
|
||
|
||
## 特性
|
||
|
||
- **PAM集成**:自动监控SSH登录失败尝试
|
||
- **连接限速**:防御TCP洪水攻击(每IP每分钟最多20次SSH新连接)
|
||
- **双栈支持**:完整支持IPv4/IPv6和CIDR网段
|
||
- **智能聚合**:自动检测并聚合为更大网段,减少规则数量
|
||
- **白名单保护**:白名单规则优先级高于黑名单,保护信任IP
|
||
- **地理位置**:显示IP归属国家/地区
|
||
- **实时统计**:树状层级显示聚合统计,包含散落IP计数
|
||
- **灵活配置**:支持动态修改封禁时长和重试次数
|
||
- **高性能**:C11实现,nftables集合优化,52K stripped binary
|
||
- **Watch模式**:2秒自动刷新监控界面
|
||
|
||
|
||
## 模块划分
|
||
|
||
```
|
||
blockip/
|
||
├── include/ # 头文件目录
|
||
│ ├── common.h # 公共定义和工具函数
|
||
│ ├── log.h # 日志模块
|
||
│ ├── ip_utils.h # IP地址处理工具
|
||
│ ├── geo.h # 地理位置查询
|
||
│ ├── nftables.h # nftables操作接口
|
||
│ ├── whitelist.h # 白名单管理
|
||
│ ├── ban.h # 封禁/解封核心逻辑
|
||
│ ├── pam.h # PAM集成模块
|
||
│ ├── stats.h # 统计和展示
|
||
│ └── install.h # 安装/卸载功能
|
||
├── src/ # 源文件目录
|
||
│ ├── main.c # 主程序入口
|
||
│ ├── common.c # 公共函数实现
|
||
│ ├── log.c # 日志功能实现
|
||
│ ├── ip_utils.c # IP处理实现
|
||
│ ├── geo.c # 地理位置实现
|
||
│ ├── nftables.c # nftables实现
|
||
│ ├── whitelist.c # 白名单实现
|
||
│ ├── ban.c # 封禁逻辑实现
|
||
│ ├── pam.c # PAM集成实现
|
||
│ ├── stats.c # 统计功能实现
|
||
│ └── install.c # 安装功能实现
|
||
├── Makefile # 构建脚本
|
||
└── README.md # 本文档
|
||
```
|
||
|
||
## 系统要求
|
||
|
||
- **操作系统**:Linux (Debian/Ubuntu/CentOS/RHEL)
|
||
- **内核**:nftables 支持 (>= 3.13)
|
||
- **编译器**:GCC (支持 C11 标准)
|
||
- **PAM开发库**:libpam0g-dev (Debian/Ubuntu) 或 pam-devel (CentOS/RHEL)
|
||
- **权限**:安装和运行需要root权限
|
||
|
||
|
||
## 编译安装
|
||
|
||
### 1. 编译程序
|
||
|
||
```bash
|
||
cd blockip
|
||
make
|
||
```
|
||
|
||
### 2. 安装到系统(需要root权限)
|
||
|
||
```bash
|
||
sudo make install
|
||
```
|
||
|
||
### 3. 配置系统服务
|
||
|
||
```bash
|
||
sudo bip install
|
||
```
|
||
|
||
这将自动完成以下配置:
|
||
|
||
- 创建配置目录 `/etc/bip`
|
||
- 初始化nftables表和规则集(`inet bip`表)
|
||
- 配置PAM模块(修改`/etc/pam.d/sshd`)
|
||
- 设置systemd服务自动启动
|
||
- 从持久化文件恢复黑白名单
|
||
|
||
## 使用方法
|
||
|
||
### 查看状态和统计
|
||
|
||
```bash
|
||
# 查看实时统计、活跃封禁列表、日志
|
||
bip list
|
||
|
||
# 显示本地持久化封禁列表
|
||
bip show
|
||
```
|
||
|
||
### 手动封禁/解封IP
|
||
|
||
```bash
|
||
# 封禁单个IPv4地址
|
||
bip add 1.2.3.4
|
||
|
||
# 封禁IPv4网段(CIDR)
|
||
bip add 1.2.3.0/24
|
||
|
||
# 封禁IPv6地址
|
||
bip add 2001:db8::1
|
||
|
||
# 封禁IPv6网段
|
||
bip add 2001:db8::/32
|
||
|
||
# 解封IP
|
||
bip del 1.2.3.4
|
||
```
|
||
|
||
### 白名单管理
|
||
|
||
```bash
|
||
# 添加IP到白名单
|
||
bip vip add 192.168.1.100
|
||
|
||
# 添加网段到白名单
|
||
bip vip add 192.168.0.0/16
|
||
|
||
# 从白名单移除
|
||
bip vip del 192.168.1.100
|
||
|
||
# 显示白名单列表
|
||
bip vip list
|
||
```
|
||
|
||
### 系统管理
|
||
|
||
```bash
|
||
# 从持久化文件恢复黑白名单
|
||
bip restore
|
||
|
||
# 卸载服务
|
||
bip uninstall
|
||
```
|
||
|
||
## 工作原理
|
||
|
||
1. **PAM集成**:通过PAM模块监控SSH登录尝试
|
||
2. **失败计数**:记录每个IP的失败登录次数
|
||
3. **自动封禁**:达到阈值(默认3次)后自动封禁IP
|
||
4. **异步处理**:使用fork子进程异步执行封禁和地理查询,不阻塞SSH登录
|
||
5. **nftables规则**:使用nftables的集合(set)功能高效封禁
|
||
6. **持久化存储**:封禁记录保存到磁盘,重启后自动恢复
|
||
7. **白名单保护**:白名单IP永不封禁
|
||
8. **自动解封**:24小时后自动解封(可配置)
|
||
|
||
## 配置参数
|
||
|
||
### 动态配置(无需重新编译)
|
||
|
||
使用配置文件 `/etc/bip/config` 灵活修改封禁时间:
|
||
|
||
```bash
|
||
# 查看当前配置
|
||
bip config
|
||
|
||
# 设置封禁时间为12小时
|
||
bip config time 12h
|
||
|
||
# 设置封禁时间为30分钟
|
||
bip config time 30m
|
||
|
||
# 设置为永久封禁
|
||
bip config time ""
|
||
|
||
# 设置最大重试次数为5次
|
||
bip config retries 5
|
||
```
|
||
|
||
支持的配置参数:
|
||
|
||
**封禁时间 (time)**
|
||
- `24h` - 24小时
|
||
- `12h` - 12小时
|
||
- `1h` - 1小时
|
||
- `30m` - 30分钟
|
||
- `""` - 永久封禁(空字符串)
|
||
|
||
**最大重试次数 (retries)**
|
||
- 范围:1-10 次
|
||
- 默认:3 次
|
||
- 说明:SSH登录失败达到此次数后自动封禁
|
||
|
||
配置文件位置:`/etc/bip/config`
|
||
|
||
### 静态配置(需要重新编译)
|
||
|
||
在 `include/common.h` 中可以修改以下默认参数:
|
||
|
||
```c
|
||
#define DEFAULT_MAX_RETRIES 3 // 默认最大失败次数
|
||
#define DEFAULT_BAN_TIME "24h" // 默认封禁时长
|
||
#define NFT_TABLE "inet bip" // nftables表名
|
||
```
|
||
|
||
修改后需要重新编译:
|
||
|
||
```bash
|
||
make clean
|
||
make
|
||
sudo make install
|
||
```
|
||
|
||
## 文件说明
|
||
|
||
`/etc/bip/` 目录结构:
|
||
|
||
- `config` - 配置文件(封禁时间、重试次数)
|
||
- `blacklist` - 封禁IP列表(持久化存储)
|
||
- `whitelist` - 白名单列表(持久化存储)
|
||
- `counts/` - 失败次数记录目录
|
||
|
||
日志文件:`/var/log/bip.log`(自动轮转,最大10MB)
|
||
|
||
## 卸载
|
||
|
||
```bash
|
||
# 完全卸载(会询问是否删除数据文件)
|
||
sudo make uninstall
|
||
```
|
||
|
||
或者:
|
||
|
||
```bash
|
||
sudo bip uninstall
|
||
```
|
||
|
||
## 开发和调试
|
||
|
||
### 编译调试版本
|
||
|
||
```bash
|
||
make debug
|
||
```
|
||
|
||
### 清理编译文件
|
||
|
||
```bash
|
||
make clean
|
||
```
|
||
|
||
### 深度清理(包括配置文件)
|
||
|
||
```bash
|
||
make distclean
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
- **nftables集合**:使用集合(set)数据结构,O(1)查询效率,支持超大规模IP封禁
|
||
- **智能聚合**:自动检测/24和/64网段,减少规则数量,提升匹配速度
|
||
- **异步处理**:fork子进程执行封禁和地理查询,不阻塞SSH登录
|
||
- **内存优化**:静态缓冲区,避免频繁malloc/free
|
||
- **编译优化**:`-O2` 优化级别,自动strip符号表,二进制仅52KB
|
||
|
||
|
||
## 注意事项
|
||
|
||
1. **白名单优先**:请先将信任的IP加入白名单,避免误封
|
||
2. **网段封禁**:使用CIDR封禁时请谨慎,避免误伤
|
||
3. **日志监控**:定期查看日志,了解攻击情况
|
||
4. **备份配置**:重要服务器建议备份白名单配置
|
||
|
||
## 常见问题
|
||
|
||
### Q: 不小心把自己封禁了怎么办?
|
||
|
||
A: 通过控制台登录服务器,执行:
|
||
```bash
|
||
bip del YOUR_IP
|
||
bip vip add YOUR_IP
|
||
```
|
||
|
||
### Q: 如何查看当前封禁了多少IP?
|
||
|
||
A: 执行 `bip list` 查看统计信息
|
||
|
||
### Q: 封禁时间可以永久吗?
|
||
|
||
A: 使用命令 `bip config time ""` 设置永久封禁,无需重新编译
|
||
|
||
### Q: 支持自定义失败次数吗?
|
||
|
||
A: 使用命令 `bip config retries <次数>` 动态修改,范围1-10次
|
||
|
||
## 技术特点
|
||
|
||
- **C11标准**:现代C语言实现,高性能低资源消耗
|
||
- **模块化设计**:头文件与源文件分离,职责清晰
|
||
- **POSIX兼容**:遵循POSIX标准,跨Linux发行版可移植
|
||
- **PAM集成**:标准PAM接口,无侵入式监控
|
||
- **nftables优化**:使用集合(set)而非单条规则,支持timeout自动过期
|
||
- **日志轮转**:日志文件自动轮转,避免磁盘占用过大
|
||
- **零依赖**:除PAM库外无额外依赖,部署简单
|
||
- **安全性**:白名单规则优先,root权限检查,防止误封
|
||
|
||
|
||
## 贡献
|
||
|
||
欢迎提交Issue和Pull Request!
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 作者
|
||
|
||
原Shell版本:su
|
||
C语言重构:GitHub Copilot
|
||
|
||
## 更新日志
|
||
|
||
### v25.11.18 (2025-11-18)
|
||
|
||
**完整C语言重构版本**
|
||
|
||
- 从Shell脚本完全重写为C11代码
|
||
- 实现PAM模块集成,自动监控SSH登录
|
||
- nftables集合优化,支持IPv4/IPv6双栈
|
||
- 智能网段聚合算法(/24和/64)
|
||
- 树状层级显示,包含散落IP统计
|
||
- 动态配置系统(封禁时长、重试次数)
|
||
- 地理位置查询(IP归属国家/地区)
|
||
- 白名单优先规则(accept before drop)
|
||
- Watch模式实时监控(2秒刷新)
|
||
- 数字IP排序(同数量按IP第一段排序)
|
||
- Makefile自动strip优化(52KB二进制)
|
||
|
||
|
||
**享受更安全的服务器环境! 🛡️**
|