Ryu SDN Controller - Как получить конкретную информацию о текущих пакетах - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь изучить контроллер SDN Ryu для личного проекта, и мне нужно знать определенную информацию о пакете, чтобы решить, что с ним делать.

Я уже импортировал:

from ryu.lib.packet import ethernet
from ryu.lib.packet import packet
from ryu.lib.packet import arp
from ryu.lib.packet import ipv4
from ryu.lib.packet import tcp
from ryu.lib.packet import tcp

И с вышеупомянутыми модулями я сделал последовательность отпечатков, чтобы проверить спецификации полного пакета:

msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
in_port = msg.match['in_port']

pkt = packet.Packet(msg.data)
eth = pkt.get_protocols(ethernet.ethernet)[0]
arp_pkt = pkt.get_protocol(arp.arp)
ipv4_pkt = pkt.get_protocol(ipv4.ipv4)
tcp_pkt = pkt.get_protocol(tcp.tcp)
udp_pkt = pkt.get_protocol(udp.udp)

print("\nEth pkt: {0}".format(eth))
print("\nIPV4 pkt: {0}".format(ipv4_pkt))
print("\nARP pkt: {0}".format(arp_pkt))
print("\nTCP pkt: {0}".format(tcp_pkt))
print("\nUDP pkt: {0}".format(udp_pkt))

, и когда я пытаюсь установить соединение TCP, я получаю следующие отпечатки:

Eth pkt: ethernet(dst='00:00:00:00:00:02',ethertype=2048,src='00:00:00:00:00:01')

IPV4 pkt: ipv4(csum=32564,dst='10.0.0.2',flags=2,header_length=5,identification=42869,offset=0,option=None,proto=6,src='10.0.0.1',tos=16,total_length=60,ttl=64,version=4)

ARP pkt: None

TCP pkt: tcp(ack=0,bits=2,csum=6900,dst_port=5001,offset=10,option='\x02\x04\x05\xb4\x04\x02\x08\n\x00\x10\xf05\x00\x00\x00\x00\x01\x03\x03\t',seq=1729779520,src_port=58573,urgent=0,window_size=29200)

UDP pkt: None
packet in 1 00:00:00:00:00:01 00:00:00:00:00:02 1

мой вопрос: как мне, например, получить порт назначения из insde tcp_pkt:

tcp_pkt = tcp(ack=0,bits=2,csum=6900,dst_port=5001,offset=10,option='\x02\x04\x05\xb4\x04\x02\x08\n\x00\x10\xf05\x00\x00\x00\x00\x01\x03\x03\t',seq=1729779520,src_port=58573,urgent=0,window_size=29200)

есть что-то вроде tcp_pkt.dst ()?Или есть другой способ уловить это значение?

1 Ответ

0 голосов
/ 18 мая 2019

Репозиторий Ryu находится на GitHub и может быть найден здесь .

Если вы посмотрите на модуль packet, вы найдете файл с именем tcp.py .

Для извлечения порта назначения из данного сетевого пакета необходимо получить доступ к заголовку транспортного уровня .В данном случае это TCP, поэтому из файла (tcp.py), который я включил выше, вы можете видеть, что есть переменная с именем dst_port.

Поэтому в вашем коде вы должны включить:

from ryu.lib.packet import ethernet, packet, arp, ipv4, tcp, udp

msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
in_port = msg.match['in_port']

pkt = packet.Packet(msg.data)
eth = pkt.get_protocols(ethernet.ethernet)[0]
arp_pkt = pkt.get_protocol(arp.arp)
ipv4_pkt = pkt.get_protocol(ipv4.ipv4)
#fetches 3rd item from list of protocols (tcp or udp). Instead of having separate udp and tcp
layer4_header = pkt.protocols[2]
#Now to extract the destination port
destination_port = layer4_header.dst_port
...