Daten zwischen zwei Netzwerkkarten, ein Rechner

OP #4399485
Lesenswert?

Moin,

folgendes: Ich habe in einem OpenWRT Linux-Modul zwei "Netzwerkkarten" 
und will diese (zum Test) back-to-back verbinden. Das klappt auch schon 
so weit ich das sehen kann. Link ist da und beim Init der Karten werden 
ein paar Pakete hin und her geschickt, die jeweils bei der anderen Karte 
im RX Counter auftauchen.
Nun will ich da mal ein bisschen Durchsatz machen und ein paar Daten 
rüber schieben, das gestaltet sich als schwieriger als gedacht.
eth0 bekommt z.B. 192.168.1.1 und eth1 z.B. 192.168.1.2. Wenn ich nun an 
.1.2 Daten schicke ist Linux natürlich schlau und schiebt die nicht über 
die Netzwerkkarte, sondern leitet die direkt intern an das Interface.
Frage: Wie kann ich ihn dazu zwingen die Daten über das andere Interface 
zu schicken?
Gleich vorab: Ich kann das Modul nicht mit einem anderen Modul/Rechner 
verbinden, da ich nur ein Modul habe und testen will, ob ich zwei Module 
back-to-back ohne Übertrager verbinden kann. Daher verbinde ich es mit 
sich selbst.
#4399497
Lesenswert?

Fabian S. schrieb:
> Wenn ich nun an
> .1.2 Daten schicke ist Linux natürlich schlau und schiebt die nicht über
> die Netzwerkkarte, sondern leitet die direkt intern an das Interface.
> Frage: Wie kann ich ihn dazu zwingen die Daten über das andere Interface
> zu schicken?

Das ist alles andere als einfach, Du musst viele Teile der 
Linux-Netzwerkkonfiguration manuell ändern. Das fängt schon beim ARP an 
und geht beim Routing weiter.

> und testen will, ob ich zwei Module
> back-to-back ohne Übertrager verbinden kann. Daher verbinde ich es mit
> sich selbst.

Du willst nur die Übertrager loswerden? Warum das? Die gehören bei 
Ethernet aus gutem Grund mit dazu.
OP #4399506
Lesenswert?

Hmm, hatte gehofft, dass man da mit ein paar iptables weiter kommt. Soll 
ja nur ein quick-and-dirty Test sein ;)

Naja, soweit ich weiß braucht man die Übertrager nicht unbedingt. Es 
gibt nicht ohne Grund App-Notes von Intel und TI (habe ich bislang 
gefunden), wie es auch ohne geht. Hauptsächtlich ist das ja, um 
Potentialausgleiche zu machen, keine GND-Loops zu bekommen, Common-Mode 
Reject und damit die Arbeitspunkte der Sender/Empfänger unterschiedlich 
eingestellt werden können. Ich muss nur über 2cm übertragen, Sender und 
Empfänger sind die gleichen Chips. Alles tuti :)

Hier das von Intel:
http://www.intel.com/content/dam/doc/application-note/8255x-fast-ethernet-controllers-without-magnetics-appl-note.pdf
Man merke, dass der hier benutzte Intel-Chip Push-Pull-Treiber hat, was 
die wenigsten haben. Daher muss man die 50R an die Versorgung hängen, wo 
normal der Trafo dran hängt, bei mir 2V.

Und das von TI:
http://www.ti.com/lit/an/snla088a/snla088a.pdf
Wo man sich meiner Meinung nach in meinem Fall auch die Kondensatoren 
und ein paar Widerstände sparen kann, da beide Chips mit dem gleichen 
DC-Offset arbeiten. Somit reicht bei mir eine Durchverbindung und 4 
Pull-Ups nach 2V. Aber das will ich ja gerade testen.
#4399524
Lesenswert?

Hmm, Du hast also so ein Mini-Modul, welches zwar die Pins für 2 
Ethernet-Schnittstellen bereitstellt, die Übertrager und Buchsen aber 
auf nem extra Board dazugebaut werden müssen. Du willst Dir jetzt das 
extra Board mit den Übertragern sparen, korrekt?

Ok, das könnte bei kurzen Leitungen und identischen ICs schon gehen.

Zu Deinem Übertragungstest: Du könntest Raw Ethernet Pakete senden. Dann 
ist der IP-Stack von Linux außen vor. Such mal im Internet, gibt einige 
Programme die das können. Z.B. packeth.
OP #4399761
Lesenswert?

Gerd E. schrieb:
> Hmm, Du hast also so ein Mini-Modul, welches zwar die Pins für 2
> Ethernet-Schnittstellen bereitstellt, die Übertrager und Buchsen aber
> auf nem extra Board dazugebaut werden müssen. Du willst Dir jetzt das
> extra Board mit den Übertragern sparen, korrekt?

Ja. Genaugenommen will ich zwei Module auf ein Baseboard setzen.

Rufus Τ. F. schrieb:
> Wäre es nicht günstiger, wenn beide NICs wenigstens in unterschiedlichen
> Subnets lägen?

Weiß ich nicht, wie schicke ich dann Daten von A nach B? Das Problem 
bleibt ja das gleiche. Wenn ich Daten von A nach B schicken will und die 
IP von B nutze werden die Daten einfach intern verarbeitet. Auch hier 
die Frage: Wie zwinge ich ihn dann, die Daten über das Interface von A 
zu schicken?
Gast #4399797
Lesenswert?

Wahrscheinlich ist Dein Linux so schlau, weil die Defaultroute sagt daß 
Traffic von 0.0.0.0/0 über eth0 gehen soll.

Lege beide NICs in verschiedene Netzblöcke, zB ins 192er und 10er; dann 
setze Routen. Sicherheitshalber kannst Du noch mit iptables den Traffic 
per Interface reglementieren.

Womit testet Du das denn? Schau mal ob das Tool an ein Interface/IP 
binden kann (wget, curl, nc). Notfalls bastelt man sich halt zwei 
Scripts die das machen.
OP #4399827
Lesenswert?

nic schrieb:
> Wahrscheinlich ist Dein Linux so schlau, weil die Defaultroute sagt daß
> Traffic von 0.0.0.0/0 über eth0 gehen soll.
>
> Lege beide NICs in verschiedene Netzblöcke, zB ins 192er und 10er; dann
> setze Routen. Sicherheitshalber kannst Du noch mit iptables den Traffic
> per Interface reglementieren.
>
> Womit testet Du das denn? Schau mal ob das Tool an ein Interface/IP
> binden kann (wget, curl, nc). Notfalls bastelt man sich halt zwei
> Scripts die das machen.

Hmmm joa ok, das habe ich quasi so schon probiert - mehr oder weniger.
Also wenn ich beide Interfaces erstelle hat er natürlich zwei Routen für 
jedes der Netzwerke über das entsprechende Interface. Ob das nun zwei 
NICs sind oder nicht, ist m.E. nach egal, bin aber auch kein Experte.
Selbst wenn ich dann zwei NICs habe, erstellt er ja je ein Routing 
Eintrag für das jeweilige Netzwerk. Diese müsste ich ja umgehen/löschen, 
damit er eben Pakete die an Netz A gehen sollen, nicht über das 
zugehörige Interface rausgehen. Aber wenn dann über das Interface ein 
Paket rein kommt (z.B. ein Ping) und der Rechner schickt die Antwort 
raus, geht die ja auch wieder über Interface über die der Ping 
ürsprünglich raus gegangen ist oder?
Ich habe von Netzwerktechnik nur bedingt Ahnung und bekomme hier den 
übelsten Knoten im Hirn :D

Konrad S. schrieb:
> Es reicht, wenn man die Source-IP vorgibt. Beispiel:
> ...

Zwei Sachen: Ist das nur ein Fehler gewesen, dass es beim 2. Befehl 
hinten .2.2 heißt? Oder habe ich was übersehen?
Und dann läuft auf der Kiste wie gesagt OpenWRT, sprich nur Busybox nc, 
was soweit ich das eben rausfinden konnte kein -s und kein -l kann, 
zudem gibt es lsof nicht. Gut, letzteres könnte ich vermutlich mit 
einbauen, aber das Busybox nc kann kein Server.
Eine ähnliche Idee hatte ich aber auch schon: Und zwar kann man quasi 
das gleiche auch bei ping machen mit -I. Wenn ich dort jedoch ein 
Interface oder eine IP angebe bekomme ich nie ne Antwort, nicht mal wenn 
ich ein ping an die IP des gleichen Interfaces mache. Keine Ahnung was 
da schief läuft.


Naja, ich sehe schon, das ist nicht mal eben so mit meinen 
Netzwerkkenntnissen gemacht. Falls keiner mehr ne fast-and-easy Lösung 
hat, muss ich halt warten, bis das zweite Modul kommt, dann probiere ich 
das damit.
Gast #4399839
Lesenswert?

> Es reicht, wenn man die Source-IP vorgibt. Beispiel:

Leider reicht das nicht, der Kernel routet trotzdem lokal. Kann man ganz 
einfach überprüfen indem man das Kabel (bei Wlan die Antenne) abzieht. 
Oder die erreichten Übertragungsraten messen, die liegen (bei einem 
nicht-uralten System) weit jenseits dessen, was die echte Hardware 
hergibt.
#4399851
Lesenswert?

Fabian S. schrieb:
> Zwei Sachen: Ist das nur ein Fehler gewesen, dass es beim 2. Befehl
> hinten .2.2 heißt? Oder habe ich was übersehen?

Sorry, das war ein "Copy&Waste"-Fehler.

> Und dann läuft auf der Kiste wie gesagt OpenWRT, sprich nur Busybox nc,
> was soweit ich das eben rausfinden konnte kein -s und kein -l kann,
> zudem gibt es lsof nicht. Gut, letzteres könnte ich vermutlich mit
> einbauen, aber das Busybox nc kann kein Server.

Ja, Busybox. Da wird's schnell mal eng.

> Eine ähnliche Idee hatte ich aber auch schon: Und zwar kann man quasi
> das gleiche auch bei ping machen mit -I.

Das habe ich als erstes probiert.

> Wenn ich dort jedoch ein
> Interface oder eine IP angebe bekomme ich nie ne Antwort, nicht mal wenn
> ich ein ping an die IP des gleichen Interfaces mache. Keine Ahnung was
> da schief läuft.

Hat auf 'nem ausgewachsenen Linux problemlos funktioniert.
OP #4399857
Lesenswert?

Hmm naja, danke für die Tips, scheint aber nicht so recht zu 
funktionieren. Wollte auch gerade mal mit den Routen rumspielen und 
schauen, ob ich ihn überzeugt bekomme da was zu machen, aber das 
funktioniert aus einem mir vollkommen schleierhaften Grund auch nicht. 
Wenn ich versuche ne Route zu löschen, bekomme ich nur
1
# route del 192.168.1.0
2
route: SIOCDELRT: No such process
Keine Ahnung, was da im OpenWRT schon wieder schief läuft :-/
OP #4399870
Lesenswert?

Thorsten schrieb:
> Das geht indem Du ein Interface in einen anderen Network Namespace
> packst.
>
> man ip-netns
1
# ip netns list
2
BusyBox v1.23.2 (2015-12-15 21:26:31 CET) multi-call binary.
3

4
Usage: ip [OPTIONS] {address | route | link | } {COMMAND}
5

6
ip [OPTIONS] OBJECT {COMMAND}
7
where OBJECT := {address | route | link | }
8
OPTIONS := { -f[amily] { inet | inet6 | link } | -o[neline] }
Ich nehme mal an, dass auch hier Busybox das nicht überstützt...
#4399874
Lesenswert?

Fabian S. schrieb:
> Hmm naja, danke für die Tips, scheint aber nicht so recht zu
> funktionieren. Wollte auch gerade mal mit den Routen rumspielen und
> schauen, ob ich ihn überzeugt bekomme da was zu machen, aber das
> funktioniert aus einem mir vollkommen schleierhaften Grund auch nicht.
> Wenn ich versuche ne Route zu löschen, bekomme ich nur
>
1
# route del 192.168.1.0
2
> route: SIOCDELRT: No such process

Du willst ja eine Route auf ein Netzwerk löschen:
1
# route del -net 192.168.1.0
OP #4400468
Lesenswert?

Lukas S. schrieb:
> Ich hab zwar glaubich deine Frage nicht ganz verstanden, aber vieleicht
> suchst du das hier: https://wiki.ubuntuusers.de/Netzwerkbr%C3%BCcke

Ähhh ja und vermutlich nein :P
Dann würden die Pakete ja im Kreis wandern :D Die Brücke zwischen den 
beiden Netzwerkkarten habe ich ja schon in Hardware.
Also nochmal anders: Ich habe zwei Netzwerkkarten in einem Rechner, die 
Über ein Cross-Over Kabel verbunden sind. Ich will diese Verbindung nun 
testen. Wie schicke ich Daten über die Leitung, ohne dass diese direkt 
intern ans Ziel geschickt werden, denn das Ziel ist der Rechner ja 
selbst.
#4400630
Lesenswert?

Fabian S. schrieb:
> Also nochmal anders: Ich habe zwei Netzwerkkarten in einem Rechner, die
> Über ein Cross-Over Kabel verbunden sind. Ich will diese Verbindung nun
> testen. Wie schicke ich Daten über die Leitung, ohne dass diese direkt
> intern ans Ziel geschickt werden, denn das Ziel ist der Rechner ja
> selbst.

Indem man eine Virtuelle Maschine (VM) aufsetzt und der diese Karte 
komplett übergibt. Auf einem modernen PC kein Problem, auf ARM geht das 
IMHO eher nicht so ohne weiteres.
OP #4400887
Lesenswert?

Wie gesagt, ich weiß nicht für welche Konfiguration du das haben willst. 
Hier mal zwei Beispiele:
1
root@OpenWrt:/# route
2
Kernel IP routing table
3
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
4
192.168.3.0     *               255.255.255.0   U     0      0        0 eth1
5
root@OpenWrt:/# ifconfig eth0 192.168.1.1
6
root@OpenWrt:/# ifconfig eth1 192.168.1.2
7
root@OpenWrt:/# route
8
Kernel IP routing table
9
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
11
192.168.1.0     *               255.255.255.0   U     0      0        0 eth1
Gast #4401025
Lesenswert?

Wie schon gesagt wird eine lokale (innerhalb eines Network Namespaces) 
Adresse nie über ein Interface geroutet. Das Einzige was Du noch tun 
könntest, wenn es nur darum geht festzustellen, ob die Verbindung 
funktioniert, wäre einen RAW-Socket zu verwenden, diesen an das 
Netzwerkinterface zu binden und über diesen dann Ethernet-Päckchen 
direkt zu versenden. Mittels tcpdump & Co könntest Du dann üerprüfen, ob 
diese auf dem anderen Interface ankommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren