使用 Python 和 Nmap 构建一个可视化的网络拓扑图

2023-04-21 00:00:00 可视化 构建一个 拓扑图

首先需要安装 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")

这些样式将使节点看起来更加圆润,边更加细致。

相关文章