2025-05-06 11:04:34 +02:00
# SNMP Multi-Subnet Scanner
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
## Opis
Ten skrypt w Pythonie umożliwia **skanowanie wielu podsieci IPv4** oraz pobieranie informacji SNMP (v2c) z urządzeń sieciowych, takich jak Mikrotik, Cisco itp. Obsługuje **podział dużych sieci na mniejsze** , **równoległe skanowanie wielu podsieci** , **zapis wyników do pliku CSV** oraz opcjonalny **import podsieci z pliku tekstowego** .
## Funkcje
2025-05-06 08:41:59 +02:00
2025-05-06 11:02:57 +02:00
- Obsługa wielu podsieci w formacie CIDR (z linii poleceń lub pliku)
- Wsparcie dla standardowych OID-ów (domyślnie tylko `sysName` , inne opcjonalnie)
- Możliwość podania niestandardowych OID-ów w formacie JSON
2025-05-06 11:04:34 +02:00
- Wydajne skanowanie z użyciem `ThreadPoolExecutor`
2025-05-06 11:02:57 +02:00
- Dzieli duże sieci na mniejsze (domyślnie /24)
- Obsługa timeoutów oraz pomijanie hostów bez odpowiedzi
- Eksport wyników do pliku CSV (z możliwością nazwania pliku)
2025-05-06 08:41:59 +02:00
- Czytelna tabela wyników w terminalu
2025-05-06 11:04:34 +02:00
## Wymagania
2025-05-06 08:41:59 +02:00
- Python 3.6+
2025-05-06 11:04:34 +02:00
- Zainstalowane narzędzie `snmpget` (część pakietu `net-snmp` )
**Na Debian/Ubuntu:**
```bash
sudo apt install snmp
```
## Użycie
```bash
python snmp_scan.py < subnet1 > [subnet2 subnet3 ...] [opcje]
```
### Opcje
- `-c` , `--community` – SNMP community (domyślnie: `public` )
- `-o` , `--oids` – własne OID-y w formacie JSON (np. `'{"sysDescr":"1.3.6.1.2.1.1.1.0"}'` )
- `-w` , `--workers` – liczba równoległych wątków (domyślnie: 10)
- `-p` , `--prefix` – prefiks do podziału dużych sieci (domyślnie: 24)
- `-f` , `--file` – nazwa pliku CSV do zapisu wyników (domyślnie: `wyniki.csv` )
- `-s` , `--subnet-file` – plik z listą podsieci (jedna na linię)
## Przykłady
### Skan jednej podsieci
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
```bash
2025-05-06 11:27:40 +02:00
python scan.py 172.16.0.0/24 -c public -f wynik.csv -w 10 -p 32
2025-05-06 11:04:34 +02:00
```
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
### Skan wielu podsieci z niestandardowym community
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
```bash
2025-05-06 11:24:47 +02:00
python scan.py 10.87.2.0/24 10.88.1.0/24 -c moje_community
2025-05-06 11:04:34 +02:00
```
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
### Skan dużej sieci z podziałem na /24, 20 wątków i zapisem do pliku
2025-05-06 11:02:57 +02:00
2025-05-06 11:04:34 +02:00
```bash
2025-05-06 11:24:47 +02:00
python scan.py 172.16.0.0/16 -w 20 -p 24 -f wynik.csv
2025-05-06 11:04:34 +02:00
```
2025-05-06 11:02:57 +02:00
2025-05-06 11:04:34 +02:00
### Wczytywanie listy podsieci z pliku
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
Zawartość `subnets.txt` :
2025-05-06 11:02:57 +02:00
2025-05-06 11:04:34 +02:00
```
10.0.0.0/24
192.168.100.0/24
```
2025-05-06 08:41:59 +02:00
2025-05-06 11:04:34 +02:00
Uruchomienie:
```bash
2025-05-06 11:25:53 +02:00
python scan.py -s subnets.txt -c public -f wynik.csv
2025-05-06 11:04:34 +02:00
```
## Przykładowy wynik
```
2025-05-06 11:02:57 +02:00
IP sysName sysDescr sysLocation sysContact
-----------------------------------------------------------------------------------------------
10.87.2.1 cisco-router Cisco IOS Software... Serwerownia admin@example .com
10.87.2.2 rb750 RouterOS RB750Gr3 ... Rack1 noc@firma .pl
2025-05-06 11:04:34 +02:00
```
## Dostosowanie
2025-05-06 08:41:59 +02:00
2025-05-06 11:02:57 +02:00
Aby dodać więcej OID-ów do zapytań, możesz:
2025-05-06 11:04:34 +02:00
2025-05-06 11:02:57 +02:00
- Podać je w linii poleceń:
2025-05-06 11:04:34 +02:00
```bash
-o '{"sysName":"1.3.6.1.2.1.1.5.0","sysDescr":"1.3.6.1.2.1.1.1.0"}'
```
2025-05-06 11:02:57 +02:00
- Lub zmodyfikować domyślny słownik w kodzie:
2025-05-06 11:04:34 +02:00
```python
default_oids = {
"sysName": "1.3.6.1.2.1.1.5.0",
"sysDescr": "1.3.6.1.2.1.1.1.0",
...
}
```
## Licencja
2025-05-06 11:25:53 +02:00
Autor Mateusz Gruszczyński @linuxiarz .pl (https://www.linuxiarz.pl)
Projekt open-source przeznaczony do użytku wewnętrznego lub edukacyjnego.
Dalsza dystrybucja zgodna z zasadami Twojej organizacji.