Forum: PC-Programmierung ARP Cache mit zweiter IP ergaenzen


von Matthias S. (Gast)


Lesenswert?

Guten Abend Forum,

ich habe seit laengerer Zeit ein Problem in der Schublade, dass ich 
regelmaessig mal auspacke, ueber Suchmaschinen nach Informationen suche 
und meine Literatur durchforste, leider ohne Erfolg.

Zur Sache, ich benoetige fuer meinen Desktop eine zweite, intern 
adressierbare IP-Adresse, welche neben dem tcp/ip-Stack des OS genutzt 
werden kann.

Im Forum erhielt ich den Hinweis, dass dies theoretisch moeglich waere, 
indem ich den ARP Cache durch Senden von ARP-Replies erweitern koennte.

ARP ist fuer die Aufloesung von IP-Adressen in MAC-Adressen zustaendig. 
Somit waere der Grundgedanke, wenn ich es richtig verstanden habe, dem 
Cache einfach zu sagen ... Hier ist die MAC-Adresse, bspw. vom Interface 
'wlan0', verbunden mit der 'eigentlich' zuvor ueber den ARP-Request 
angefragten IP, die die gewuenschte zweite IP ist.

In diesem Zusammenhang habe ich einen ARP-Client in C geschrieben, der 
eben jenen Reply sendet, erfolgreich.

Die in dem Programm eingebauten 'Debug'-Funktionen geben in der Konsole 
alle eine Erfolgsmeldung zurueck.

Gesendete ARP-Pakete als solche sehen tip top aus.

Problem an der Sache, wie ich es drehe und wende, mein Cache hat bislang 
nicht einmal eine Aenderung vorgenommen, wobei ich Devices 
[eth0;wlan0;loopback] und MAC-Adressen [eth0;wlan0;loopback und eine 
gaenzlich andere] mehrfach variiert habe.

Laut Internet gibt es verschiedene Problemausloeser, welche ebenfalls 
Stein des Problems sein koennen. Vom IP-Forwarding, ueber den 
Promiscuous-Mode der Karte, ueber ueber ueber.

Soweit ich das beurteilen kann, fallen diese Punkte aber weg oder wurden 
entsprechend abgeaendert.

Frage, ist dies ueberhaupt ein Weg, dem System eine zweite IP zuzuweisen 
und falls nein, wuerde ich mich ueber Tipps, Anregungen oder dergleichen 
sehr freuen.

Sinn und Zweck des Ganzen ist keine boese Absicht, sondern der Wunsch 
einen tcp-Handshake in C mittels des Einsatzes von packet-Sockets 
nachzuprogrammieren. Ich habe mich dafuer interessiert, wie die Sache 
'unter der Haube' funktioniert und soweit auch alles ans Laufen 
bekommen. Problem ist nur, dass sich mein Programm beim System 
zurueckmeldet und der Stack sagt -logischerweise- 'Noe, diesen Handshake 
habe ich nicht initiiert, also weg damit'

von Konrad S. (maybee)


Lesenswert?

Matthias S. schrieb:
> Frage, ist dies ueberhaupt ein Weg, dem System eine zweite IP zuzuweisen

Nein. Wenn du eine IP in einem weiteren Subnet brauchst, dann einfach 
sowas:
1
ifconfig eth0:A 10.11.12.13
und um sie wieder loszuwerden:
1
ifconfig eth0:A 0
Das Stichwort lautet "Pseudo-Interface".

von asdfasd (Gast)


Lesenswert?

Um den ARP-Cache zu manipulieren musst du kein eigenes Programm 
schreiben.  Das Kommando "arp" erledigt das (man arp).  Z.Bsp. "arp -s 
<ip> <mac> pub" legt einen Eintrag an.  Das pub-Flag definiert, dass das 
Kernel auch externe ARP-Request für die <ip> beantworten soll (aka 
Proxy-ARP - ohne "pub", würde der Eintrag nur bei rausgehenden Paketen 
die ARP-Anfrage umgehen[1]).

Was du aber wohl möchtest, ist ein Interface mit mehreren IPs.  Die 
moderne Methode ist "ip addr add <ip> dev <interface>" (man ip-address). 
Die etwas ältere die Alias-Interfaces a la "ifconfig eth0:<id> <ip>" 
(man ifconfig).



[1] Wurde früher (pre-DHCP) gern von simplen Netzwerkgeräten benutzt, um 
sich eine IP zuweisen zu lassen.  Die merkten sich einfach die IP des 
letzten, direkt an sie adressierten (MAC-Layer!) Paketes.  Dazu wurde 
auf irgendeinem Rechner mittels "arp -s" händisch ein temporärer Eintrag 
für das Gerät angelegt (MAC-Addr stand auf dem Gehäuse) und es 
anschließend einmal angepingt.  Das Gerät merkte sich die IP und 
beantwortete auch künftige ARP-Anfragen dafür.  Fertig war die 
IP-Konfiguration.

von Konrad S. (maybee)


Lesenswert?

asdfasd schrieb:
> Fertig war die
> IP-Konfiguration.

Ömmm ... nein!
Das bewirkt erstmal nur, dass das Subnet über die Information verfügt, 
wohin - d.h. an welche MAC-Adresse - Pakete für diese IP-Adresse 
geschickt werden sollen. Das bedeutet noch nicht, dass etwas bereit wäre 
diese Pakete anzunehmen. Zu dieser MAC-Adresse muss ja noch nicht mal 
Hardware existieren.

von Matthias S. (Gast)


Lesenswert?

Konrad S. und asdfasd schrieben:

>ifconfig eth0:A 10.11.12.13

>"ifconfig eth0:<id> <ip>"

Perfekt, vielen Dank an Euch!

>Das bedeutet noch nicht, dass etwas bereit wäre
>diese Pakete anzunehmen.

Innerhalb des Subnets habe ich die letzte Ziffer meiner bestehenden ip, 
passend zum dazugehoerigen interface, einfach um eins erhoeht.

Lt. 'ip addr' ist das Pseudointerface bekannt, also noch einen 'ping' 
hinterher geschickt, mit dem Resultat, dass die zweite IP problemlos 
angesprochen werden kann. LAEUFT!

Nun habe ich etliche Stunden ueber dem in C geschriebenen Client 
gebruetet, damit er selbiges erledigt und jetzt funktioniert es mit 
einer Zeile in der Konsole.

Aber davon mal abgesehen, dass Programmieren hat Spaß gemacht und sein 
erstes erfolgreich gesendetes ARP-Paket ueber den Ether flitzen zu 
sehen, hatte auch was fuer sich.

Habt Ihr Tipps, was evtl. falsch laufen kann, wenn das ueber den Client 
gesendete Paket definitiv in Ordnung ist?

von Konrad S. (maybee)


Lesenswert?

Matthias S. schrieb:
> Habt Ihr Tipps, was evtl. falsch laufen kann, wenn das ueber den Client
> gesendete Paket definitiv in Ordnung ist?

Falls sich ein Rechner im Subnet für das ARP-Paket interessiert hat, 
dann findet sich ein Eintrag im ARP-Cache. Der lässt sich mit
1
arp -a
abfragen.

von Daniel A. (daniel-a)


Lesenswert?

Matthias S. schrieb:
> Habt Ihr Tipps, was evtl. falsch laufen kann, wenn das ueber den Client
> gesendete Paket definitiv in Ordnung ist?

Mir ist dies bereits gelungen: https://github.com/Daniel-Abrecht/DPA-UCS

Interresant wäre, ob das Programm bei dir lauft. Compiliren kann man es 
mit "make linux" und starten mit "sudo ./bin/linux" .  Die IP kann in 
src/main.c eingestellt werden. Danach sollten andere Computer die IP 
anpingen können, und einen Webserver mit 404 seite gibts auch. Es kann 
auch ohne TCP support Compiliert werden, mit "make NO_TCP=1 linux" oder 
ohne ICMP, wenn man die Zeile im makefile auskommentiert.

Wenn mein Programm lauft kann man die Unterschiede in den gesendeten 
Daten und die Socket optionen von meinem und deinem Programm 
vergleichen. Falls nicht, gibt es anderswo ein Problem.

Viele router senden keine Ethernetframes mit identischer source und 
destination mac weiter.

von Matthias S. (Gast)


Lesenswert?

Daniel A. schrieb:

>Viele router senden keine Ethernetframes mit identischer source und
>destination mac weiter.

Aehm, wieso Router? Ich nutze zwar das interface 'wlan0', aber der 
Client sendet vom Desktop aus direkt auf die IP des Subnetzes, also an 
meinen Rechner und nicht ueber die Adresse des Routers.

Bsp.:
lokale IP fuer iface wlan0 127.0.0.101
IP des Routers             127.0.0.1

Wenn mein Client an die 101 sendet, geht das doch nicht nochmal ueber 
den Router, oder?

von Matthias S. (Gast)


Lesenswert?

ich selber schrieb:

>aber der Client sendet vom Desktop aus direkt auf die IP des Subnetzes

Subnetz vom Router! Also geht es doch drueber, wenn ich mir das jetzt 
nochmal durch den Kopf gehen lasse.

Ich glaube ich sollte mir mal die Logs vom Router ansehen.

von Konrad S. (maybee)


Lesenswert?

Matthias S. schrieb:
> Client sendet vom Desktop aus direkt auf die IP des Subnetzes

Nein. Er sendet an die MAC-Adresse, die sich für diese IP-Adresse 
zuständig erklärt hat. Das könnte ein Router sein.

Matthias S. schrieb:
> lokale IP fuer iface wlan0 127.0.0.101
> IP des Routers             127.0.0.1

Pakete an 127.x.x.x verlassen den Rechner nicht.

von Matthias S. (Gast)


Lesenswert?

Konrad S. schrieb:

>Pakete an 127.x.x.x verlassen den Rechner nicht.

Ist mir klar, ich wollte hier nur nicht mit meinen richtigen IPs 
rumhantieren.

von Konrad S. (maybee)


Lesenswert?

Matthias S. schrieb:
> Ist mir klar,

Dann nimm doch den 192.168.x.x-Bereich, damit machst du nichts falsch.

von Daniel A. (daniel-a)


Lesenswert?

Wenn mit Packet Sockets packete über das Interface wlan0 gesendet 
werden, kommen diese beim Wlan router an. Dieser muss es dann an die 
Ziel-mac senden. Also zum rechner, von welchem dieses gekommen ist, wenn 
quelle=ziel. Nur machen das viele router und switches bei diesem 
Spezialfall nicht.

von Matthias S. (Gast)


Lesenswert?

Konrad S. schrieb:

>Dann nimm doch den 192.168.x.x-Bereich, damit machst du nichts falsch.

Okay, dass die 127.er nicht die Betreffenden sind, haette ich angesichts 
der Problemstellung vielleicht dazu schreiben sollen, mea culpa.

Die 192.168 er sind ebenso generisch/standardisiert und waeren auch 
gegangen.

Daniel A. schrieb:

>Wenn mit Packet Sockets packete über das Interface wlan0 gesendet
>werden, kommen diese beim Wlan router an. Dieser muss es dann an die
>Ziel-mac senden. Also zum rechner, von welchem dieses gekommen ist, wenn
>quelle=ziel. Nur machen das viele router und switches bei diesem
>Spezialfall nicht.

Wie bereits geschrieben, glaube ich langsam, dass der Router des Pudels 
Kern ist. Ich werde gleich mal in dessen LogFiles sehen und gucken, ob 
ich etwas a la ARP Cache Poisoning Versuch wurde vereitelt sehe.

Was anderes, Du hast geschrieben ich koenne Deinen Code kompilieren. 
Ganz ehrlich, wenn es eine kleine Source-File waere, die ich mal eben 
durchsehen koennte, gerne. Aber dass Teil fasse ich so auf die Schnelle 
nicht an.

Ich unterstelle Dir hier nichts schlechtes, Gott bewahre, aber mal eben 
leichtfertig > SUDO dreißig Seiten fremden Code auf meinem System 
ausfuehren... Mache ich nicht.

Was ich Dir anbieten kann, ich schicke Dir meinen Code fuer den ARP 
Reply und Du fuehrst ihn aus. Schneller, sicherer <weil nur eine Seite 
Code> und kommt aufs GLeiche raus.

von Daniel A. (daniel-a)


Lesenswert?

Matthias S. schrieb:
> Was ich Dir anbieten kann, ich schicke Dir meinen Code fuer den ARP
> Reply und Du fuehrst ihn aus

Ja, das fände ich super. Ich werde aber erst am abend dazu kommen.

von Konrad S. (maybee)


Lesenswert?

Matthias S. schrieb:
> Okay, dass die 127.er nicht die Betreffenden sind, haette ich angesichts
> der Problemstellung vielleicht dazu schreiben sollen, mea culpa.
>
> Die 192.168 er sind ebenso generisch/standardisiert und waeren auch
> gegangen.

Nicht "wären auch gegangen", denn mit den 127.x.x.x wäre es nicht 
gegangen, da diese den Rechner nie verlassen und auch nie ARP machen.

von Matthias S. (Gast)


Lesenswert?

Konrad S. schrieb:

>Nicht "wären auch gegangen"

Waeren auch gegangen im Sinne von hier veroeffentlichen, dass war 
gemeint.

Genauso ungefaehrlich.

Also wenn ich nicht wuesste, was der localhost, fuer eine IP hat, dann 
sollte ich nicht mit ARP "rumspielen", waere zumindest von abzuraten.

von Konrad S. (maybee)


Lesenswert?

Es macht keinen Sinn über den Anstellwinkel von Rotorblättern eines 
Helikopters zu referieren und dabei auf ein Auto zu zeigen - das Auto 
wird dadurch nicht flugfähig.

von Planlos (Gast)


Lesenswert?

Matthias S. schrieb:
> Sinn und Zweck des Ganzen ist keine boese Absicht, sondern der Wunsch
> einen tcp-Handshake in C mittels des Einsatzes von packet-Sockets
> nachzuprogrammieren.

D.H. du willst den TCP-Stack des Betriebsystems garnicht verwenden, 
sondern deinen eigenen daneben ausrollen?

Und bei eingehenden Paketen soll dann automatisch entschieden werden, ob 
das Ethernet-Frame für den Betriebsystem-IP-Stack ist, oder für deinen 
eigenen?

Soweit korrekt?

Grobe Idee, ungetestet:
eine virtuelle Ethernet-Bridge (btctl create ....) vorschalten, darin 
sowohl das echte eth-device als auch ein virtuelles für deine 
Experimente verschalten. (z.B. ip tuntab add oder tunctl)
dem virtuellen verpasst du eine neue, erfundene MAC.

Schon kannst du am virtuellen Device beliebig mit Packet-sockets, 
eigenem ARP usw. spielen, ohne dass sich das mit dem Linux-Eigenen 
TCP/IP-Stack in die Quere kommt.

von Matthias S. (Gast)


Lesenswert?

Conrad S. schrieb:

>Dann nimm doch den 192.168.x.x-Bereich, damit machst du nichts falsch.

Ich habe den Bereich 192.168.x.x genutzt!

Nur hier, habe ich 127.XX geschrieben. Das es sich hierbei um zwei 
grundverschiedene Adressbereiche handelt ist mir klar.

Nur beide haben etwas gemeinsam. Es sind beides standardisierte 
Adressbereiche. 127 kennt jeder fuer Localhost und 192.168 duerfte jeder 
kennen, der ein Heimnetz mit einem Router betreibt.

Gleichwohl wollte ich meine 192.168.x.x hier nicht posten, eigentlich 
gehoppst, wie gesprungen, weil man mit diesen Adressen ebenso wenig 
anfangen kann. Daran habe ich aber im Moment nicht gedacht, weil es 
schon frueher Morgen war/ist und ich langsam groggy bin.

Localhost 127.0.0.1 nur intern
Lokales wlan 192.168.2.101 funkt hingegen zum
Router 192.168.2.1 und der funkt mit seiner richtigen IP im Netz

und ARP hat mit IP gar nichts zu tun, sondern mit der Aufloesung von MAC 
hin zu IP-Adressen, durch einen allgemeinen Broadcast. Dieser beinhaltet 
die Frage, welcher der "Nachbarn" die gesuchte IP hat und dieser 
antwortet mit seiner IP und der im Endeffekt angefragten MAC.

von Matthias S. (Gast)


Lesenswert?

Planlos schrieb:

>Und bei eingehenden Paketen soll dann automatisch entschieden werden, ob
>das Ethernet-Frame für den Betriebsystem-IP-Stack ist, oder für deinen
>eigenen?

>Soweit korrekt?

Nein, im Prinzip habe ich das Problem, wie oben schon beschrieben, durch 
den Einsatz von 'ifconfig' loesen koennen.

Durch das neue Pseudointerface gibt es keinen Grund mehr einen 
Entscheidungsprozess zu veranlassen.

Mein Progamm sendet Daten an dieses neu geschaffene Interface und der 
tcp/ip-Stack bleibt außen vor, da ich beabsichtige, den Handshake selbst 
vom Programm aus durchfuehren zu lassen, so der Plan.

Die virtuelle Ethernet-Bridge laesst sich nicht mit einem so geringen 
Aufwand umsetzen, insofern geht meine Praeferenz jetzt erstmal zu der 
quick & dirty Methode.

Allerdings klingt Dein Vorschlag sehr nach einer schoenen Testumgebung, 
welche sich anzuschauen sicher lohnen wuerde.

von .... (Gast)


Lesenswert?

> Mein Progamm sendet Daten an dieses neu geschaffene Interface und der
> tcp/ip-Stack bleibt außen vor, da ich beabsichtige, den Handshake selbst
> vom Programm aus durchfuehren zu lassen, so der Plan.

Ein alias-Interface wird genauso vom IP-Stack des BS behandelt,
wie das reale Interface. D.h. er bleibt nicht "aussen vor".
Wie kommst Du den darauf?

von Daniel A. (daniel-a)


Lesenswert?

Daniel A. schrieb:
> Matthias S. schrieb:
>> Was ich Dir anbieten kann, ich schicke Dir meinen Code fuer den ARP
>> Reply und Du fuehrst ihn aus
>
> Ja, das fände ich super. Ich werde aber erst am abend dazu kommen.

Gut, ich habe es ausprobiert. Dass nicht zuerst auf einen ARP-Request 
gewartet wird ist zwar nicht Ideal, es funktioniert bei mir aber, sofern 
vorher ein arp request erfolgte. Ich habe folgende Ausgabe erhalten:

1
daniel@daniel-Inspiron-7720:~/tmp$ sudo ./client 
2
ARP-Reply No.[0] transmitted successfully...
3
ARP-Reply No.[1] transmitted successfully...
...
1
ARP-Reply No.[9] transmitted successfully...
2
daniel@daniel-Inspiron-7720:~/tmp$ arp -a
3
? (192.168.1.1) at 00:25:86:e1:e2:96 [ether] on wlan0
4
daniel@daniel-Inspiron-7720:~/tmp$ ping 192.168.1.29 -c 1
5
PING 192.168.1.29 (192.168.1.29) 56(84) bytes of data.
6
From 192.168.1.112 icmp_seq=1 Destination Host Unreachable
7
8
--- 192.168.1.29 ping statistics ---
9
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
10
11
daniel@daniel-Inspiron-7720:~/tmp$ arp -a
12
? (192.168.1.29) at <incomplete> on wlan0
13
? (192.168.1.1) at 00:25:86:e1:e2:96 [ether] on wlan0
14
daniel@daniel-Inspiron-7720:~/tmp$ sudo ./client 
15
ARP-Reply No.[0] transmitted successfully...
16
ARP-Reply No.[1] transmitted successfully...
...
1
ARP-Reply No.[9] transmitted successfully...
2
daniel@daniel-Inspiron-7720:~/tmp$ arp -a
3
? (192.168.1.29) at 60:36:dd:26:4a:bc [ether] on wlan0
4
? (192.168.1.1) at 00:25:86:e1:e2:96 [ether] on wlan0
5
daniel@daniel-Inspiron-7720:~/tmp$

Das Problem wird vermutlich beim Router liegen. Ich verwende manchmal 
ein Physikalisches Loopback-Device um solche Probleme zu verhindern. Da 
dieses Programm sowieso immer den selben ARP-Reply sendet, könnte man 
ebensogut auch mit "sudo arp -s 192.168.1.29 60:36:dd:26:4a:bc" einen 
eintrag im ARP-Cache platzieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.