c - 如果我使用 libnetfilter_queue 进行更改,网络数据包将被拒绝

标签 c linux network-programming linux-kernel netfilter

我正在使用 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);
}

最佳答案

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

关于c - 如果我使用 libnetfilter_queue 进行更改,网络数据包将被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857513/

相关文章:

立即调用每个子进程来杀死?

c - 这是全局的吗?

linux - 没有找到 Eclipse 的 Maven 插件

ios - 使用多个参数快速上传图像

c++ - 关于获取 IDot11 AdHoc Manager Interface ofCOM WiFi AdHoc manager Interface 的引用

c - 对象WMA(虚拟内存区域:) and PTE (Page Table Entry)?)之间有什么区别

c - 我怎样才能得到正确的字符串长度?

linux - 我可以使用 awk 将所有小写字母转换为大写吗?

linux - bash 字符串比较没有按预期工作 - 如何修复

networking - 如何将单个直接 ftp 下载拆分为多个部分?