Ermitteln der IP-Adresse über die Pakete gesendet werden



  • Hallo,

    ich versuche die IP-Adresse des Interfaces zu ermitteln, über das Pakete an eine Zieladresse gesendet werden.

    Also:

    ich habe z.B. eth0 - 192.168.1.1 und eth1 - 192.168.2.1

    jetzt habe ich ein Paket mit der Zieladresse 192.168.1.2
    wie kann ich unter c++ jetzt abfragen über welches Interface gesendet wird?

    Gesucht ist also idealerweise eine Funktion die als Eingabe eine Zieladresse (z.B. 192.168.1.2) bekommt und als Ergebnis die Adresse des lokalen Interfaces ausgibt über die gesendet wird (hier z.B. 192.168.1.1).

    ich hoffe ich konnte mein Problem einigermaßen verständlich machen.

    Grüße
    Lummi



  • Über die Netmask kannst du das rausfinden



  • es gibt da ein Protokoll welches genau diese Aufgabe übernimmt: ARP ( oder RARP) (Reverse) Adress Resolution Protocol. Wie man an die Funktionalität kommt, weiss ich nicht



  • naja ich kann dir zwar nicht sagen wie du das konkret in C++ implementieren kannst, aber der Weg führt dich zwangsläufig über die Routingtabelle.

    du musst für einen Eintrag der Routingtabelle aus der IP und der Netzmask des jeweiligen Eintrages die Netzkennung errechnen (sollte eigentlich mit der IP identisch sein) und diese Netzkennung mit der vergleichen die sich aus der IP des konkreten Paketes und der Netzmaske des Routingeintrages ergibt. Stimmen diese beiden Netzkennungen überein ist der passende Routingeintrag. Darin steht dann auch das Interface. wie die Netzkennung berechnet wird kann dir zum Beispiel dieser Subnet Rechner zeigen http://www.trinler.de/de/service/technik/ipcalc.html

    kleines Beispiel:

    ich habe folgende Routingtabelle ( ip route show)
       Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    1) 192.168.101.0   0.0.0.0         255.255.255.128 U         0 0          0 eth0
    2) 192.168.102.0   0.0.0.0         255.255.255.0   U         0 0          0 eth1
    3) 192.168.210.0   192.168.101.10  255.255.255.0   UG        0 0          0 eth0
    4) 0.0.0.0         192.168.102.10  0.0.0.0         UG        0 0          0 eth1
    
    Dest-IP Paket an das gesendet werden soll 192.168.210.200
    
    1) Netzkennung der Route: 192.168.101.0 , Netzkennung Paket: 192.168.210.128
    2) Netzkennung der Route: 192.168.102.0 , Netzkennung Paket: 192.168.210.0
    3) Netzkennung der Route: 192.168.210.0 , Netzkennung Paket: 192.168.210.0
       --> stimmt überein --> eth0
    

    aber wie gesagt, wie du in C++ auf die Routingtabelle zugreifen kannst, weiß ich leider auch nicht.

    Hoffe konnte trotzdem einen Ansatz aufzeigen, Grüße Scoob



  • scooby doo schrieb:

    aber wie gesagt, wie du in C++ auf die Routingtabelle zugreifen kannst, weiß ich leider auch nicht.

    /proc/net/route

    aber am besten mal in den quelltext von /sbin/route gucken



  • Hallo,

    Danke für eure Antworten und sorry, dass ich mich erst so spät melde...hatte ein verlängertes WE :-).

    Ich werde morgen mal versuchen über den Quelltext von /sbin/route weiter zukommen.

    Werde dann meine Ergebnisste hier kundtun.

    bis dahin
    lummi



  • Hallo,

    also das mit dem Auslesen des Routingtables über /proc/net/route funktioniert.

    ich habe jetzt eine Funktion, die mir zu gegebener Zieladresse den Namen des Interfaces liefert über das gesendet wird.

    Zu diesem Interface kann ich mir jetzt die IP-Adresse geben lassen.
    Soweit funktioniert das ganz gut, das problem sind jetzt logische Interfaces wie z.B. eth0:1.
    Im Routingtable stehen nur die Hauptinterfaces also eth0.

    wie kann ich jetzt an die Adresse von eth0:1 kommen bzw, wie kann ich feststellen ob über eth0 oder eth0:1 gesendet wird.

    Grüße
    Lummi


Anmelden zum Antworten