如何提高Linux Netfilter模块的性能?

时间:2019-05-17 16:12:06

标签: linux-kernel network-programming kernel-module opensuse netfilter

嗨:我写了一个非常简单的netfiter模块。在其中,我定义了3个钩子:localout和转发以更改从我的PC发出的数据包,并预先进行反向处理。

我将模块插入2台PC,并且可以在它们之间ping,ssh,iperf等。

问题在于这种简单操作的网络性能低下。

我将OpenSuse Leap 15与内核4.12.14 -...一起使用...

如果我更改另一个IP字段(例如TTL或TOS),则性能还可以。 如果我更改协议或某些数据(TCP数据)非常慢。 我尝试使用nf_reset(skb)并且吞吐量也很慢,相同... 我线性化了skb,什么也没发生...

localout和前向挂钩:

nf_reset(skb);
skb_linearize(skb);
ip_hdr(skb)->protocol++; 
//computing TCP checksum if needed
ip_hdr(skb)->frag_off = 0; 
ip_send_check(ip_hdr(skb)); 
return NF_ACCEPT;

路由前钩子

nf_reset(skb);
skb_linearize(skb);
ip_hdr(skb)->protocol--; 
//computing TCP checksum if needed
skb->ip_summed = CHECKSUM_INNECESSARY; 
ip_send_check(ip_hdr(skb)); 
return NF_ACCEPT;

我找不到有关此问题的任何系统日志。我希望Netfilter挂钩可以提供更好的吞吐量。

我有一些问题:

1)如果我不输入:ip_hdr(skb)-> frag_off = 0; TCP协议不起作用(ssh,iperf等)。我的问题是:为什么?

2)性能极其缓慢。我的意思是,如果我不更改协议,则两台PC之间的吞吐量将超过5 Gb / s(均为vmware工作站虚拟机),如果我inc / dec的协议将低于5 Mb / s,则将近降低1024倍。我的另一个问题是:为什么简单的更改会降低吞吐量?

感谢进阶...

0 个答案:

没有答案