我想更改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 */
...
}
答案 0 :(得分:2)
正如@nos所说,TCP是可靠的,因此另一端将重新传输丢弃的数据包。您需要发送RST或ICMP错误(可能是主机无法访问,在管理上被禁止)来拆除连接。
另外,请注意您已经创建了内存泄漏,当您丢弃它时,您负责释放skb。
答案 1 :(得分:1)
iptables有一个ttl模块,可以通过ttl:
进行过滤iptables –A INPUT -m ttl --ttl-gt 65 –j DROP
答案 2 :(得分:1)
如果您真的想要,可以修改代码以发送数据包的确认,而不是丢弃它。我不是真的推荐这个。