IP扫描是网络管理员、安全工程师等领域中常用的一种技术手段。它可以扫描网络中存活的设备并快速获取设备的一些基本信息,如设备名称、IP地址、操作系统、开放端口等。Python是一种强大的脚本语言,可以轻松完成IP扫描任务。在本篇文章中,我们将从多个方面详细阐述Python IP扫描的相关知识。
一、IP扫描的基本原理
IP地址是网络中每个设备的唯一标识符。在进行IP扫描时,需要通过一个指定的IP地址范围来扫描该范围内所有可以连接到网络的设备,并且获取设备的一些基本信息。其中,IP地址范围的获取可以通过以下两种方式进行:
1、手动输入:通过手动输入目标IP地址范围的开始和结束地址来进行扫描。
2、自动获取:通过自动获取本地网络IP地址范围的方式来进行扫描。
在获取IP地址范围之后,需要使用扫描工具对指定范围进行扫描,从而获取设备的基本信息。其中,最常用的扫描工具是nmap。
二、Python IP扫描的实现
在Python中,可以使用Socket和Scapy等库来实现IP扫描。其中,Socket库是Python中的标准库,可以轻松实现Socket连接和数据传输等常见操作。而Scapy库是一种Python下面向数据包处理的高级库,可以处理网络中各种数据包。
1、基于Socket的IP扫描实现
import socket def port_scan(ip, port): try: s = socket.socket() s.settimeout(1) s.connect((ip, port)) print(f"Port {port} is open") except: print(f"Port {port} is closed") def ip_scan(ip): for port in range(0, 65536): port_scan(ip, port)
上述代码可以实现对指定IP地址的所有端口进行扫描,从而判断端口是否处于开放状态。其中,使用try...except语句来判断端口是否处于开放状态,如果可以连接则表明此端口是开放的。需要注意的是,在进行大规模扫描时需要将超时时间设置得更长一些,比如说10秒或更长,以防止过多连接导致的程序卡死或崩溃的问题。
2、基于Scapy的IP扫描实现
from scapy.all import sr1, IP, TCP def port_scan(ip, port): packet = IP(dst=ip) / TCP(dport=port, flags="S") response = sr1(packet, timeout=1, verbose=0) if response: if response[TCP].flags == "SA": print(f"Port {port} is open") elif response[TCP].flags == "RA": print(f"Port {port} is closed") else: print(f"Port {port} is filtered") def ip_scan(ip): for port in range(0, 65536): port_scan(ip, port)
上述代码使用Scapy库实现IP扫描,其中,构造一个IP数据包和TCP数据包,发送给目标主机,通过响应数据包的TCP标志位来判断端口是否处于开放状态,其中"S"表示SYN表示连接请求,"A"表示ACK表示连接确认,"R"表示RST表示连接重置。
三、IP扫描实例应用
1、获取局域网中存活的设备
import os def ping_sweep(network): for host in range(1, 255): ip = network + str(host) response = os.system(f"ping -n 1 -w 1000 {ip} > NUL 2>&1") if response == 0: print(f"{ip} is up") else: print(f"{ip} is down")
上述代码实现了ping扫描技术,可以快速发现当前局域网中所有在线设备。其中,os.system()函数可用于执行系统命令,并返回命令执行的结果,即命令执行完毕后的返回状态。在Windows系统中,可以使用"ping -n 1 IP地址"命令对目标IP地址进行ping测试,如果输出的返回状态码为0,则说明该IP地址处于开放状态,否则即为关闭状态。
2、扫描指定端口的状态
def port_scan(ip, port): try: s = socket.socket() s.settimeout(1) s.connect((ip, port)) print(f"[+] Port {port} is open") s.close() except: print(f"[-] Port {port} is closed") def port_check(ip): port_list = [21, 22, 23, 25, 53, 80, 110, 135, 139, 143, 161, 443, 445, 1080, 1433, 1521, 3306, 5432, 5900, 6379, 7001, 8000, 9090, 9200, 11211, 27017, 50070, 50030] for port in port_list: port_scan(ip, port)
上述代码可以扫描指定IP地址上指定端口的状态。这个例子中使用了一个端口列表来进行扫描,可以通过增加或删除端口来满足需求。
3、批量IP扫描
def batch_scan(ip_list): for ip in ip_list: print("[*] Scanning %s" %ip) ip_scan(ip)
在实际应用中,可能会需要批量扫描多个IP地址。上述代码可以通过循环遍历IP地址列表来实现IP扫描任务的批量执行。
四、总结
本文介绍了Python IP扫描的基本原理、实现方法和应用场景。IP扫描在网络安全领域中具有重要的应用价值,在实际的网络实验中,也是不可或缺的一项技能。Python作为一种简单易学的脚本语言,可以快速实现IP扫描任务,为网络工程师和网络安全专业人士提供了一种便利的技术手段。