Манипулирование необработанными пакетами для обеспечения функциональности NAT - PullRequest
0 голосов
/ 04 мая 2018

Я хочу реализовать пользовательский NAT в python, для этого я хочу получать все клиентские пакеты и изменять их. Затем перешлите их на другое устройство.

Я нашел scapy, который может легко манипулировать и отправлять пакеты. Но не смог найти способ получения пакетов. Так можно ли получать пакеты, затем редактировать их, как редактировать source IP и destination IP, читать заголовки UDP и пересылать их, а затем пересылать ответные пакеты?

1 Ответ

0 голосов
/ 04 мая 2018

Вы также можете использовать функцию sniff() scapy для получения пакетов:

>>> help(sniff)
Sniff packets and return a list of packets.
Args:
    count: number of packets to capture. 0 means infinity.
    store: whether to store sniffed packets or discard them
    prn: function to apply to each packet. If something is returned, it
         is displayed.
         --Ex: prn = lambda x: x.summary()
    filter: BPF filter to apply.
    lfilter: Python function applied to each packet to determine if
             further action may be done.
             --Ex: lfilter = lambda x: x.haslayer(Padding)
    offline: PCAP file (or list of PCAP files) to read packets from,
             instead of sniffing them
    timeout: stop sniffing after a given time (default: None).
    L2socket: use the provided L2socket (default: use conf.L2listen).
    opened_socket: provide an object (or a list of objects) ready to use
                  .recv() on.
    stop_filter: Python function applied to each packet to determine if
                 we have to stop the capture after this packet.
                 --Ex: stop_filter = lambda x: x.haslayer(TCP)
    iface: interface or list of interfaces (default: None for sniffing
           on all interfaces).
    monitor: use monitor mode. May not be available on all OS
    started_callback: called as soon as the sniffer starts sniffing
                      (default: None).
The iface, offline and opened_socket parameters can be either an
element, a list of elements, or a dict object mapping an element to a
label (see examples below).
Examples:
  >>> sniff(filter="arp")
  >>> sniff(lfilter=lambda pkt: ARP in pkt)
  >>> sniff(iface="eth0", prn=Packet.summary)
  >>> sniff(iface=["eth0", "mon0"],
  ...       prn=lambda pkt: "%s: %s" % (pkt.sniffed_on,
  ...                                   pkt.summary()))
  >>> sniff(iface={"eth0": "Ethernet", "mon0": "Wifi"},
  ...       prn=lambda pkt: "%s: %s" % (pkt.sniffed_on,
  ...                                   pkt.summary()))

Аргумент prn особенно позволяет выполнять действие с каждым полученным пакетом. Там много отличных уроков

На основе вашего комментария приведен пример:

 def _process(pkt):
      if IP in pkt:
           pkt[IP].dst = "y.y.y.y"
           pkt[Ether].dst = None  # Force scapy to re-calculate the MAC dst
           sendp(pkt)  # send the packet
 sniff(iface="eth0", prn=_process)
...