searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

ip分片在ovs ct中丢包的问题

2023-06-15 00:59:35
125
0

使用ovs+dpdk进行数据面转发可以提供很高的转发性能,但是在处理分片包的逻辑上会比较耗性能, 是在使用ovs自带的ct模块的时候, 由于分片包没有4层头,会匹配不到ct,所以需要进行报文的聚合(这里不会真的聚合成一个包,只是将分片包一起处理), 然后进行ct匹配,完成报文转发。

这里聚合完成的一个判断逻辑是这样的, 不是最后一个报文的报文长度不能小于min_v4_frag_size:

conntrack_execute-》ipf_preprocess_conntrack-》ipf_extract_frags_from_batch-》ipf_is_valid_v4_frag
 
    bool lf = ipf_is_last_v4_frag(pkt);
    if (OVS_UNLIKELY(!lf && dp_packet_l3_size(pkt) < min_v4_frag_size_)) {
        ipf_count(ipf, false, IPF_NFRAGS_TOO_SMALL);
        goto invalid_pkt;
    }
min_v4_frag_size在ipf_init时候设置为IPF_V4_FRAG_SIZE_MIN_DEF (1200), 小于mtu, 大部分报文(vpn报文去掉加密头一般也会大于1200)分片非最后一个包都大于1200, 并且这个参数可以通过命令设置, 最小可以设置成400
ovs-appctl dpctl/ipf-set-min-frag  netdev@ovs-netdev v4 400
设置最小分片的目的是防止fraglist过大, 影响ct中frag聚合效率低,导致性能下降影响转发,比如恶意的构造分片都是400字节的包,一个大包可以分成近160个分片包,这样会导致ovs聚合消耗很多cp性能。
 ipf-set-min-frag [dp] v4|v6 minfrag
              Sets  the minimum fragment size (L3 header and data) for non-fi‐
              nal fragments to minfrag.  Either v4 or v6  must  be  specified.
              For  enhanced  DOS  security,  higher minimum fragment sizes can
              usually be used.  The default IPv4 value is 1200 and the clamped
              minimum  is 400.  The default IPv6 value is 1280, with a clamped
              minimum of 400, for testing flexibility.  The  maximum  fragment
              size  is not clamped, however, setting this value too high might
              result in valid fragments being  dropped.   Only  supported  for
              userspace datapath.
但是大包在复杂链路上可能被多次分片,会出现非最后一个包的长度较小,在通过网关转发的场景里,
公网大于1500的报文比如1600长度的,进入网关上可能是分成了1500和100字节的报文, 如果需要将报文封装vxlan隧道
第一个包l3长度会变成1550, 所以需要对1500的报文分片,变成一个1450, 50, 100的3个包, 第二包到了ovs会认为是非法的,
导致3个包在ct中处理不了, 最终会被ipf_frag超时处理丢弃掉
 
可以通过修改ovs代码的IPF_V4_FRAG_SIZE_LBOUND来支持多次分片的小包, 比如修改成70=50(paylaod)+20(ipheader), 这样就可以解决分片聚合失败的问题
0条评论
0 / 1000
何****森
15文章数
1粉丝数
何****森
15 文章 | 1 粉丝
何****森
15文章数
1粉丝数
何****森
15 文章 | 1 粉丝
原创

ip分片在ovs ct中丢包的问题

2023-06-15 00:59:35
125
0

使用ovs+dpdk进行数据面转发可以提供很高的转发性能,但是在处理分片包的逻辑上会比较耗性能, 是在使用ovs自带的ct模块的时候, 由于分片包没有4层头,会匹配不到ct,所以需要进行报文的聚合(这里不会真的聚合成一个包,只是将分片包一起处理), 然后进行ct匹配,完成报文转发。

这里聚合完成的一个判断逻辑是这样的, 不是最后一个报文的报文长度不能小于min_v4_frag_size:

conntrack_execute-》ipf_preprocess_conntrack-》ipf_extract_frags_from_batch-》ipf_is_valid_v4_frag
 
    bool lf = ipf_is_last_v4_frag(pkt);
    if (OVS_UNLIKELY(!lf && dp_packet_l3_size(pkt) < min_v4_frag_size_)) {
        ipf_count(ipf, false, IPF_NFRAGS_TOO_SMALL);
        goto invalid_pkt;
    }
min_v4_frag_size在ipf_init时候设置为IPF_V4_FRAG_SIZE_MIN_DEF (1200), 小于mtu, 大部分报文(vpn报文去掉加密头一般也会大于1200)分片非最后一个包都大于1200, 并且这个参数可以通过命令设置, 最小可以设置成400
ovs-appctl dpctl/ipf-set-min-frag  netdev@ovs-netdev v4 400
设置最小分片的目的是防止fraglist过大, 影响ct中frag聚合效率低,导致性能下降影响转发,比如恶意的构造分片都是400字节的包,一个大包可以分成近160个分片包,这样会导致ovs聚合消耗很多cp性能。
 ipf-set-min-frag [dp] v4|v6 minfrag
              Sets  the minimum fragment size (L3 header and data) for non-fi‐
              nal fragments to minfrag.  Either v4 or v6  must  be  specified.
              For  enhanced  DOS  security,  higher minimum fragment sizes can
              usually be used.  The default IPv4 value is 1200 and the clamped
              minimum  is 400.  The default IPv6 value is 1280, with a clamped
              minimum of 400, for testing flexibility.  The  maximum  fragment
              size  is not clamped, however, setting this value too high might
              result in valid fragments being  dropped.   Only  supported  for
              userspace datapath.
但是大包在复杂链路上可能被多次分片,会出现非最后一个包的长度较小,在通过网关转发的场景里,
公网大于1500的报文比如1600长度的,进入网关上可能是分成了1500和100字节的报文, 如果需要将报文封装vxlan隧道
第一个包l3长度会变成1550, 所以需要对1500的报文分片,变成一个1450, 50, 100的3个包, 第二包到了ovs会认为是非法的,
导致3个包在ct中处理不了, 最终会被ipf_frag超时处理丢弃掉
 
可以通过修改ovs代码的IPF_V4_FRAG_SIZE_LBOUND来支持多次分片的小包, 比如修改成70=50(paylaod)+20(ipheader), 这样就可以解决分片聚合失败的问题
文章来自个人专栏
neutron
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0