Làm thế nào để tạo một script Python để quét mạng
Làm thế nào để tạo một script Python để quét mạng
Để tạo một script Python quét mạng, bạn có thể sử dụng hai phương pháp chính: sử dụng thư viện socket trực tiếp hoặc tận dụng công cụ nmap qua thư viện python-nmap. Dưới đây là hướng dẫn chi tiết cho cả hai cách:
1. Sử dụng thư viện socket (cơ bản)
Cài đặt thư viện
- Không cần cài đặt thêm, vì socket là thư viện tích hợp sẵn trong Python.
Script quét cổng đơn giản
import socket
import sys
from concurrent.futures import ThreadPoolExecutor
def check_port(host, port):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(1)
result = s.connect_ex((host, port))
if result == 0:
print(f"Port {port} is open")
except Exception as e:
pass
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python scanner.py
sys.exit(1)
host = sys.argv[^1]
ports = range(1, 1025) # Quét cổng từ 1 đến 1024
# Sử dụng đa luồng để tăng tốc
with ThreadPoolExecutor(max_workers=100) as executor:
for port in ports:
executor.submit(check_port, host, port)
Giải thích:
- Hàm check_port kiểm tra kết nối TCP đến một cổng cụ thể.
- Sử dụng ThreadPoolExecutor để quét nhiều cổng cùng lúc, giảm thời gian chờ.
- Kết quả trả về cổng mở nếu connect_ex trả về 0.
2. Sử dụng thư viện python-nmap (nâng cao)
Cài đặt thư viện
pip install python-nmap
Script quét mạng với nmap
import nmap
def network_scan(host, ports='1-1000'):
scanner = nmap.PortScanner()
scanner.scan(hosts=host, ports=ports, arguments='-T4') # T4: Tốc độ cao
for host in scanner.all_hosts():
print(f"Host: {host} ({scanner[host].hostname()})")
print(f"Status: {scanner[host].state()}")
for proto in scanner[host].all_protocols():
print(f"Protocol: {proto}")
ports = scanner[host][proto].keys()
for port in ports:
print(f" Port {port}: {scanner[host][proto][port]['state']}")
if __name__ == "__main__":
network_scan('192.168.1.0/24') # Quét cả mạng 192.168.1.1-254
Giải thích:
- Sử dụng nmap.PortScanner() để gọi nmap qua Python.
- Tham số arguments='-T4' tối ưu tốc độ quét.
- Kết quả trả về chi tiết trạng thái cổng (open/closed/filtered).
So sánh hai phương pháp
|
Tiêu chí |
Socket |
python-nmap |
|
Tốc độ |
Chậm hơn, phụ thuộc vào số luồng |
Nhanh nhờ tối ưu hóa từ nmap |
|
Độ chính xác |
Cơ bản, dễ bỏ sót cổng |
Cao, hỗ trợ nhiều kỹ thuật quét nmap |
|
Phức tạp |
Dễ triển khai |
Cần hiểu cú pháp nmap |
|
Ứng dụng |
Quét đơn giản, ít cổng |
Quét mạng phức tạp, phân tích sâu |
Lưu ý quan trọng
- **Chỉ quét hệ thống