Отправка пакетов с хоста на другой хост в другой подсети - PullRequest
1 голос
/ 05 ноября 2019

Я сейчас занимаюсь практикой в ​​python для отправки (UDP) пакетов. Я довольно новичок в этом, поэтому я пытался концептуально понять, что происходит.

В основном я пытаюсь отправить пакет с Host1 -> Router -> Host3. Из моего исследования мне нужно отправить ARP-запрос от Host1 к Router, чтобы получить MAC-адрес маршрутизатора, затем я отправляю кадр Ethernet на маршрутизатор. Отсюда я концептуально теряюсь. Маршрутизатор смотрит на свою таблицу 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'

Результат выполнения sendIPMessage равен

Begin emission:
*Finished sending 1 packets.

Received 1 packets, got 1 answers, remaining 0 packets
.
Sent 1 packets.

И wireshark показывает ARP-запрос кмаршрутизатор и искаженный пакет

enter image description here

Редактировать: пытаясь показать содержимое пакета, я понял, что выполняю неправильную функцию. Однако теперь, кажется, проблема в контрольной сумме пакета.

...