Netfilter フックを使用して Linux モジュールでパケット データを変更する方法を誰か教えてもらえますか?
ありがとう!
独自の netfilter モジュールを作成する必要はありません。iptables の QUEUE ターゲットを使用し、キューを処理するデーモンを作成して、ユーザー空間からアクセスできます。
このような例は比較的少ないですが、いくつかは存在します。通常はフィルタリングに使用されますが、変更されたパケットを再注入することもできます (少なくとも iptables の mangle テーブルでは)。
以下のプログラムを試してください
パケットをユーザー空間パケットに渡す IPTABLES ルールを記述する
# iptables -A INPUT -p TCP -j QUEUE
としてコンパイルして実行する
$ gcc test.c -lipq
$ sudo ./a.out
ソースコード
#include <netinet/in.h>
#include <linux/netfilter.h>
#include <libipq.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 2048
static void die(struct ipq_handle *h)
{
ipq_perror("passer");
ipq_destroy_handle(h);
exit(1);
}
int main(int argc, char **argv)
{
int status, i=0;
unsigned char buf[BUFSIZE];
struct ipq_handle *h;
h = ipq_create_handle(0, NFPROTO_IPV4);
if (!h) die(h);
status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE);
if (status < 0) die(h);
do{
i++;
status = ipq_read(h, buf, BUFSIZE, 0);
if (status < 0) die(h);
switch (ipq_message_type(buf)) {
case NLMSG_ERROR:
fprintf(stderr, "Received error message %d\n",
ipq_get_msgerr(buf));
break;
case IPQM_PACKET:
{
ipq_packet_msg_t *m = ipq_get_packet(buf);
printf("\nReceived Packet");
/****YOUR CODE TO MODIFY PACKET GOES HERE****/
status = ipq_set_verdict(h, m->packet_id, NF_ACCEPT, 0, NULL);
if (status < 0) die(h);
break;
}
default:
fprintf(stderr, "Unknown message type!\n");
break;
}
} while (1);
ipq_destroy_handle(h);
return 0;
}