1 #绝大多数成功的网络攻击都是以端口扫描开始的,在网络安全和黑客领域,端口扫描是经常用到的技术,可以探测指定主机上是否 2 #开放了指定端口,进一步判断主机是否运行了某些重要的网络服务,最终判断是否存在潜在的安全漏洞,从一定意义上将也属于系统运维的范畴 3 4 #端口扫描器程序:模拟端口扫描器的工作原理,并采用多进程技术提高扫描速度 5 import socket 6 import sys 7 import multiprocessing 8 9 def ports(ports_serve): 10 #获取常用端口对应的服务名称 11 for port in list(range(1,100))+[143,145,113,443,445,3389,8080]: 12 try: 13 ports_serve[port]=socket.getservbyport(port) 14 except socket.error: 15 pass 16 17 def ports_scan(host,ports_service): 18 ports_open=[] 19 try: 20 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 21 #超时时间的不同会影响扫描结果的精确度 22 socket.timeout(0.01) 23 except socket.error: 24 print('socket creation error') 25 sys.exit() 26 for port in ports_service: 27 try: 28 #尝试连接指定端口 29 sock.connect((host,port)) 30 #记录打开的端口 31 ports_open.append(port) 32 sock.close() 33 except socket.error: 34 pass 35 return ports_open 36 37 if __name__ == '__main__': 38 m=multiprocessing.Manager() 39 ports_service=dict() 40 results=dict() 41 ports(ports_service) 42 #创建进程池,允许最多8个进程同时运行 43 pool = multiprocessing.Pool(processes=8) 44 net = '10.2.1.' 45 for host_number in map(str,range(8,10)): 46 host = net + host_number 47 #创建一个新进程,同时记录其运行结果 48 results[host] = pool.apply_async(ports_scan,(host,ports_service)) 49 print('starting '+host+'...') 50 #关闭进程池,close()必须在join()之前调用 51 pool.close() 52 #等待进程池中的进程全部执行结束 53 pool.join() 54 55 #打印输出结果 56 for host in results: 57 print('='*30) 58 print(host,'.'*10) 59 for port in results[host].get(): 60 print(port,':',ports_service[port]) 61 62 #Python扩展库netaddr提供了大量可以处理网络地址的类和对象,例如netaddr.valid_ipv4(addr)可以判断addr时否为合法IPv4地址 63 #netaddr.IPNetwork('10.2.1.0/24')和netaddr.IPRange('10.2.1.0','10.2.1.255')都可以用来生成包含介于10.2.1.0到10.2.1.255之间的IP地址的迭代对象。