Ryu SDN控制器-如何获取有关流数据包的特定信息

时间:2019-02-26 15:20:53

标签: python sdn ryu

我正在尝试为个人项目学习Ryu SDN控制器,我需要知道某些数据包信息才能决定如何处理它。

我已经导入了:

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()的东西?还是有另一种获取价值的方法?

2 个答案:

答案 0 :(得分:0)

Ryu存储库位于GitHub上,可以找到here

如果您查看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

答案 1 :(得分:0)

可以像检索以太网源和目标MAC地址一样检索TCP源端口和目标端口。但是,您必须仔细检查一下以确保是否存在TCP流量:

if pkt.get_protocols(tcp.tcp):
    print(pkt.get_protocols(tcp.tcp)[0].dst_port)