【发布时间】:2014-04-11 15:04:03
【问题描述】:
我正在尝试使用 libnetfiletr_queue 修改 IP 标头以包含更多 IP 选项。到目前为止,我已经成功地获得了如下所示的数据包。
if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {
fprintf(stderr, "Unable to set nfq_set_mode\n");
exit(1);
}
然后我设法走远了,如下所示,
static int my_callBack(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,struct nfq_data *tb)
{
int id = 0;
int packet_len;
unsigned char *data;
struct nfqnl_msg_packet_hdr *packet_hdr;
unsigned char *data;
packet_hdr = nfq_get_msg_packet_hdr(tb);
if (packet_hdr) {
id = ntohl(packet_hdr->packet_id);
}
packet_len = nfq_get_payload(tb, &data);
if (packet_len >= 0) {
//print payload length
printf("payload_length = %d ", packet_len);
//modify packet ip header
}
return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}
但是从这里开始,我对如何继续修改//modify packet ip header 注释处捕获的数据包的IP header 有点困惑。修改IP 标头的示例(例如流量类(IPV6)/ IP选项/版本/标志/目标地址)是可以的,因为我只需要了解修改是如何工作的:)。
我尝试了很多资源,但无法继续进行。非常感谢您对此查询的专家建议和帮助。 :)
非常感谢:)
【问题讨论】:
-
根据documentation,
nfq_get_payload将使data指向有效负载的第一个字节(可能是IP 标头)。您可以随意修改和读取/解析它。 libnetfilter 不公开允许您这样做的函数。 -
@MichaelFoukarakis 谢谢你的评论 :) 这也是我被困在这里的原因。 :) 也因为我对这个领域比较陌生,我没有足够的信息来做任何试错实验,因此求助于你的专家敌人帮助:) 知道如何操作会很棒标题,以便我可以做一些实验并实现我的目标:)
-
@MichaelFoukarakis 好的先生...谢谢你检查:)
标签: c linux linux-kernel network-programming netfilter