使用 Python 和 Nmap 构建一个可视化的网络拓扑图
首先需要安装 Python-nmap 和 pydotplus 这两个库。然后可以使用下面的代码实现:
import nmap import pydotplus from collections import defaultdict # 创建一个默认字典用于存储设备和端口信息 device_ports = defaultdict(list) # 扫描网络中的所有设备和端口信息 nm = nmap.PortScanner() nm.scan(hosts='192.168.1.0/24', arguments='-v -sS') # 遍历扫描结果,并将设备和端口信息存储到字典中 for host in nm.all_hosts(): device_ports[host] = [] for proto in nm[host].all_protocols(): lport = nm[host][proto].keys() for port in lport: device_ports[host].append(port) # 创建一个图形对象 graph = pydotplus.graphviz.Graph(graph_name="Network Topology") # 遍历设备和端口信息,创建节点和边 for device, ports in device_ports.items(): device_node = pydotplus.graphviz.Node(device, shape="box") graph.add_node(device_node) for port in ports: port_node = pydotplus.graphviz.Node("Port " + str(port)) graph.add_node(port_node) graph.add_edge(pydotplus.graphviz.Edge(device_node, port_node)) # 将图形对象保存为图片或 PDF 文件 graph.write_pdf("network_topology.pdf")
这个代码可以扫描本地网络中的所有设备和端口,然后将它们的关系可视化为图形。你可以用自己的 IP 地址范围来代替 192.168.1.0/24
,或者使用一个域名。
我们还可以通过添加一些样式来使图形看起来更美观,如下所示:
# 创建一个节点样式 device_node_style = pydotplus.graphviz.NodeStyle() device_node_style.set_shape('box') device_node_style.set_color('#3f3f3f') device_node_style.set_fontsize(12) device_node_style.set_fontname('Arial') device_node_style.set_margin(0.25) device_node_style.set_padding(0.25) device_node_style.set_style('rounded') # 创建一个边样式 edge_style = pydotplus.graphviz.EdgeStyle() edge_style.set_color('#7f7f7f') # 将样式应用到图形中 graph.set_node_defaults(style=device_node_style) graph.set_edge_defaults(style=edge_style) # 将图形保存为图片或 PDF 文件 graph.write_png("network_topology.png")
这些样式将使节点看起来更加圆润,边更加细致。
相关文章