特定の条件でパケットを転送するカーネルモジュールを作成しようとしています。今は、インターフェイスで受信したパケットを転送し、別のインターフェイスに転送するハードコードテストを実行しようとしています。このテストでは、eth0の192.168.56.101からのパケットを受信しています。このパケットを192.168.57.103のeht1に転送します。 eth0では私のipは192.168.56.102であり、eth1では私のipは192.168.57.102です。私が使用しているトランスポートプロトコルは実験プロトコルです(253)。 NF_INET_PRE_ROUTINGで宛先の変更ip
#define XOR_PROTOCOL 253
static unsigned int xor_pre_routing_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
struct iphdr *iph;
struct xorhdr *ptr;
char sip[15];
char sip2[15];
iph = ip_hdr(skb);
sprintf(sip, "%pI4", &iph->saddr);
sprintf(sip2, "%pI4", &iph->daddr);
// Check if is XOR protocol
if (iph->protocol == XOR_PROTOCOL) {
DEBUG("(Ogirinal) From %pI4 to %pI4.\n", &iph->saddr, &iph->daddr);
if (strcmp(sip, "192.168.56.101") == 0 && strcmp(sip2, "192.168.56.255") == 0) {
//iph->saddr = inet_addr("192.168.57.102");
iph->daddr = inet_addr("192.168.57.103");
DEBUG("(Modified) From %pI4 to %pI4.\n", &iph->saddr, &iph->daddr);
iph = ip_hdr(skb);
iph->check = 0;
ip_send_check (iph);
return NF_ACCEPT;
}
}
accept:
return NF_ACCEPT;
}
このフック:次のコードは、私のコードのほんの単純化された部分です。私はまた、NF_INET_FORWARDにソースと宛先IPを印刷するフックを持っていますが、このフックを通過するパケットはありません。
私はバーチャルボックスで3 linux仮想マシンでテストしていますが、各VMでforwardオプションを有効にしました。このシナリオでパケットを転送することは可能ですか?私が間違ってやっていることと、この問題を解決するために何ができますか?
どのように仮想マシンを相互に接続しますか? Linuxブリッジを使用していますか? – Lin