jtprogru/asphyxia
GitHub: jtprogru/asphyxia
Asphyxia 是一款 Rust 编写的快速并行网络扫描器,提供主机发现、TCP/UDP 端口扫描和 SYN 隐蔽扫描功能,支持多种机器可读输出格式与断点续扫。
Stars: 0 | Forks: 0
# Asphyxia
[](https://github.com/jtprogru/asphyxia/actions/workflows/ci.yml)
[](https://github.com/jtprogru/asphyxia/actions/workflows/rust-release.yml)
[](https://crates.io/crates/asphyxia)
[](https://docs.rs/asphyxia)
[](https://crates.io/crates/asphyxia)
[](https://www.rust-lang.org)
[](LICENSE)
一个使用 Rust 编写的快速且高效的网络扫描器。
## 描述
Asphyxia 是一个命令行网络扫描器,可帮助您发现主机上的开放端口,并查找网络中可达的主机。它通过并行扫描来提高速度,并在工作过程中显示实时进度。
## 功能
- **端口扫描** — 扫描目标主机上的端口范围、特定的逗号分隔列表、整个端口范围 (`--all-ports`)、N 个最常见端口 (`--top-ports`) 或命名端口集 (`--ports web`)。
- **地址扫描** — 检查单个 IP、扫描 IP 范围或扫描整个子网 (CIDR)。
- **链式扫描** — 通过 `--stdin` 将地址扫描发现的主机直接通过管道传递给端口扫描,将主机发现和端口扫描转变为一个单一的 pipeline。
- **IPv4 和 IPv6** — 每种扫描模式均接受这两种地址族。
- **可配置超时** — 使用 `--timeout` 调整单次连接超时时间。
- **并行执行** — 通过 [rayon](https://crates.io/crates/rayon) 并发运行扫描,针对大型子网扫描提供可调的并发度 (`--concurrency`)。
- **实时进度条** — 长时间运行的扫描会显示实时进度。
- **彩色输出** — 易读的彩色终端输出。
- **机器可读输出** — 使用 `--output` 将结果输出为 JSON、JSON Lines、CSV 或可使用 grep 搜索的文本,并使用 `--output-file` 直接将其写入文件,以便通过管道传递给其他工具。
- **目标来源** — 扫描单个主机、使用 `--stdin` 通过管道传入目标,或使用 `-i/--target-file` 从文件中读取目标;支持主机、IP 和 CIDR,并且会展开文件中的 CIDR。
- **配置文件** — 在 `~/.asphyxia.toml` 中设置默认值(超时、并发、重试、输出格式);命令行参数可覆盖配置。
- **可恢复扫描** — 使用 `--resume ` 为长时间运行的端口扫描设置检查点,并在按下 Ctrl-C、崩溃或断开连接后从中断处继续执行。
- **SYN/隐蔽扫描** — 使用 `--syn` 通过 raw sockets 进行半开 SYN 扫描(仅限 IPv4,需要权限),并自动回退到 connect 扫描。
## 安装
### Homebrew (macOS & Linux)
```
brew tap jtprogru/tap
brew install jtprogru/tap/asphyxia
```
该 formula 会在每次发布时自动发布到 [jtprogru/homebrew-tap](https://github.com/jtprogru/homebrew-tap) tap,并支持 macOS (Apple Silicon) 和 Linux (x86_64 & arm64)。
### Cargo
从 [crates.io](https://crates.io/crates/asphyxia) 安装最新发布的版本:
```
cargo install asphyxia
```
或者直接从仓库安装当前的 `main` 分支:
```
cargo install --git https://github.com/jtprogru/asphyxia
```
### 预编译二进制文件
从[最新发布版本](https://github.com/jtprogru/asphyxia/releases/latest)下载适用于您平台的压缩包,解压后将 `asphyxia` 二进制文件放置在您的 `PATH` 路径下。提供的编译版本包括:
- Linux: `x86_64`, `aarch64`
- macOS: `aarch64` (Apple Silicon)
每个压缩包都附带了分离的 GPG 签名 (`.asc`)。导入签名密钥后,您可以使用以下命令验证压缩包:
```
gpg --verify asphyxia-.zip.asc asphyxia-.zip
```
### 从源码构建
需要 Rust 1.88 或更高版本(本项目使用 2024 edition)。
```
git clone https://github.com/jtprogru/asphyxia.git
cd asphyxia
cargo build --release
```
编译后的二进制文件将位于 `target/release/asphyxia`。
## 用法
Asphyxia 提供了两个子命令:`ps` (端口扫描) 和 `as` (地址扫描)。
```
asphyxia --help # general help
asphyxia ps --help # port scan options
asphyxia as --help # address scan options
```
### 端口扫描 (`ps`)
```
# 扫描一个端口范围 (起始 结束)
asphyxia ps -t example.com -r 80 443
# 扫描特定端口 (逗号分隔)
asphyxia ps -t example.com -s 22,80,443,8080
# 扫描所有端口 (1-65535)
asphyxia ps -t example.com --all-ports
# 扫描前 N 个最常见的 TCP 端口 (按频率排序,无手动列表)
asphyxia ps -t example.com --top-ports 100
asphyxia ps -t example.com --top-ports 1000
# 扫描 UDP 端口而不是 TCP (DNS, NTP, SNMP, …)
asphyxia ps -t example.com -s 53,123,161 --udp
# 通过 raw sockets 进行 SYN/隐身扫描 (需要 root/CAP_NET_RAW)
sudo asphyxia ps -t example.com --top-ports 1000 --syn
# 抓取 banners 并识别开放端口上的服务
asphyxia ps -t example.com -s 22,80,443 --sV
# 扫描指定的端口集合 (web, mail, db, remote, windows)
asphyxia ps -t example.com --ports web
# 从集合中丢弃特定端口,并保留已知的 CDN/WAF 目标 (仅限 80/443)
asphyxia ps -t example.com --top-ports 1000 --exclude-ports 9100,631
asphyxia ps --stdin --top-ports 1000 --exclude-cdn < hosts.txt
# 快速查找开放端口,然后将它们交给 nmap 进行深入探测
asphyxia ps -t scanme.nmap.org --top-ports 100 --nmap
asphyxia ps -t scanme.nmap.org --top-ports 100 --nmap --nmap-args "-A -T4"
# 使用较短的超时时间扫描 IPv6 主机
asphyxia ps -t 2001:db8::1 -s 22,80,443 --timeout 500
# 从 stdin 读取目标而不是 -t (每行一个主机,或来自 `as` 的 JSON/JSONL)
asphyxia ps --stdin -s 22,80,443 < hosts.txt
# 从文件读取目标 (主机、IP 或 CIDR;CIDR 会被展开)
asphyxia ps -i targets.txt --top-ports 100
```
必须且只能指定一个目标来源 — `-t/--host`、`--stdin` 或 `-i/--target-file` — 它们之间是互斥的。同样,`-r`、`-s`、`--all-ports`、`--top-ports` 和 `--ports` 也是互斥的。
| 参数 | 描述 |
|------|-------------|
| `-t, --host ` | 目标主机(主机名、IPv4 或 IPv6) |
| `--stdin` | 从 stdin 读取目标而不是使用 `-t`:每行一个主机,或是 `asphyxia as -o` 输出的 JSON/JSONL 格式(使用 `ip` 字段) |
| `-i, --target-file ` (`--iL`) | 从文件读取目标:主机、IP、CIDR(会被展开),或 `as` 的 JSON/JSONL,每行一个 |
| `-r, --range ` | 扫描包含边界在内的端口范围 |
| `-s, --specific ` | 扫描指定的逗号分隔端口 |
| `-a, --all-ports` | 扫描整个端口范围 (1-65535) |
| `-u, --udp` | 扫描 UDP 端口而不是 TCP(结果为 `open` 或 `open\|filtered`) |
| `--syn` | 通过 raw sockets 进行 SYN/隐蔽扫描(IPv4;需要 root/`CAP_NET_RAW` 权限,否则回退到 connect 扫描) |
| `--sV` (`--banner`) | 抓取 banner 并识别每个开放 TCP 端口上的服务 |
| `--resume ` | 将进度检查点到文件,如果文件已存在则从中恢复 |
| `--top-ports ` | 扫描 `N` 个最常见的 TCP 端口(按频率排序,最多 1000 个) |
| `--ports ` | 扫描指定的命名端口集:`web`、`mail`、`db`、`remote`、`windows` |
| `--exclude-ports ` | 从扫描集中移除这些逗号分隔的端口 |
| `--exclude-cdn` | 对于已知的 CDN/WAF 目标,仅扫描 80 和 443 端口,而不是扫描全部端口 |
| `--nmap` | 扫描完成后,对每个主机的开放端口运行 nmap 进行深度检测 |
| `--nmap-args ` | 自定义 nmap 参数(替换默认的 `-sV -sC`);隐含 `--nmap` |
| `--timeout ` | 单次连接的超时时间,单位为毫秒(默认:2000) |
| `-c, --concurrency ` | 最大并发连接尝试数(默认:256) |
| `--retries ` | 无响应/超时时的额外重试次数(默认:0);被拒绝的端口绝不重试 |
| `--rate ` | 限制整个扫描过程中每秒的连接尝试次数(0 或未设置:无限制) |
| `-T, --timing <0-5>` | 从 `0`(偏执)到 `5`(疯狂)的时序模板,预设 timeout/concurrency/retries/rate |
| `-o, --output ` | 输出格式:`text`(默认)、`json`、`jsonl`、`csv` 或 `grep` |
| `--output-file ` (`--oF`) | 将机器可读的输出写入文件而不是 stdout |
#### UDP 扫描 (`--udp`)
传递 `-u`/`--udp` 以探测 UDP 端口而不是 TCP。UDP 没有握手过程,因此结果本质上不如 TCP 确定性强,并使用两种状态:
- **`open`** — 端口返回了回复。对于少数知名端口,asphyxia 会发送特定协议的探测(53 端口的 DNS 查询,123 端口的 NTP 客户端请求)以诱导回复,从而将原本的猜测变为确定的 `open`。
- **`open|filtered`** — 端口在超时时间内保持沉默。数据报可能已被丢弃,服务可能不响应此特定探测,或者防火墙可能正在对其进行过滤 — 如果没有提升权限,这些情况是无法区分的。
回复 ICMP port-unreachable 的端口即为 **关闭**,并且不会被报告(就像关闭的 TCP 端口一样)。在机器可读输出中,`proto` 字段为 `"udp"`,而 `status` 为 `"open"` 或 `"open|filtered"`。由于静默端口会等待至完整的 `--timeout` 时间结束,对多个端口进行 UDP 扫描比 TCP 扫描慢 — 请缩小端口范围(例如 `-s 53,123,161,500` 或 `--top-ports`),并在丢包严重的网络环境下考虑使用 `--retries 1`。
```
asphyxia ps -t 192.168.1.1 -s 53,123,161 --udp
asphyxia ps -t 192.168.1.1 -s 53,123,161 --udp -o jsonl
# {"ip":"192.168.1.1","port":53,"proto":"udp","latency_ms":4,"status":"open"}
```
#### 服务与版本检测 (`--sV`)
添加 `--sV`(别名 `--banner`)以识别每个开放 TCP 端口上监听的内容。对于每个开放的端口,asphyxia 都会抓取一小段 banner — 读取服务在连接时通报的内容(SSH、SMTP、FTP),并使用最小的 HTTP 请求去轻触安静的服务 — 然后将其与一组内置的精简签名(SSH、HTTP、SMTP、FTP、POP3/IMAP、MySQL、Redis 等)进行匹配。当无法匹配任何 banner 时,它会回退到该端口对应知名服务的名称。
这是一个轻量级的识别器,而不是完整的 nmap-service-probes 数据库 — 如需详尽检测,请将其与 `--nmap` 结合使用。在机器可读输出中,`service` 和 `banner` 字段会被添加到每条记录中(未发现任何内容时则省略);在文本输出中,它们会显示在端口旁边。
```
asphyxia ps -t example.com -s 22,80,443 --sV
asphyxia ps -t example.com --top-ports 100 --sV -o jsonl
# {"ip":"93.184.216.34","port":22,"proto":"tcp","latency_ms":7,"status":"open","service":"ssh","banner":"SSH-2.0-OpenSSH_9.6"}
```
#### SYN / 隐蔽扫描 (`--syn`)
`--syn` 通过 raw sockets 执行半开 SYN 扫描:它发送单个 TCP SYN 且从不完成握手 — SYN/ACK 表示开放,RST 表示关闭,静默表示被过滤。这比默认的 connect 扫描更快、更隐蔽,但代价是需要提升的权限。
```
sudo asphyxia ps -t scanme.nmap.org --top-ports 1000 --syn
```
详细说明与限制:
- **权限** — 伪造 raw packets 需要 root 或 `CAP_NET_RAW` 权限。如果没有这些权限,asphyxia 会打印提示并自动回退到 connect 扫描,因此命令仍然可以在无权限下运行(只是无法做到隐蔽)。
- **仅限 IPv4** — IPv6 目标始终使用 connect 扫描。
- **正确性回退** — 如果 SYN 探测将端口报告为*已过滤* (无回复),系统会使用 connect 探测对其进行重新检查,因此如果回复丢失,也不会遗漏开放的端口。明确的 SYN 开放/关闭结果将被直接采用。
- `--syn` 和 `--udp` 是互斥的。
#### 恢复长时间扫描 (`--resume`)
一项庞大的端口扫描任务 — 多个主机 × `--all-ports` — 可能会运行很长时间,如果因为 Ctrl-C、断开连接或崩溃而丢失进度,就意味着必须从头开始。`--resume ` 会在扫描运行期间将进度检查点到状态文件中。使用相同文件重新运行完全相同的命令,它就会从中断的地方接着执行,跳过已完成的 `(host, port)` 任务并保留已找到的结果。
```
# 启动一个长时间扫描,并将进度 checkpoint 到 scan.state
asphyxia ps -iL targets.txt --all-ports --resume scan.state
# 中断它 (Ctrl-C) —— state 文件会在退出时刷新 —— 然后恢复:
asphyxia ps -iL targets.txt --all-ports --resume scan.state
```
状态文件是以原子方式写入的(临时文件 + 重命名),因此写入过程中的中断不会损坏它,并且在恢复时会对其进行验证:只有在协议、目标和端口与命令匹配时才会继续执行,因此将 `--resume` 指向来自不同扫描的文件会安全地重新开始,而不会产生虚假结果。
### 地址扫描 (`as`)
```
# 以 CIDR 表示法扫描子网 (IPv4 或 IPv6)
asphyxia as -s 192.168.1.0/24
asphyxia as -s 2001:db8::/120
# 扫描单个 IP 地址 (IPv4 或 IPv6)
asphyxia as -t 192.168.1.1
asphyxia as -t 2001:db8::1
# 扫描一个 IP 地址范围 (起始 结束)
asphyxia as -r 192.168.1.1 192.168.1.20
# 使用自定义超时扫描子网
asphyxia as -s 192.168.1.0/24 --timeout 300
# 跳过主机发现并将所有地址视为在线 (类似 nmap -Pn)
asphyxia as -s 192.168.1.0/24 --Pn -o jsonl | asphyxia ps --stdin --top-ports 100
# 从子网扫描中排除主机/CIDR (内联和/或来自文件)
asphyxia as -s 192.168.1.0/24 --exclude 192.168.1.0/28 --exclude 192.168.1.100
asphyxia as -s 10.0.0.0/22 --exclude-file skip.txt
```
| 参数 | 描述 |
|------|-------------|
| `-s, --subnet ` | 扫描子网,例如 `192.168.1.0/24` 或 `2001:db8::/120` |
| `-t, --target ` | 扫描单个 IPv4 或 IPv6 地址 |
| `-r, --range ` | 扫描包含边界在内的 IP 范围(起始和结束必须属于相同的地址族) |
| `--Pn` (`--skip-discovery`) | 跳过主机发现,将每个目标视为在线(类似于 nmap `-Pn`) |
| `--exclude ` | 从扫描中排除主机/CIDR(可重复使用每个值可用逗号分隔) |
| `--exclude-file ` | 排除文件中列出的主机/CIDR(每行一个;允许使用 `#` 进行注释) |
| `--timeout ` | 单次连接的超时时间,单位为毫秒(默认:2000) |
| `-c, --concurrency ` | 最大并发连接尝试数(默认:256) |
| `--retries ` | 无响应/超时时的额外重试次数(默认:0);被拒绝的端口绝不重试 |
| `--rate ` | 限制整个扫描过程中每秒的连接尝试次数(0 或未设置:无限制) |
| `-T, --timing <0-5>` | 从 `0`(偏执)到 `5`(疯狂)的时序模板,预设 timeout/concurrency/retries/rate |
| `-o, --output ` | 输出格式:`text`(默认)、`json`、`jsonl`、`csv` 或 `grep` |
| `--output-file ` (`--oF`) | 将机器可读的输出写入文件而不是 stdout |
### 机器可读输出 (`--output`)
默认情况下,Asphyxia 会打印彩色、易于阅读的报告。传递 `--output`(别名 `-o`)并指定 `json`、`jsonl`、`csv` 或 `grep` 之一,即可输出结构化结果 — 例如用于填充网络拓扑图、电子表格、工单或下游工具。每个结果都是一个独立的记录,包含 `ip`、`port`(地址扫描时省略/留空)、`proto`、`latency_ms` 和 `status` 字段。
```
# 每个开放端口对应一个 JSON 对象,单独占一行 (JSON Lines)
asphyxia ps -t example.com -s 22,80,443 -o jsonl
# {"ip":"93.184.216.34","port":80,"proto":"tcp","latency_ms":12,"status":"open"}
# 包含可用主机的单个 JSON array
asphyxia as -s 192.168.1.0/24 -o json
# 带标题行的 CSV (ip,port,proto,status,latency_ms)
asphyxia ps -t example.com --top-ports 100 -o csv
# 适用于 grep/awk/cut 的 Greppable 制表符分隔列
asphyxia ps -t example.com -s 22,80,443 -o grep
```
记录会写入 stdout;进度条和任何错误信息都会输出到 stderr,因此读取 stdout 的消费者只会看到数据流。对于 `json`,空结果为 `[]`;对于 `csv`,只有一行表头;对于 `jsonl`/`grep` 则没有任何输出。可以直接通过管道传递给 `jq`:
```
asphyxia ps -t example.com -r 1 1024 -o jsonl 2>/dev/null | jq -c 'select(.port == 443)'
```
使用 `--output-file `(别名 `--oF`)将机器可读的输出写入文件而不是 stdout — 这对于在终端上仍想查看进度条的同时保存扫描结果非常有用:
```
asphyxia ps -t example.com --top-ports 1000 -o csv --output-file scan.csv
```
### 将发现链接到端口扫描 (`--stdin`)
`asphyxia ps --stdin` 会从标准输入读取目标,因此地址扫描发现的主机可以直接流入端口扫描。输入格式会逐行自动检测:如果是 JSON 对象或数组,会将其 `ip` 字段作为目标(因此 `as` 的 `-o json`/`-o jsonl` 输出可以直接使用),而任何其他非空行都会被视为单纯的主机或 IP(因此普通的 `hosts.txt` 也可以使用)。空行会被跳过,重复的目标只会被扫描一次。
```
# 发现子网上的存活主机,然后扫描它们的常见端口
asphyxia as -s 192.168.1.0/24 -o jsonl 2>/dev/null \
| asphyxia ps --stdin -s 22,80,443 -o jsonl
# 同上,但扫描每个已发现主机的所有端口
asphyxia as -s 192.168.1.0/24 -o jsonl 2>/dev/null \
| asphyxia ps --stdin --all-ports -o jsonl
# 提供手动编写的主机列表
asphyxia ps --stdin -s 22,80,443 < hosts.txt
```
### 移交 Nmap (`--nmap`)
Asphyxia 能快速找到开放的端口;而 nmap 能对其进行详尽的探测。`--nmap` 在两者之间架起了桥梁:在扫描完成后,它会按主机对开放端口进行分组,并在每台主机上运行 `nmap`,从而将经典的“快速扫描,随后深度检测”工作流整合为一个命令。
```
# 快速端口扫描,然后在开放端口上执行 nmap 服务/版本检测 + 默认脚本
asphyxia ps -t scanme.nmap.org --top-ports 100 --nmap
# 传递你自己的 nmap flags (它们将替换默认的 -sV -sC);ports/target 仍由 asphyxia 控制
asphyxia ps -t scanme.nmap.org --top-ports 100 --nmap --nmap-args "-A -T4"
```
默认情况下,asphyxia 会运行 `nmap -sV -sC -p `。使用 `--nmap-args` 时,您的参数会替换 `-sV -sC`,而 asphyxia 仍会提供 `-p ` 和目标地址。如果您的 `PATH` 中没有 nmap,asphyxia 会打印安装提示,而不会进行深度检测。Nmap 的输出会直接流式传输到终端,因此请将 `--nmap` 与人类可读的 (`text`) 输出结合使用,而不是使用机器可读格式。
## 配置文件 (`~/.asphyxia.toml`)
对于重复的运行,您可以在 `~/.asphyxia.toml` 中设置默认值,而无需重新输入相同的参数。每个键都是可选的;任何省略的键都会保留其内置默认值。命令行参数始终覆盖配置。
```
# ~/.asphyxia.toml
timeout = 500 # per-connection timeout in ms
concurrency = 512 # max concurrent connection attempts
retries = 1 # extra retries per probe on no answer
rate = 2000 # cap probes per second (0 or omitted = no cap)
output = "jsonl" # default output format: text | json | jsonl | csv | grep
```
使用该配置后,`asphyxia ps -t example.com --top-ports 100` 将以 500 毫秒超时、512 路并发、重试一次以及 JSONL 输出运行 — 而 `asphyxia ps -t example.com --top-ports 100 -o text --timeout 2000` 会覆盖该次运行的格式和超时时间。将 `ASPHYXIA_CONFIG` 指向不同的路径即可使用备用文件。无效的配置会在 stderr 中报告,随后被忽略,而不是中止扫描。
## 示例
基于上述功能构建的真实工作流实用指南。每个代码块都可以直接复制粘贴使用。
### 单条命令快速侦察
```
# 扫描前 1000 个端口,识别服务,并以适中的速度保存到文件
asphyxia ps -t scanme.nmap.org --top-ports 1000 --sV -o jsonl --output-file scan.jsonl -T3
```
### 无需手动列表选择端口
```
# 前 N 个最常见的 TCP 端口 (按频率排序)
asphyxia ps -t example.com --top-ports 100
# 指定的端口集合:web | mail | db | remote | windows
asphyxia ps -t example.com --ports web # 80,443,8080,8443,8000,8008,8888
asphyxia ps -t example.com --ports db # 1433,1521,3306,5432,6379,9042,11211,27017
# 前 1000 个,减去几个你永远不需要关心的端口
asphyxia ps -t example.com --top-ports 1000 --exclude-ports 9100,631
```
### 输出格式与文件
```
# 带标题行的 CSV,直接写入文件
asphyxia ps -t example.com --top-ports 100 -o csv --output-file ports.csv
# 适用于 awk/cut 的 Greppable 制表符分隔列
asphyxia ps -t example.com -s 22,80,443 -o grep | awk -F'\t' '$4=="open"{print $1":"$2}'
# JSON Lines 通过管道传入 jq (进度条和错误在 stderr 上)
asphyxia ps -t example.com -r 1 1024 -o jsonl 2>/dev/null | jq -c 'select(.port == 443)'
```
### 服务与版本检测 (`--sV`)
```
asphyxia ps -t example.com -s 22,80,443 --sV
# 93.184.216.34:22 ssh [SSH-2.0-OpenSSH_9.6]
asphyxia ps -t example.com --top-ports 100 --sV -o jsonl
# {"ip":"...","port":22,"proto":"tcp","status":"open","service":"ssh","banner":"SSH-2.0-OpenSSH_9.6"}
```
### UDP 扫描 (DNS, NTP, SNMP)
```
# 状态为 open 或 open|filtered;机器输出中的 proto 字段为 "udp"
asphyxia ps -t 192.168.1.1 -s 53,123,161 --udp
```
### 主机发现通过管道传递给端口扫描
```
# 查找子网上的存活主机,然后扫描每个主机的常见端口
asphyxia as -s 192.168.1.0/24 -o jsonl 2>/dev/null | asphyxia ps --stdin --top-ports 100
# 完全跳过主机发现 (类似 nmap -Pn) 并排除一个范围,然后扫描 web 端口
asphyxia as -s 192.168.1.0/24 --Pn --exclude 192.168.1.0/28 -o jsonl 2>/dev/null \
| asphyxia ps --stdin --ports web
```
### 从文件批量运行,包含排除项与配置
```
# targets.txt 包含主机、IP 和 CIDR (CIDR 会被展开);保留 CDN/WAF 主机
asphyxia ps -i targets.txt --top-ports 1000 --exclude-cdn --retries 1 -o csv --output-file out.csv
```
在 `~/.asphyxia.toml` 中设置一次默认值(参见[配置文件](#configuration-file-asphyxiatoml)),使命令行保持简短 — 任何参数仍会覆盖配置。
### 控制节奏
```
# 无论并发情况如何,将整个扫描速率限制在约 1000 次尝试/秒
asphyxia ps -t example.com --all-ports --rate 1000
# 使用激进的 timing profile (0 paranoid .. 5 insane)
asphyxia ps -t example.com --top-ports 1000 -T4
# 一个 profile,但使用你自己的 timeout 覆盖预设值
asphyxia ps -t example.com --top-ports 1000 -T4 --timeout 800
```
### 恢复长时间扫描
```
# 开始运行;在 Ctrl-C (或崩溃) 时会刷新 state。重新运行相同的命令以继续。
asphyxia ps -i targets.txt --all-ports --resume scan.state
```
### SYN/隐蔽扫描与 nmap 移交
```
# 半开 SYN 扫描 (需要 root/CAP_NET_RAW;如果没有则回退到 connect)
sudo asphyxia ps -t scanme.nmap.org --top-ports 1000 --syn
# 快速查找开放端口,然后将它们交给 nmap 进行深入探测
asphyxia ps -t scanme.nmap.org --top-ports 100 --nmap --nmap-args "-A -T4"
```
### 整合在一起:完整的子网扫描
```
asphyxia as -s 10.0.0.0/24 --Pn -o jsonl 2>/dev/null \
| asphyxia ps --stdin --top-ports 1000 --sV --exclude-cdn \
--rate 3000 --resume subnet.state -o jsonl --output-file subnet-scan.jsonl
```
## 性能
扫描主要受限于网络 I/O — 大部分时间都花在等待 TCP 握手和超时上,而不是消耗 CPU。因此,Asphyxia 运行的并发探测数量远远超过 CPU 核心数(默认为 256),这样无响应的地址(会一直阻塞直到达到完整的 `--timeout`)就不会拖延其余的扫描。
调整扫描的方法:
- **`--concurrency`** — 提高此值可以更快地完成大型子网扫描(例如对 `/22` 网段使用 `--concurrency 512`);如果想要更温和的扫描,可以降低此值。最大限制为 1024。
- **`--timeout`** — 在响应迅速的局域网 (LAN) 中,较短的超时时间(例如 `--timeout 500`)会让不可达主机更快地放弃。
- **`--retries`** — 在丢包严重的网络中(Wi-Fi、VPN、远程主机),丢失的 SYN 会让开放的端口或活跃的主机看起来像是关闭/下线的。像 `--retries 1` 或 `--retries 2` 这样的小值只会在探测*未收到回复*(超时/不可达)时重新探测;主动拒绝连接的端口实际上已经做出了响应,因此绝不重试,这样可以保持对已关闭端口的扫描速度。
- **`--rate`** — 限制整个扫描过程中每秒的连接尝试次数(例如 `--rate 1000`)。无论 `--concurrency` 设置如何,这都会限制扫描对网络的冲击程度:单一的全局步调调节器每 `1/rate` 秒只允许一个探测通过,因此高度并发的扫描仍能保持在限制范围内。留空则表示无限制。
- **`-T0`..`-T5`** — 可以一次性预设 `--timeout`、`--concurrency`、`--retries` 和 `--rate` 的时序模板,从 `-T0`(偏执:串行且缓慢)到 `-T3`(正常默认值)再到 `-T5`(疯狂:最快,最宽的并发,无限制)。任何单独的参数仍会覆盖模板设置,例如 `-T4 --timeout 800`。
例如,使用默认设置的 `/24` 网段大约在一个超时时间窗口内即可完成扫描,而无需串行遍历每个地址。
## 依赖项
- [clap](https://crates.io/crates/clap) — 命令行参数解析
- [rayon](https://crates.io/crates/rayon) — 并行计算
- [indicatif](https://crates.io/crates/indicatif) — 进度条与加载指示器
- [owo-colors](https://crates.io/crates/owo-colors) — 终端颜色
- [ipnetwork](https://crates.io/crates/ipnetwork) — IP 网络地址处理
## 开发
```
cargo fmt --all # format
cargo clippy --all-targets -- -D warnings # lint
cargo test # run unit and doc tests
```
CI 会在每次发起 pull request 和推送到 `main` 分支时运行代码格式化、Clippy(禁止警告)、构建和测试。
## 许可证
本项目基于 [MIT 许可证](LICENSE) 授权。
## 贡献
欢迎您的贡献!在提交更改之前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 以了解如何设置您的环境、编码规范以及 pull-request 流程。
标签:Facebook API, Python安全, Rust, 云存储安全, 可视化界面, 插件系统, 数据统计, 端口扫描, 网络扫描, 网络流量审计, 通知系统