Lokal (von Python Script) generierten Traffic über mehrere (zusätzliche) IPv4-Adressen schicken

  • Guten Tag,


    ich habe eine Python-Script, welches mit verschiedenen Endpoints einer API kommuniziert - leider teilen sich diese IP Endpoints ein IP-Rate Limit.


    Mein Python-Script spawned mehrere Prozesse mittels (multiprocessing) - da ich es simpel halten will bzw. es nicht notwendig ist eine "pipe" zwischen den "Prozessen" zu haben, ist ein "Timing" nicht wirklich möglich um dieses IP-Rate Limit mittels "sleep" einzuhalten - und so wurde mir von den API-Owner geraten einfach mehrere Public Source-IPs zu verwenden.


    Meine Idee war, dass ich einfach jedem "Prozess" einen eigenen D-Port zuweise (44311, 44312, ...), mittels iptables würde ich diese Packages dann "MARKieren" und dann mittels "iproute2" das entsprechende Interface zuweise - irgendwie müsste ich natürlich auch noch den Port auf den von der B-Stelle erwarteten Port ändern (443)


    Also es würde dann in etwa so aussehen um die Pakete zu "MARKieren":


    iptables -A OUTPUT -p all --dport 44311 -j MARK --set-mark 11

    iptables -A OUTPUT -p all --dport 44312 -j MARK --set-mark 12

    ...


    nun den Eintrag im "iproute2":

    echo 11 ipv4´_1 >> /etc/iproute2/rt_tables

    echo 12 ipv4´_2 >> /etc/iproute2/rt_tables

    ...


    hier füge ich die fwmark hinzu:

    ip rule add fwmark 11 table ipv4_11

    ip rule add fwmark 12 table ipv4_12

    ...


    und hier noch die "IP Route" Regel um den Traffic über das entsprechende eth-Interface zu schicken

    ip route add default via eth1 table ipv4_11

    ip route add default via eth2 table ipv4_12

    ...


    Jetzt wäre es interessant ob sich ein "Netzwerker" dies anschauen könnte - ob mein Ansatz funktionieren würde und ein Tipp wie ich den Port wieder auf 443 zurückändern kann --> ich vermute hier ist DNAT notwendig und das wäre dann nur bei "Prerouting" sowie "Output" möglich, mangels fehlenden "Prerouting" wird es wohl beim "Output" sein müssen.


    Falls jemand einen anderen Ansatz hätte, bin ich natürlich sehr offen dafür :)


    P.S: die URL der API geht leider nur mittels "domainname", da sich die IPs dahinter jederzeit ändern können bzw. ein "Loadbalancer" mit mehreren Public IPs verwendet wird.



    Also ein Beispiel wäre:


    https://api.domainname.com/api/endpoint_1

    https://api.domainname.com/api/endpoint_2

    https://api.domainname.com/api/endpoint_x (x = 3+)


    Natürlich würde es auch gehen einfach mehrere Server zu verwenden, aber dies würde mein Budget sprengen, da ich einen RS8000 G9 verwende und eine zusätzliche IP nur 1-2€/Monat anstatt ~40€/Monat (Angebot). - Speziell, wenn ich 2-4 Server benötigen würde ^^


    Danke und ich bin schon gespannt auf euren Input :)

  • Natürlich würde es auch gehen einfach mehrere Server zu verwenden, aber dies würde mein Budget sprengen, da ich einen RS8000 G9 verwende und eine zusätzliche IP nur 1-2€/Monat anstatt ~40€/Monat (Angebot). - Speziell, wenn ich 2-4 Server benötigen würde ^^

    Warum gehst du dem API Owner nicht mal auf den Keks, dass er IPv6 deployen soll? Da hättest du 2^64 Adressen zur Verfügung. Ganz ohne Aufpreis.

    "Denn der radikalste Zweifel ist der Vater der Erkenntnis."

    -Max Weber

    Haha 1
  • Mit Deiner eigentlichen Frage kann ich dir leider nicht helfen. Aber als Gedankenanstoß: Ich nutze in Fällen von Ratelimits gerne Proxies, um Anfragen über mehrere IPs zu streuen.