Files
2026-06-30 01:49:11 -03:00

100 lines
3.1 KiB
Markdown

# CamFinder
Scanner TCP em Rust para descobrir hosts em CIDRs internos, testar a porta `554` e salvar progresso e endpoints abertos em PostgreSQL.
O projeto tem quatro modos:
- `local`: roda o scan inteiro no processo atual.
- `coordinator`: recebe conexões de workers, distribui blocos e grava resultados no banco.
- `worker`: conecta ao coordenador, recebe blocos e testa os hosts.
- `rtsp`: lê destinos de um CSV e testa URLs RTSP com paths predefinidos.
O progresso é salvo por bloco, então o scan pode ser retomado sem repetir o que já foi concluído.
## Uso
1. Copie `.env.example` para `.env`.
2. Configure `DATABASE_URL` apontando para um Postgres acessível.
3. Rode `cargo run -- local`, `cargo run -- coordinator` ou `cargo run -- worker`.
4. Para RTSP, rode `cargo run -- rtsp --targets-file targets.csv`.
## Docker Compose
O `docker-compose.yml` já sobe:
- `postgres` para persistência.
- `coordinator` exposto no host pela porta `666`.
- `worker` conectado ao coordenador na rede interna do compose.
Para o fluxo RTSP com Redis, use `docker-compose.redis-rtsp.yml`:
- `redis` como fila. Ele publica a porta `6379`, então workers externos podem apontar `REDIS_URL` para esse host.
- `coordinator` para ler `camfinder-open-rtsp.csv` e alimentar a fila com blocos de IPs. No modo simples/local, monte o repositório inteiro em `/app`.
- `worker-1` e `worker-2` para consumir blocos, testar paths RTSP e salvar screenshots e SQLite.
Para escalar workers:
- `docker compose up --scale worker=3`
Para um worker em outra máquina, aponte `REDIS_URL` para o Redis do coordenador, por exemplo `redis://<host>:6379/0`, e use o mesmo `RTSP_QUEUE_NAME`.
Se estiver usando o compose local, monte `./:/app` para coordinator e workers RTSP. O coordinator lê `camfinder-open-rtsp.csv` e `rtsp_paths.txt` da raiz do repo.
Para workers de outras máquinas, use `vps.valmo.dev:666` como endereço do coordenador.
## Scripts
- `cargo build`
- `cargo run`
- `npm run scan`
- `npm run coord`
- `npm run worker`
## Variáveis úteis
- `DATABASE_URL`
- `SCAN_CIDRS`
- `SCAN_CIDR`
- `SCAN_CIDR_FILE`
- `SCAN_CONCURRENCY`
- `SCAN_CHUNK_SIZE`
- `SCAN_TIMEOUT_MS`
- `SCAN_MODE`
- `COORDINATOR_BIND`
- `COORDINATOR_ADDR`
- `WORKER_NAME`
- `RTSP_TARGETS`
- `RTSP_TARGETS_FILE`
- `RTSP_PATHS`
- `RTSP_PATHS_FILE`
- `REDIS_URL`
- `RTSP_QUEUE_NAME`
- `RTSP_INPUT_CSV`
- `RTSP_WORKER_COUNT`
- `RTSP_QUEUE_BLOCK_SIZE`
- `RTSP_SNAPSHOT_DIR`
- `RTSP_SQLITE_PATH`
- `RTSP_CAPTURE_TIMEOUT_MS`
## Modo RTSP
O modo `rtsp` monta URLs no formato `rtsp://<host>:554/<path>` e testa a conexão
via `DESCRIBE`, tentando primeiro sem auth e depois cruzando os usuários e
senhas padrão definidos em `main_ids.json`.
Por padrão, ele lê os paths de [rtsp_paths.txt](/home/valmo/Documents/CamFinder/rtsp_paths.txt).
Exemplo:
```bash
cargo run -- rtsp --targets-file targets.csv
```
No fluxo `docker-compose.redis-rtsp.yml`, os workers salvam os frames em
`dump/feeds/<ip>_<timestamp>.png` e gravam os resultados em
`dump/rtsp-results.sqlite`.
## Restrições
O projeto aceita somente redes privadas `10.0.0.0/8`, `172.16.0.0/12` e `192.168.0.0/16`.