Я сейчас занимаюсь практикой в 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-запрос кмаршрутизатор и искаженный пакет
Редактировать: пытаясь показать содержимое пакета, я понял, что выполняю неправильную функцию. Однако теперь, кажется, проблема в контрольной сумме пакета.