Как узнать, сколько клиентов находится в определенном диапазоне адресов?
Я попробовал поискать в Google, но ничего не нашел... Я строю сканер портов и хотел бы сделать так, чтобы я мог сканировать диапазон сети, например, 192.168.2.* И узнать, сколько компьютеров на нем. Диапазон, которые онлайн. Очень похоже на Nmap. Я программирую на Python. Возможно ли это в Python?
4 ответа
Вот черновой пример, с которого вы можете начать:
import socket
addr_range = "192.168.1.%d"
ip_address_up = []
# Use UDP.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(2.0)
for i in range(1, 254):
try:
ip = addr_range % i
socket.gethostbyaddr(ip)
ip_address_up.append(ip)
except socket.herror as ex:
pass
print ip_address_up
или что-то вроде этого, используя ICMP ( ping), скорее спасибо UDP:
import socket
import ping
ip_address_up = []
addr_range = "192.168.1.%d"
for i in range(1, 254):
try:
ip = addr_range % i
delay = ping.do_one(ip, timeout=2)
ip_address_up.append(ip)
except (socket.herror, socket.timeout) as ex:
pass
print ip_address_up
Использование python-nmap
, Основное использование:
import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.2.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
for host, status in hosts_list:
print('{0}:{1}'.format(host, status))
Для получения дополнительной информации см. http://pypi.python.org/pypi/python-nmap
Используя необработанные сокеты, вы можете реализовать нечто похожее на nmap. Вы, вероятно, обнаружите, что наиболее информативные тесты должны быть сделаны с использованием специально созданных пакетов, которые делают "странные" вещи по сравнению с обычными интерфейсами программирования. Это стоит прочитать на RFC IP/UDP/TCP.
Используя необработанные сокеты, вы можете генерировать побайтово любой пробный пакет по вашему выбору с установленными опциями / конфигурациями, которые обычно невозможно / трудно сделать в обычных условиях, но которые "обманывают" хост в раскрытии большого количества информации.
Для IPv4 в локальной сети вы можете использовать ARP, скажем, Scapy, см. Соответствующий вопрос.