如果我使用libnetfilter_queue对其进行更改,则拒绝网络数据包

adn*_*ili 2 c linux network-programming netfilter linux-kernel

我正在使用iptables队列捕获一些数据包,并在libnetfilter_queue模块中对它们进行分析,现在我希望对数据包进行一些更改,但即使我更改了单个字符,也可能在检查校验和时拒绝数据包!有没有办法阻止它被拒绝:

static int callBack(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,struct nfq_data *nfa, void *data)
{
 int len=0,id=0;
 char *pktData;
 string pktString;
 struct nfqnl_msg_packet_hdr *pktHeader;
 pktHeader = nfq_get_msg_packet_hdr(nfa);
 if (pktHeader) 
 {
   id = ntohl(pktHeader->packet_id);
 }
 len = nfq_get_payload(nfa, &pktData);
 if(len) 
 {
  int pos;
  pktString.assign(pktData,len);
  pos=pktString.find("oldstring",0);
  if(pos>0)
 {
    pktString.replace(pos,9,"newstring");
    unsigned char* newPktData=(unsigned char*)pktString.c_str();
    len=pktString.size();
    return nfq_set_verdict(qh, id, NF_ACCEPT,len,newPktData);
}
}   
return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}
Run Code Online (Sandbox Code Playgroud)

and*_*llr 5

如果您更改了任何内容,则必须更新校验和以防止拒绝,否则数据包将被视为已损坏...
编辑:假设您正在处理IP数据包,以上仅适用于IP标头中的更改,因为只有标头,而不是有效负载,由IP校验和"保护".

  • 此外,如果它改变了TCP段的长度,TCP校验和需要更新,这很容易 - 修复序列号并不容易.更改数据包中的数据通常意味着应该通过编写代理来完成,而不是使用netfilter. (2认同)