2016-06-25 19 views
1

Ich versuche ein Kernelmodul zu erstellen, das Pakete unter bestimmten Bedingungen weiterleitet. Jetzt versuche ich nur einen harten Codetest durchzuführen, um ein in einer Schnittstelle empfangenes Paket weiterzuleiten und es an eine andere Schnittstelle weiterzuleiten. In diesem Test empfange ich ein Paket von 192.168.56.101 auf eth0 und ich möchte dieses Paket auf Eht1 für 192.168.57.103 weiterleiten. In eth0 ist meine IP 192.168.56.102 und in eth1 ist meine IP 192.168.57.102. Das Transportprotokoll, das ich verwende, ist ein experimentelles Protokoll (253). Der folgende Code ist nur ein vereinfachtes Teil meines Code:Ziel ändern 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; 
} 

Dieser Haken in NF_INET_PRE_ROUTING. Ich habe auch einen Haken, um Quell- und Ziel-IP nur in NF_INET_FORWARD zu drucken, aber es gibt kein Paket, das durch diesen Haken geht.

Ich teste mit 3 virtuellen Linux-Maschine auf virtuelle Box, und ich habe die Weiterleitungsoption in jedem VM aktiviert. Ist es möglich Pakete in diesem Szenario weiterzuleiten? Was mache ich falsch und was kann ich tun, um dieses Problem zu lösen?

+0

Wie verbinden sich Ihre virtuellen Maschinen miteinander? Verwenden Sie eine Linux-Bridge? – Lin

Antwort

0

Das Problem ist die Broadcast-IP 192.168.56.255, mit der IP 192.168.56.102 wurden die Pakete weitergeleitet.