落花逐明月 2024-05-07 23:53 采纳率: 0%
浏览 8
已结题

我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能

但是受限于,现在有一些局域网内的路由他拒绝icmp或者udp响应,所以只能看到中间极个别的ip地址以及源节点和目的节点的IP地址,有没有一种思路可以逐渐探索出某个局域网的主机周围有哪些设备,最好能完整拓扑出来的,那同样如果跨vlan之后呢?是否可以同样迁移?

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-07 23:53
    关注
    获得2.40元问题酬金

    引自免费微信小程序:皆我百晓生

    要实现一个类似于Traceroute但适应更多限制条件(如ICMP或UDP响应被过滤)的网络拓扑发现工具,我们可以采取一些策略绕过这些限制,同时利用TCP、ARP或其他网络协议特性。这里提供一个基于Python的方案,结合TCP SYN扫描和ARP请求来尝试揭示局域网内的设备连接情况。跨VLAN的探测则较为复杂,通常需要路由器或交换机的支持,或者在每个VLAN中部署代理节点。

    1. 利用TCP SYN扫描

    TCP SYN扫描(半开放扫描)可以在不建立完整连接的情况下探测目标端口的状态,这在某些情况下比ICMP或UDP更不容易被过滤。我们可以使用Python的scapy库来实现这一功能。

    安装scapy:

    pip install scapy
    

    TCP SYN扫描示例代码:

    from scapy.all import IP, TCP, sr1, conf
    
    def tcp_syn_scan(target_ip, port):
        # 配置不发送ICMP错误响应
        conf.verb = 0
        conf.L3socket = conf.L3RawSocket
        
        ip_layer = IP(dst=target_ip)
        tcp_layer = TCP(dport=port, flags="S")
        packet = ip_layer/tcp_layer
    
        response = sr1(packet, timeout=2, verbose=0)
    
        if response is None:
            print(f"{target_ip}:{port} is filtered or host down.")
        elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:  # SYN/ACK received
            print(f"{target_ip}:{port} is open.")
        elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x14:  # RST/ACK received
            print(f"{target_ip}:{port} is closed.")
        else:
            print(f"Unexpected response from {target_ip}:{port}")
    
    # 扫描示例
    tcp_syn_scan('192.168.1.1', 80)
    

    2. 使用ARP请求发现局域网内主机

    ARP协议用于解析IP地址到MAC地址,我们可以通过广播ARP请求来发现局域网内的设备。注意,ARP仅限于同一子网内。

    ARP请求示例代码:

    from scapy.all import ARP, Ether, srp
    
    def arp_discovery(ip_range):
        arp = ARP(pdst=ip_range)
        ether = Ether(dst="ff:ff:ff:ff:ff:ff")
        packet = ether/arp
    
        result, unanswered = srp(packet, timeout=2, verbose=0)
    
        devices = []
        for sent, received in result:
            devices.append({'ip': received.psrc, 'mac': received.hwsrc})
    
        return devices
    
    # 发现局域网内所有主机
    devices = arp_discovery("192.168.1.0/24")
    for device in devices:
        print(f"IP: {device['ip']} MAC: {device['mac']}")
    

    3. 综合应用与拓扑构建

    结合上述方法,你可以先通过ARP发现局域网内的设备,然后对每个发现的IP地址执行TCP SYN扫描以判断其活跃状态及开放的服务。根据扫描结果,可以构建一个简单的拓扑图,记录哪些IP地址是直接相连的(基于它们在局域网内的响应)。

    跨VLAN的考虑

    跨VLAN探测需要网络设备支持,例如,配置了允许特定类型流量透传的VLAN间路由(Inter-VLAN Routing)。如果你有管理权限配置网络设备,可以设置允许探测包穿越VLAN,或者部署代理节点在每个VLAN内进行局部探测,然后汇总信息。但通常这涉及到网络管理和安全问题,需要相应权限和规划。

    注意事项

    • 上述操作可能涉及网络安全与隐私问题,请确保合法合规,并在授权的网络环境下操作。
    • 对生产网络进行此类扫描前,务必通知相关管理员,以免影响网络正常运行。
    • 考虑到网络环境多样性,上述方法可能需要根据实际情况调整。

    通过这些方法,你可以逐步探索并构建局域网内部的设备连接图,尽管受限条件下可能无法达到100%准确,但可以作为一个起点。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 创建了问题 5月7日

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路