我正在尝试创建一个在某些条件下转发数据包的内核模块。现在,我正在尝试进行硬代码测试,以转发接口中收到的数据包并将其转发到另一个接口。在这个测试中我收到了关于eth0的192.168.56.101的数据包,我想在eht1上转发这个数据包为192.168.57.103。在eth0中,我的ip是192.168.56.102,在eth1中我的ip是192.168.57.102。我正在使用的传输协议是一个实验协议(253)。以下代码只是我代码的简化部分:
#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_PRE_ROUTING中。我也有一个钩子只在NF_INET_FORWARD中打印源和目标IP,但是没有数据包通过这个钩子。
我正在使用虚拟机上的3个linux虚拟机进行测试,并且我在每个vm中启用了forward选项。在这种情况下可以转发数据包吗?我做错了什么,我该怎么做才能解决这个问题?
答案 0 :(得分:0)
问题是广播ip 192.168.56.255,转发了数据包的ip 192.168.56.102。