Как сбросить пакет tcp в ядре Linux, но не получать снова и снова? - PullRequest
2 голосов
/ 25 марта 2011

Я хочу изменить код ядра 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 ]

2 голосов
/ 25 марта 2011

Как сказал @nos, TCP надежен, поэтому другой конец будет ретранслировать отброшенный пакет.Вам потребуется отправить RST или ICMP ERROR (возможно, хост недоступен, административно запрещен) для разрыва соединения.

Также обратите внимание, что вы создали утечку памяти, вы отвечаете за освобождение skb, когдавы отбрасываете их.

1 голос
/ 25 марта 2011

Если вы действительно хотите, вы можете изменить код, чтобы отправить подтверждение для пакета, но вместо этого отбросить его.Я не очень рекомендую это.

1 голос
/ 25 марта 2011

Существует модуль ttl для iptables, который может фильтровать по ttl:

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