Networking 将数据包从一台主机发送到另一个子网中的另一台主机

Networking 将数据包从一台主机发送到另一个子网中的另一台主机,networking,udp,scapy,Networking,Udp,Scapy,我目前正在用python进行一些发送(UDP)数据包的实践。我在这方面是相当新的,所以我一直试图从概念上理解正在发生的事情 基本上,我试图从Host1->Router->Host3发送一个数据包。根据我的研究,我需要从主机1向路由器发送一个ARP请求,以获取路由器MAC地址,然后我向路由器发送一个以太网帧。从这里开始,我在概念上迷失了方向。路由器在其IP表上查找Host2以发送消息?尽管如此,这就是我的代码目前的样子 我目前还使用mininet router.py来模拟这些主机和路由器 port

我目前正在用python进行一些发送(UDP)数据包的实践。我在这方面是相当新的,所以我一直试图从概念上理解正在发生的事情


基本上,我试图从Host1->Router->Host3发送一个数据包。根据我的研究,我需要从主机1向路由器发送一个ARP请求,以获取路由器MAC地址,然后我向路由器发送一个以太网帧。从这里开始,我在概念上迷失了方向。路由器在其IP表上查找Host2以发送消息?尽管如此,这就是我的代码目前的样子

我目前还使用mininet router.py来模拟这些主机和路由器

port = 12345


def get_ip_address(ifname):
    ni.ifaddresses(ifname)
    ip = ni.ifaddresses(ifname)[ni.AF_INET][0]['addr']
    return ip


def sendArpMesage(interfaceName, dst_ip):
    #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=dst_ip), timeout=2, iface=interfaceName, inter=0.2)

    for send, receive in ans:
        return(receive.sprintf(r"%Ether.src%"))


def get_netmask(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x891b, struct.pack('256s',ifname))[20:24])


def sendIPMessage(interfaceName, dst_ip, routerIP, message):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(("", port))

    src_addr = get_mac_address(interface=interfaceName)

    my_ip = get_ip_address(interfaceName)
    netmask = ipaddress.ip_address(dst_ip) in ipaddress.ip_network(my_ip)
    if netmask is True:  # if dst is in the same network
        arp_MAC = sendArpMesage(interfaceName, dst_ip)
    else:
        arp_MAC = sendArpMesage(interfaceName, routerIP)


    msg = message.encode('utf-8')
    packet = send(Ether(src=src_addr, dst=arp_MAC)/IP(src=my_ip, dst=dst_ip)/UDP(dport=port)/msg)
    #print(packet.show())
如果打印未提交,我将收到错误

print(packet.show())
AttributeError: 'NoneType' object has no attribute 'show'
运行
sendimpessage
的输出为

Begin emission:
*Finished sending 1 packets.

Received 1 packets, got 1 answers, remaining 0 packets
.
Sent 1 packets.
wireshark向路由器显示ARP请求和一个格式错误的数据包


编辑:当试图显示数据包的内容时,我意识到我使用了错误的函数。然而,现在数据包的校验和似乎有问题

对于您的代码示例,请确保它是一个完整的,包含所有导入,以便更容易复制。“路由器在其IP表中查找Host2以便发送消息?”,“非常感谢您为将数据包发送到另一个子网上的主机提供的任何帮助。”=>您这里的一个问题是什么?如果你想在子网之间进行ARP,那就是。@RossJacobs我没有试图在子网之间发送ARP请求,我成功地从路由器获得了MAC地址,所以我需要向路由器发送一个UDP包,然后路由器将包发送到主机2(这是我在概念上不理解的地方)?这是我感到困惑的最后一步。因为除了
send(以太(src=src\u-addr,dst=arp\u-MAC)/IP(src=my\u-IP,dst=dst\u-IP)/UDP(dport=port)/msg)
“因为除了
send(以太)(src=src\u-addr,dst=arp\u-MAC)/IP(src=my\u-IP,dst=dst=dst\u-IP)/UDP(dport=port)/msg)
”之外,所有的东西都能工作,所以这个包就不能被发送了吗?host3没有接收到数据包吗?对,wireshark Host1没有显示任何正在发送的数据包(除了发送到路由器的ARP),Host2也没有接收任何数据包。运行该命令时也没有错误。对于您的代码示例,请确保它是一个完整的,包含所有导入,以便更容易复制。“路由器在其IP表中查找Host2以发送消息?”,“如果您能帮助将数据包发送到另一个子网上的主机,我们将不胜感激。”=>你的一个问题是什么?如果你想在子网之间进行ARP,那就是。@RossJacobs我没有试图在子网之间发送ARP请求,我成功地从路由器获得了MAC地址,所以我需要向路由器发送一个UDP包,然后路由器将包发送到主机2(这是我在概念上不理解的地方)?这是我感到困惑的最后一步。因为除了
send(以太(src=src\u-addr,dst=arp\u-MAC)/IP(src=my\u-IP,dst=dst\u-IP)/UDP(dport=port)/msg)
“因为除了
send(以太)(src=src\u-addr,dst=arp\u-MAC)/IP(src=my\u-IP,dst=dst=dst\u-IP)/UDP(dport=port)/msg)
”之外,所有的东西都能工作,所以这个包就不能被发送了吗?host3没有接收到数据包吗?对,wireshark Host1没有显示任何正在发送的数据包(除了发送到路由器的ARP),Host2也没有接收任何数据包。运行命令时也没有错误。