我正在尝试使用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);
}
但是从这里开始,我对如何在IP header
评论时修改捕获的数据包的//modify packet ip header
感到有些困惑。例如,对IP头的修改(例如流量类(如IPV6)/ IP选项/版本/标志/目标地址)是好的,因为我只需要了解修改如何工作:)。
我尝试了很多资源,无法继续进行任何操作。非常感谢您对此查询的专家建议和帮助。 :)
非常感谢:)
答案 0 :(得分:4)
要修改IP标头的值,首先要定义表示标头的结构。通过阅读您尝试访问的协议的RFC规范,您可以找到结构应该是什么。
以下是RFC for IPv6的链接:https://tools.ietf.org/html/rfc2460#section-3
IPv6标头的第一行有点棘手,因为它们没有使用字节对齐的字段。 Version字段为4位宽,Traffic Class为8位宽,Flow Label为20位宽。整个标头是320位(40字节),其中256个是src和dest地址。其他字段只使用64位,因此最简单的定义结构如下:
struct ipv6_hdr {
uint32_t row1;
uint16_t payload_length;
uint8_t next_header;
uint8_t hop_limit;
uint16_t src[8];
uint16_t dest[8];
};
要提取第一行值,可以使用一些屏蔽:
#define VERSION_MASK 0xF0000000
#define TRAFFIC_CLASS_MASK 0x0FF00000
#define FLOW_LABEL_MASK 0x000FFFFF
struct ipv6_hdr foo;
...
nfq_get_payload(tb, &foo); // Just an example; don't overflow your buffer!
// bit-wise AND gets masked field from row1
uint8_t version = (uint8_t) ((foo->row1 & VERSION_MASK) >> 28); // shift (32-4) bits
一旦将结构体指向数据有效负载,假设您的字节数组与此格式匹配,则修改标头值将变为简单的赋值:
version = 6;
// bit-wise OR puts our value in the right place in row1
foo->row1 &= ~(VERSION_MASK) // clear out the old value first
foo->row1 = ((uint32_t) version << 28) | foo->row1;
我选择在结构中使src和dest地址成为16位值的数组,因为IPv6地址是一系列8位,16位值。这样可以很容易地隔离任何给定的字节对。
在将适当的结构应用于它之前,您必须确定数据有效负载的格式。
有关如何创建IPv4标头的信息,请查看其RFC:http://tools.ietf.org/html/rfc791#section-3.1
希望这会有所帮助(您可能需要调整我的代码示例以获得正确的语法,这已经有几个月了。)
根据评论中的要求编辑有关校验和的信息
在修改标题后,请按照此RFC生成校验和:https://tools.ietf.org/html/rfc1071
关键外卖是在生成新的校验和之前将标题中的校验和字段归零。