Wie erzwinge ich Ping, um tatsächlich Pakete aus der Netzwerkkarte zu senden?

0

Ich arbeite an einem FPGA-basierten Gerät zur Paketerfassung und Zeitstempelung. Um es zu testen, möchte ich versuchen, durch es zu pingen. Auf meinem Computer sind zwei 10G-Netzwerkkarten mit zwei Anschlüssen installiert, und ich habe drei Anschlüsse angeschlossen. Einer ist der "überwachte" Anschluss, an dem Pakete in beide Richtungen erfasst werden, einer ist der "durchgehende" Anschluss, der mit dem "überwachten" Anschluss verbunden ist, und Der dritte ist der "Dump" -Port, an den die erfassten und mit einem Zeitstempel versehenen Pakete gesendet werden.

Ausgabe von IP-Adresse mit irrelevanten Informationen entfernt:

3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 00:60:dd:xx:xx:f8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.1/24 scope global enp4s0
       valid_lft forever preferred_lft forever
    inet6 fe80::260:ddff:fexx:xxf8/64 scope link 
       valid_lft forever preferred_lft forever
5: enp6s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 90:e2:ba:xx:xx:e0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::92e2:baff:fexx:xxe0/64 scope link 
       valid_lft forever preferred_lft forever
6: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 00:60:dd:xx:xx:f9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.2/24 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::260:ddff:fexx:xxf9/64 scope link 
       valid_lft forever preferred_lft forever
7: enp6s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:e2:ba:xx:xx:e1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::92e2:baff:fexx:xxe1/64 scope link 
       valid_lft forever preferred_lft forever

enp4s0 und enp5s0 sind die überwachten und durchgehenden Ports, enp6s0f1 ist der Erfassungsport. Ich habe den enp4s0- und enp5s0-Schnittstellen die Adressen 192.168.99.1/24 und 192.168.99.2/24 zugewiesen. Ich habe 3 Instanzen von Wireshark, eine auf jeder Schnittstelle.

Wenn ich in Python einen Raw-Socket öffne und Daten sende, wird dies in allen drei Wireshark-Instanzen erwartet. Wenn ich jedoch ping (ping -I enp4s0 192.168.99.2) ausführe, funktioniert es (es gehen keine Pakete verloren), aber in keiner der Wireshark-Instanzen wird etwas angezeigt. Ich habe versucht, die Adressen mit den richtigen Schnittstellen zur ARP-Tabelle hinzuzufügen, aber immer noch keine Würfel. Ich gehe davon aus, dass, da der Kernel die Zieladresse auf einer anderen Schnittstelle sehen kann, die Pakete niemals tatsächlich an die Netzwerkkarte gesendet werden, um über die Leitung hinauszugehen. Gibt es eine einfache Möglichkeit, die Pakete dazu zu zwingen, tatsächlich auf dem Draht herauszugehen, ohne durch 500 Reifen springen und mit Iptables, NAT usw. herumschrauben zu müssen?

alex.forencich
quelle
Versuchen Sie es mit arpinganstelle von ping. Lesen Sie den Mann Seite für Befehlssyntax (dh Sie die Sende - Schnittstelle angeben müssen).
Sägemehl
Interessante Idee, probiert es einfach aus, ARP-Pakete gehen über die Schnittstelle und werden in allen drei Wireshark-Instanzen angezeigt ... aber es scheinen keine Antworten durch Arping gesendet oder empfangen zu werden.
alex.forencich
"Pakete gehen über die Schnittstelle hinaus" - das ist alles, wonach Sie gefragt haben! Sie stoßen auf das ARP-Flux- Problem unter Linux. Linux betrachtet eine IP-Adresse eher als Bestandteil des Hosts als als eine Schnittstelle. Siehe jefflane.org/multiple-nics-same-subnet-avoiding-arp-flux
Sägespäne
Nun, ich hatte gehofft, einen kurzen "Hey, ich kann erfolgreich pingen" -Test machen zu können, bei dem es nicht um Wireshark geht. Es scheint, als gäbe es eine relativ einfache Möglichkeit, dies zu tun, aber es ist auch möglich, dass der Linux-Netzwerkstapel nicht so konzipiert ist, dass dies möglich ist.
alex.forencich