Реализация упрощенной версии NAT, которая может обрабатывать пакеты ICMP и TCP

#python #networking

#питон #сетевой

Вопрос:

У меня есть проект для моего сетевого класса для реализации упрощенной версии NAT, которая может обрабатывать пакеты ICMP и TCP. Однако я застрял на том, с чего начать. нам не дали много ресурсов о том, как это создать. Так что любые ресурсы, которые помогли бы мне начать это, были бы великолепны.

Инструкции, которые были даны, были:

«Две сети (одна внутренняя и одна внешняя, подключенные через маршрутизатор) были снабжены сетевой топологией, приведенной ниже. Маршрутизатор имеет два интерфейса, один из которых подключается к внутреннему, а другой-к внешнему. Здесь мы предполагаем, что внутренняя сеть использует частные IP-адреса, а внешняя сеть использует общедоступные IP-адреса. Изначально на маршрутизаторе не работает NAT, и поэтому некоторые тесты могут завершиться неудачей. Например, клиент 1 не может успешно выполнить пинг на сервер, и то же самое происходит с клиентом 2 из-за отсутствия NAT. Ваша задача в этом проекте-реализовать NAT на маршрутизаторе, чтобы помочь клиенту 1 и клиенту 2 успешно выполнить пинг на сервер, а также помочь TCP-пакетам проходить через маршрутизатор. Этот проект NAT доступен на нашей лабораторной платформе с уникальными сетевыми настройками (уникальный диапазон IP-адресов для внутренней и внешней сети), предоставляемыми для всех. Доступ к оболочке также был предоставлен на странице проекта, и доступ к оболочке можно получить двойным щелчком мыши на экземпляре (например, маршрутизаторе). Ниже приведен пример, показывающий предоставленную оболочку на веб-странице. Кроме того, на предоставленных экземплярах были настроены все необходимые инструменты и библиотеки, например, ping, curl, scapy (описано в разделе «Реализация проекта»). Обратите внимание, что это командный проект, но у каждого есть своя страница проекта, на которой вы можете практиковать свою реализацию».

Это был данный нам код для начала:

 import threading  from scapy.packet import Packet  from scapy.sendrecv import send, sniff  from scapy.layers.inet import TCP, IP, Ether, ICMP   PRIVATE_IFACE = "eth0"  PRIVATE_IP = "10.0.0.2"   PUBLIC_IFACE = "eth1"  PUBLIC_IP = "172.16.20.2"   def process_pkt_private(pkt: Packet):   if pkt.sniffed_on == PRIVATE_IFACE:  print("received pkt from private interface", pkt.sniffed_on, pkt.summary())   if ICMP in pkt:  # Create a new IP packet with specified src and dst  new_pkt = IP(src="???", dst="???") / pkt[ICMP]  # Send the new packet over the public interface  send(new_pkt, iface=PUBLIC_IFACE, verbose=False)  print('tICMP Packet captured on private interface')   elif TCP in pkt:  print('tTCP Packet captured on private interface')   def process_pkt_public(pkt: Packet):  # same as before  pass   def private_listener():  print("sniffing packets on the private interface")  sniff(prn=process_pkt_private, iface=PRIVATE_IFACE, filter="icmp or tcp")   def public_listener():  print("sniffing packets on the public interface")  sniff(prn=process_pkt_public, iface=PUBLIC_IFACE, filter="icmp or tcp")   def main():  thread1 = threading.Thread(target=private_listener)  thread2 = threading.Thread(target=public_listener)   print("starting multiple sniffing threads...")  thread1.start()  thread2.start()  thread1.join()  thread2.join()   main()