Verbindung über bestimmte IP

Hallo

Ich habe ein sehr einfaches Programm. Ein Server der auf eingehende Verbindungen wartet. Sobald eine Verbindung aufgebaut ist, wird über eine HTTP GET Methode dem Server eine URL übergeben.

Diese URL soll der Server jetzt anwählen.

Das funktioniert bis jetzt super.

Mir wurden jetzt 10 Ip Adressen gegeben, die verwenden werden sollen für den Aufruf der URLs. Das heißt Ausgehende Verbindungen zu den URLs sollen immer nur über eine von diesen 10 IP Adressen erfolgen.

Wie sage ich jetzt Java das es z.b. 123.123.123 als ausgehende Adresse verwenden soll?

Die ausgehende IP-Adresse lässt sich nicht vom Programm festlegen, sondern ergibt sich aus der Konfiguration des Betriebssystems im Zusammenhang mit der Routingtabelle.
(Abweichungen davon sind mit einem eigenen TCP/IP-Stack durchaus möglich und wird auch von Pen-Testing-Tools verwendet. Mir wäre aber keine Möglichkeit bekannt, dies in Java zu realisieren. Abgesehen davon erscheint es mir aus der gegebenen Aufgabenstellung auch nicht zweckmäßig.)

Btw.: 123.123.123 ist keine gültige IPv4-Adresse.

[QUOTE=cmrudolph]Die ausgehende IP-Adresse lässt sich nicht vom Programm festlegen, sondern ergibt sich aus der Konfiguration des Betriebssystems im Zusammenhang mit der Routingtabelle.
(Abweichungen davon sind mit einem eigenen TCP/IP-Stack durchaus möglich und wird auch von Pen-Testing-Tools verwendet. Mir wäre aber keine Möglichkeit bekannt, dies in Java zu realisieren. Abgesehen davon erscheint es mir aus der gegebenen Aufgabenstellung auch nicht zweckmäßig.)

Btw.: 123.123.123 ist keine gültige IPv4-Adresse.[/QUOTE]

Das 123.123.123 keine IP Adresse ist, ist mir schon klar. Mir gehts halt darum, das mir gesagt wurde. Der Server benutzt bestimmte IP Adressen um nach Außen eine Verbindung auf zu bauen. Diese bekomme ich in eine Text Datei. Das Problem ist wenn ich das jetzt mache, dann wird die Lokale Ip Adresse halt benutzt.

Ist das hie rnicht sowas? Hier wird doch auch genau gesagt welche Adresse verwendet werdne soll oder ?


HttpClientBuilder builder = HttpClients.custom();
Builder configBuilder = RequestConfig.custom();
configBuilder.setLocalAddress(InetAddress.getByAddress(new byte[] {85,2,(byte) 246,4}));
CloseableHttpClient httpClient = builder.setDefaultRequestConfig(configBuilder.build()).build();
HttpGet httpGet = new HttpGet("http://xy.com/");
CloseableHttpResponse response1 = httpClient.execute(httpGet);
//do something with the response
response1.close();

Ohne die Lib zu kennen, sieht so aus ja. Auch das JDK unterstütz das. Ersichtlich z.B. am Konstruktor der Klasse Socket:

                  int localPort) throws IOException```
Wenn du sagst, du bekommst eine Datei mit 10 Adressen. Hat der Host, auf dem Dein Programm läuft diese Adressen alle?!? Es sind nämlich natürlich nur die wählbar, die ein System auch hat. Ansonsten ist das ein Fall für Eure Netzwerktruppe (Stichwort NAT).

Wenn du zu Deiner Client-Lib mehr schreibst (ist das HTTPClient?), kann jemand vielleicht auch Code liefern.

Ok, offensichtlich kann Java das doch nativ.
Damit das funktioniert, braucht man aber eine sehr ungewöhnliche Netzwerkkonfiguration. Denn wenn man eine funktionierende Verbindung aufbauen möchte, gibt es regelmäßig nur genau eine zu einer beliebigen Zieladresse passende lokale IP-Adresse. Theoretisch könnte man natürlich mehrere IP-Adressen im selben Subnetz belegen, davon wäre im Betriebssystem aber nur eine mit einer Route für das zugehörige Subnetz belegt. Die einzige mir spontan einfallende halbwegs sinnvolle Anwendung wäre, wenn man mehr als 65535 Verbindungen gleichzeitig ermöglichen möchte.

*** Edit ***

D. h., dass du eine IP-Adresse nutzen möchtest, die dem Server nicht zugewiesen ist? Soll das ein Denial of Service-Tool werden?

Wow, hier bewegt sich ja doch mal wieder was in diesem Bereich - ich bin glatt überfordert …

Scherz mal bei Seite und Butter bei die Fische:

Grundsätzlich kann man, wie schon genannt wurde, einen Socket auch ohne lokales bind erstellen und dies dann manuell setzen. In wie weit das dann allerdings wirklich ein “Zwang” ist und zu einer SocketException führt oder, wie üblich, lediglich eine Bitte an den Stack darunter und die eigentliche Magie mal wieder Implementierungs-Detail der jeweiligen VM - nah, da möcht ich mich nicht so drauf festlegen.
Viel wichtiger dürfte es aber mit dem bereits angesprochenen Problem des Routings werden: selbst wenn die Maschine auf der dieser Code laufen soll 10 physische NICs hat und damit auch 10 MAC denen man jeweils eine eigene IP zuweisen kann - und es auch entsprechend viele Carrier-Anbindungen gibt (lässt man das alles über einen (NAT-)Router laufen baut der, wenn nicht fest vorgegeben, die Route eh wieder um - spätestens dürfte das aber der nächste Router der sich nicht mehr in deiner Gewallt befindet erledigen) - muss man noch dafür sorge tragen dass von jeder der einzelnen NICs das Ziel auch überhaupt erreichbar ist. Bedeutet als DNS, Route, etc. Mal davon abgesehen finde ich System mit mehr als 3 NICs schon sehr merkwürdig (2 für Redundanz oder Durchsatzsteigerung + 1 als Art “master-control”).

Zum zitierten: natürlich wird bei einer ausgehenden Verbindung als Quell-Adresse eine der physischen Adressen der Maschine oder eine Ecke weiter des ausgehenden NAT-Routers genutzt. Alles andere nennt man IP-Spoofing, dient in der regel zu rechtlich ziemlich fragwürdigen DDoS-Attacken und wird von uns (zumindest von mir, und bin mir sicher viele sehen es ähnlich) eh nicht supportet.

– edit –

Mal davon abgesehen: ich weis das ip-spoofing trauriger weise immer wieder funktioniert. Nur muss da ja dann schon auf ISP-Ebene was komplett falsch laufen wenn dieser so schlecht konfigurierte Router betreibt dass diese von einem bestimmten Anschluss dem ja eine IP zugewiesen ist über Pakete mit einer anderen Source-IP akzeptieren geschweige denn weiterleiten. Solche ISPs sollte man wegen Unfähigkeit vom Netz nehmen.

[ot][quote=Sen-Mithrarin]10 MAC denen man jeweils eine eigene IP zuweisen kann[/quote]
Man kann auch mit nur einer MAC-Adresse beliebig viele IP-Adressen haben. Das geht sogar unter Windows. Technisch ist (zumindest bei IPv4) ARP die Brücke zwischen MAC und IP und dort gibt es kein erzwungenes 1:1-Mapping.

Du meinst sicherlich, dass der NAT-Router die Quell-IP-Adresse verändert. Das ist richtig - die selbst festgelegte Quell-IP-Adresse spielt dann keine Rolle mehr. In der Regel* wird aber nach dem Heimrouter kein NAT mehr gemacht, sodass die Quell-IP erhalten bleibt.

Ich habe zuhause in meinem Server 5 NICs und 7 Netzwerke. Das läuft alles virtualisiert, aber die Firewall / der Router hat zu allen Netzen Zugriff, sodass die Maschine über 7 IP-Adressen verfügt. Hier allerdings mit jeweils eindeutigen Routen, wie in meinem letzten Beitrag schon erwähnt.

  • Ausnahmen sind VPN-Gateways oder auch mobile Einwahlverbindungen, bei denen private IP-Adressen vergeben werden.[/ot]

Moin,

[ot]ich habe auf meinem Server auch für jede SSL/Tomcat Instanz eine eigene öffentliche IP. Bevor SNI halbwegs funktionierte war das auch absolut üblich so. Und auch heute ist das nicht ungewöhnlich. Ich bin mir ziemlich sicher das es viele weitere Gründe geben kann warum ein Server auch mit nur einer NIC verschiedene Dienste auf verschiedenen IP-Adressen hat.[/ot]

Gruß
Fancy

@cmrudolph
Ich meinte eigentlich den nächsten Router der dann beim ISP steht der dafür sorgen sollte dass Pakete vom Quell-Anschluss auch dessen zugewiesene Quell-IP haben sollten. Ansonsten halt stillschweigendes drop der eigentlich fehlerhaften Pakete. Wenn das von ISPs konsequent umgesetzt werden würde hätte mam das Problem ip-spoofing von Privatanschlüssen nicht.

Das ist auch nicht wirklich ein Problem. Außer UDP-Datagrammen mit verschleiertem Absender und ein paar fehlgeleiteten SYN-ACKs passiert da nichts. Das taugt nicht mal für DOS-Angriffe.

Edit: Das mit den DOS-Angriffen nehme ich zurück. Für die Verschleierung eines SYN-Floodings kann man das sehr wohl nutzen. Voraussgesetzt das Ziel ist dafür anfällig.

Ah ok, ich hatte die Aussage allgemein verstanden. Gespoofte Pakete sollten natürlich vom ISP gefiltert werden.

Man kann IP-Spoofing bspw. auch nutzen, um einen Portscan zu machen und die Herkunft zu verschleiern. Ganz grob funktioniert das so: man versucht sich mit einem Port auf dem Ziel zu verbinden und setzt dann eine gefälschte Absender-IP ein. Die gefälschte IP-Adresse muss zu einem Host gehören, der online ist. Der Angreifer sendet nun regelmäßig Pakete zur gefälschten IP-Adresse und kann anhand der TCP-Sequenznummer herausfinden, ob der Port auf dem Zielsystem offen ist oder nicht.
Voraussetzung dafür ist, dass der TCP/IP-Stack seine Sequenznummern deterministisch vergibt (was OpenBSD z. B. nicht macht).

Sicherlich gibt es noch eine ganze Menge anderer Angriffsszenarien, bei denen man gespoofte IP-Adressen gut nutzen kann.

Naja, aber genau DAS scheint ja das Problem zu sein warum IP-spoofing immer noch in einem so großen Stil klappt - weil scheinbar eine entsprechende Prüfung der Pakete fehlt.

Ist es denn so, dass das im “großen Stil” geschieht? Ich habe in letzter Zeit nichts in den Medien gelesen, dass wieder eine “große IP-Spoofing-Welle” aufkam. :wink:

Werden wir auch nicht mehr erleben. Recht einfach begründet: wenn es überhaupt bekannt wird dann interessiert in der Regel die Art des Angriffs nicht da es nur allgemein als “Hacker-Angriff” extrem verallgemeinert wird, und in allen anderen Fällen wird es schlicht unbekannt bleiben. Und ich muss zugeben: es würde mich nur sehr minimal bis gar nicht interessieren beim täglichen Klick auf Heise dann hinter dem Headliner “Hacker-Angriff auf X” dann einen ziemlich langeweiligen Fachtext in die Richtung “… wurden die Dienste durch einen ip-spoofing-DDoS lahmgelegt. <hier jeden beliebigen uninteressanten Krams über ip-spoofing dranhängen>. …” zu lesen. Interessiert mich doch nicht ob da irgendein Script-Kiddie meinte einfach mal aufs gesamte Net quer um die Welt irgendwelche sinnfreien Pakete abzufeuern und damit nicht nur seine eigene Bandbreite und die seines Ziels zu belegen - sondern auch die unbeteiligter.
Und dadurch begründet sich auch das sich daran auch bis zur Ersetzung des Internet durch eine vollkommen neue Technologie nichts ändern wird. Es interessiert einfach keinen, obwohl es wie gesagt technisch so einfach umsetzbar und damit wie so manche Krankheiten oder Tierarten komplett ausrottbar wäre.