malikmoeen119-ship-it/multithreaded-port-scanner-firewall-defense
GitHub: malikmoeen119-ship-it/multithreaded-port-scanner-firewall-defense
一个从零实现的 Python 多线程 TCP 端口扫描器,在 iptables 防火墙加固的目标主机上测试,从攻防两侧演示端口扫描、线程同步、防火墙检测与规避技术。
Stars: 0 | Forks: 0
# 具备防御性防火墙检测的多线程端口扫描器
这是一个双视角的网络安全实验:一个从零开始编写的 Python 多线程 TCP 端口扫描器,在运行基于 `iptables` 检测和防御规则的强化目标主机上进行测试。本项目从**攻方**(扫描、规避)和**守方**(日志记录、速率限制、DROP 规则)两个视角对项目进行了探索,并深入剖析了线程同步与竞态条件。
## 实验环境
| 组件 | 攻击者虚拟机 | 目标虚拟机 |
|---|---|---|
| 操作系统 | Kali Linux | Kali Linux |
| IP 地址 | 192.168.11.129 | 192.168.11.130 |
| 角色 | 扫描器 / 攻击者 | 被扫描者 / 防御者 |
## 工作原理
扫描器接收一个目标 IP 和端口范围(1–1024),通过向上取整除法将该范围平均分配给 **10 个工作线程**,每个线程在其分配到的数据块中对每个端口调用 `socket.connect_ex()`(超时时间 0.5 秒)。返回的非阻塞退出码 `0` 表示该端口是开放的。
由于端口扫描属于 I/O 密集型任务——大部分时间都耗在等待网络响应上,而非计算——因此多线程能带来近乎线性的加速效果:
| 扫描方式 | 最坏情况耗时(1–1024 个端口) | 速度提升 | 被检测风险 |
|---|---|---|---|
| 串行(1 个线程) | ~512 秒 | 1×(基准) | 低(速度慢) |
| 10 线程(本项目) | ~51.5 秒 | ~10× | 高(速度快) |
| 50 线程 | ~10.3 秒 | ~50× | 极高 |
## 线程安全:互斥锁与竞态条件
所有 10 个线程都会将发现的开放端口追加到同一个共享列表中。如果不加锁,两个线程可能会在读取列表长度时发生竞态并相互覆盖对方的记录——从而悄无声息地丢失一个已发现的开放端口(即**漏报**)。在每次调用 `results.append()` 前后使用 `threading.Lock()` 可以串行化这些写操作,以可忽略不计的性能代价消除了竞态(由于开放端口很少见,因此锁争用极小)。
```
with lock:
results.append(port)
```
有关竞态条件的发生过程以及互斥锁如何防止该问题的完整逐步追踪,请参阅 [`Project_Report.pdf`](./Project_Report.pdf) 第 4 节。
## 演示:阶段 1 — 检测
一条 `iptables` 规则会记录来自攻击者 IP、作用于 1–1024 端口的每一个入站 SYN 数据包:

运行扫描器会找到开放的 HTTP 端口,内核日志通过其高频、连续、纯 SYN 的特征模式捕捉到了这次扫描:


## 演示:阶段 2 — 阻断
一个包含两条规则的 `recent` 模块链会在攻击者在 60 秒内超过 10 次 SYN 尝试后,自动丢弃数据包:

针对强化后的目标重新运行扫描器没有返回任何结果——每个数据包在到达任何服务之前都被静默丢弃了:

数据包计数器证实 DROP 规则正在积极匹配并丢弃流量:

## 规避技术(详见报告)
- **低速缓慢扫描** — 在探测之间加入随机延迟,以保持在速率限制阈值之下
- **诱饵扫描** (`nmap -D`) — 伪造源 IP 以混淆归属
- **源 IP 轮换** — 使用 VPN/Tor/僵尸网络以规避基于单个 IP 的速率限制
- **分片数据包** — 将 SYN 数据包拆分以绕过无状态过滤器
- **非 SYN 探测** (FIN/NULL/XMAS) — 绕过仅针对 SYN 的 LOG 规则
## iptables 作为独立防御手段的局限性
- 没有 Layer 7(应用层)的可见性
- 容易受到低于速率阈值的低速缓慢扫描的影响
- 缺乏跨多个时间窗口的关联能力(无记忆性)
- 极易被 IP 轮换/伪造绕过
- 容易受到日志泛洪 / 磁盘耗尽攻击的影响
完整讨论请见 [`Project_Report.pdf`](./Project_Report.pdf) 第 3.3 节。
## 运行说明
需要 Python 3 —— 无需外部依赖,仅使用标准库。
1. 编辑 `scanner.py` 顶部的配置常量以设置你的目标:
TARGET_IP = "192.168.11.130"
START_PORT = 1
END_PORT = 1024
NUM_THREADS = 10
TIMEOUT = 0.5
2. 运行程序:
python3 scanner.py
## 项目结构
```
.
├── scanner.py # Multi-threaded port scanner (mutex-protected)
├── Assignment_3_Report.pdf # Full report: architecture, evasion, defense, race-condition analysis
├── images/ # Screenshots from the lab demo
└── README.md
```
## 作者
Muhammad Moeen
标签:iptables, Python, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 防火墙绕过, 隐私保护