#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()