如何在linux内核中删除tcp包但不一次又一次地收到?

时间:2011-03-25 16:55:21

标签: c tcp linux-kernel packet

我想更改linux内核代码以过滤掉一些tcp数据包并删除它。

但我一直在不停地接收它。这是我的代码

/net/ipv4/tcp_ipv4.c

int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
{
// my code start
struct iphdr *iph;
iph = skb->nh.iph;

if(iph->ttl > 64) // I want to drop all tcp packet that meet this requirement
{
   return 0;
}
// my code end


// start normal linux code
  if(sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
...
}

3 个答案:

答案 0 :(得分:2)

正如@nos所说,TCP是可靠的,因此另一端将重新传输丢弃的数据包。您需要发送RST或ICMP错误(可能是主机无法访问,在管理上被禁止)来拆除连接。

另外,请注意您已经创建了内存泄漏,当您丢弃它时,您负责释放skb。

答案 1 :(得分:1)

iptables有一个ttl模块,可以通过ttl:

进行过滤
iptables –A INPUT -m ttl --ttl-gt 65 –j DROP

答案 2 :(得分:1)

如果您真的想要,可以修改代码以发送数据包的确认,而不是丢弃它。我不是真的推荐这个。