Ich möchte skb zu prerouting
Punkt des Linux-Netzwerk-Stack drücken. Gibt es eine Möglichkeit, dies zu tun? Ich verwendete dev_queue_xmit()
und netif_rx()
Funktionen, aber ich glaube nicht, dass sie Skb in prerouting
Punkt des Linux-Netzwerk-Stack schieben können.Wie skb in bestimmten Punkt des Linux-Netzwerk-Stack drücken?
Antwort
Ich vermute, Sie wollen libpcap oder libnetfilter_queue im Folgenden zusammenfassend als Userland-Warteschlangen. Die Userland-Warteschleife leitet alle Pakete, die mit einer Regel übereinstimmen (die Sie definieren), an Ihre Benutzerlandanwendung weiter. Die Funktionen dev_queue_ * und netif_ * gelten für das Routing auf Kernel-Ebene und sind für Userland-Anwendungen nicht relevant.
Userland-Queuing hat Auswirkungen auf die Leistung und abhängig von der verwendeten Bibliothek müssen Sie eine bestimmte Methode verwenden, um Ihr Paket wieder in die Netfilter-Warteschlangen zu injizieren.
Ich bin nicht ganz klar wo dieser Skb stammt aus. Im Benutzerland gibt es zwei Möglichkeiten, dies zu tun. Eine besteht darin, ein tun
-Gerät zu verwenden (und das Paket einfach hineinzuschreiben). Der andere ist libpcap
zu verwenden (der die wenig bekannte Eigenschaft hat, rohe Pakete zu verschicken, die unter allen empfangenen Daten versteckt sind).
Sie sagen, dass Sie dies tun möchten, indem Sie eine ioctl
registrieren (vermutlich bedeutet das Hinzufügen Ihrer eigenen ioctl
), dann rufen Sie die ioctl
aus dem Benutzerbereich. Es ist nicht sofort offensichtlich, warum Sie das tun möchten, wenn Sie dies bereits ohne Änderung des Kernels erreichen können. Wenn Sie dies jedoch tun wollten, folgen Sie dem Pfad, den der tun
-Treiber verwendet, und führen Sie das Äquivalent write()
-zu dem tun
-Gerät in Ihrem neuen ioctl
. Das könnte bedeuten, dass eine tun
-ähnliche Schnittstelle vorhanden ist, die als Quelle für die Pakete fungiert. Ich vermute, Pakete im System benötigen eine Art Quell-Schnittstelle.
Dies ist die Nutzlast des Pakets aus Benutzerraum erstellt, dann möchte ich dieses Paket zu meinem Kernel-Modul ioctl, dann bekomme ich das Paket aus Benutzerraum, weiß ich neue skb zuweisen und Paket Nutzlast hinzufügen, weiß ich muss drücken skb zum Prerouting-Punkt des Netzwerkstapels. –
Warum denken Sie, dass 'netif_rx()' in diesem Fall falsch ist? Das (oder genauer: netif_rx_ni() ') ist genau das, was' drivers/net/tun.c' verwendet, und das Vorrouting funktioniert definitiv für 'tun'. Ich vermute, Ihr Problem ist jedoch nicht, dass Sie die falsche Funktion aufrufen, aber wenn Ihr 'skb' nicht als von einer Schnittstelle kommend verfolgt wird (was Ihre nicht ist), funktioniert das Prerouting möglicherweise nicht so, wie Sie es vorhaben wie Prerouting-Regeln, die die Eingabeschnittstelle untersuchen, funktionieren würden. Aus diesem Grund habe ich vorgeschlagen, ein "tun" -Gerät zu verwenden und keinen Kernel zu ändern. – abligh
@abligh: I skb_copy() meine SKB in netfilter Vor-Routing-Hook-Handler, ändern Sie ihre Daten und möchten es wieder injizieren - neben dem ursprünglichen skb. Damit wird jedes empfangene Paket in 2 Pakete getrennt geroutet. Ich habe versucht, den kopierten SKB vor der Rückgabe von NF_ACCEPT über die verknüpfte Liste zu legitimieren, aber es hat nicht geklappt. Irgendeine Idee, wie man das angeht? Vielen Dank. – wick
Ich denke, die Funktion von Ihnen gesuchten ip_queue_xmit()
ist, das ist, wo IPV4 Implementierung beginnt Tabellen, Filter Überprüfung usw.
könnten Sie mit der Kernel-Version sein aufwändigere bitte? Es ist schwer, ohne die Kernel-Version – HighOnMeat
@Pegasus spezifisch zu sein Ich benutze Kernel 3.2 –
Was versuchen Sie wirklich zu erreichen? Willst du skb von wo zu prerouting schieben? Könntest du bitte –