我正在尝试为个人项目学习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()的东西?还是有另一种获取价值的方法?
答案 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)