0

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

4

2 回答 2

0

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
于 2019-05-18T14:04:15.797 回答
0

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

if pkt.get_protocols(tcp.tcp):
    print(pkt.get_protocols(tcp.tcp)[0].dst_port)
于 2020-10-09T14:46:58.440 回答