开发者

How to drop tcp packet in linux kernel but do not receive again and again?

I want to change the linux kernel code to filter some tcp packet and drop it.

But I always keep receiving it again and again. Here is my code in

/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 */
...
}


As @nos said, TCP is reliable, so the other end will retransmit the dropped packet. You would need to send a RST or an ICMP ERROR (probably host unreachable, administratively prohibited) to teardown the connection.

Also, note that you've created a memory leak, you're responsible for freeing skb's when you discard them.


There is a ttl module for iptables, which can filter by ttl:

iptables –A INPUT -m ttl --ttl-gt 65 –j DROP


If you really wanted to, you could modify the code to send an acknowledgment for the packet, but instead drop it. I don't really recommend this.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜