Custom Port für Bloonix-Satellite nutzen

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Custom Port für Bloonix-Satellite nutzen

    Moin Forum,

    ich habe versucht mir am WE selbst ein wenig die Finger schmutzig zu machen, bin aber leider gescheitert :( Ich möchte gerne einbauen, dass man Satelliten mit Port anlegen kann - bis dato geht das nur mit IP, was dann vom default Port ausgeht. Mein Usecase ist folgender:

    [ N Bloonix Server ] --> Port 1234 auf dsl.satellite.example.com --> VPN --> DSL --> Raspberry Pi Port 5464

    Ich will also einen VPN Server aufsetzen und von dort Ports zu raspberri py's über ein VPN forwarden, damit ich diese als Satelliten aus DSL Netzen nutzen kann. D.h. Die IP des VPN Servers wird mehrmals angegeben, die Satelliten selbst sind dann unter den verschiedenen Ports erreichbar. Ich könnte auch den Bloonix Server ins VPN hängen, das will ich aber aus diversen anderen Gründen nicht tun (u.a. weil dann alle Bloonix Server in einem Netz hängen und das wäre bei uns verboten).

    Leider akzeptiert die WebUI nur eine IP :( Könnt Ihr mir einen Tipp geben, welche Files ich ca. anfassen muss? Ich hab schon rel wenig Ahnung von Perl und bin ganz ohne Hilfe etwas aufgeschmissen.

    Falls das jemand stressfrei direkt einbauen kann bin ich gerne bereit dafür die Stunden zum verlangten Stundensatz (bitte per PM) zu bezahlen. Perfekt wäre, wenn dann direkt ein PR auf github dafür gestellt werden würde, damit Jonny das mergen kann.
    A service is only a service if its monitored.
  • Hi Jonny,

    es gibt pro interface (public IP) nur einen solchen Port - ich habe einen VPN Server, dort hängen alle DSL Satelliten dran (raspberri pys). D.h ich forwarde also eingehend aus dem Inet Port 1234 auf dem VPN Server nach Port 5460 auf dem Raspi (VPN Client) (genau genommen erlaube ich hier dann noch explizit nur den Bloonix-Server IPs das zu tun).

    D.h. ich kontaktiere also vom bloonix-server aus den VPN Server auf Port 1234 und lande auf Port 5460 auf dem Raspi.

    Nun habe ich viele Raspis und will halt nicht für jedes eine public IP verschwenden. Wenn ich das mit dem Port hinbekomme, dann könnte ich den VPN Server als Failover aufsetzen (zwei Server, zwei IPs) und wäre fertig.

    Ein weiterer Usecase wäre die Vermietung von Satelliten - hier würde ich bevorzugt pro Mitstreiter einen Satellite Prozess laufen lassen, welche ich mit Container o.ä. voneinander trenne. Das ginge nur, wenn der Server die Satelliten auf custom Ports ansprechen kann.
    A service is only a service if its monitored.

    The post was edited 2 times, last by pthurner ().

  • Bei mir zuhause (und bei diversen Mitstreitern) steht ein Raspberry Pi damit wird sehen können, wie die Webseiten usw aus DSL heraus funktionieren. Nun hab ich aber ja eine Dynamische IP auf meiner Fritz Box, und das Raspi ist dahinter.

    Der Agent kontaktiert nun den Server von selbst - Agenten will ich aber auf den Raspis gar nicht installieren. Es geht mir nur um Satelliten. Ein Satellit muss ja direkt vom Server erreichbar sein - daher ist meine Idee, das Raspi an ein VPN zu hängen und vom VPN Server einen Port (1234) an das Raspi via das VPN zu forwarden (5460).

    Dann habe ich einen Satelliten aus einem DSL Netz.

    Für die Vermietung (siehe gerade geöffneter anderer Thread) fände ich mehrere Satellite Prozesse praktisch - ich weiss nicht, ob das aus Security Sicht sein muss. Ich dachte es wäre ganz nett, wenn ich die alle in Docker starten kann und jeder "Mitstreiter am Community-Satellite-Hosting-Projekt" bekommt dann einen Port zugewiesen. Sollte jemand dann einen Bug im Satellite Code finden und diesen ausnutzen können, wären nur die eigenen Prozesse betroffen.
    A service is only a service if its monitored.
  • Stells Dir konkret so vor:

    1) "Ich bin ein Bloonix Server"
    2) Ich kontaktiere forward-to-dsl.example.com auf Port 1234
    3) forward-to-dsl.example.com bekommt die Anfrage auf eth0 1234
    4) forward-to-dsl.example.com Port Forwarded via IPtables via tun0 nach 10.10.0.5:5460
    5) 10.10.0.5 (raspi) bearbeitet die Anfrage und antwortet nach 10.10.0.1
    6) forward-to-dsl.example.com schickt die Antwort zurück an den Bloonix-Server

    Nun gibt es sagen wir 30 Stk raspberry Pi, 10.10.0.5, 10.10.0.6...
    Wenn ich zu forward-to-dsl.example.com:1234 gehe, komme ich zu 10.10.0.5:5460
    Wenn ich auf forward-to-dsl.example.com:1235 gehe, komme ich zu 10.10.0.6:5460
    [...]
    A service is only a service if its monitored.
  • Ich teste das ganze seit ca. 30 Tagen mit neun Bloonix Servern, wobei jeder Server zwei bis drei Checks pro Minute via das Raspi laufen lässt. Funktioniert einwandfrei - ich hab das neuste Raspi, das hat ganz schön Power (1,2 Ghz Quad Core mit 1GB RAM entspricht manchem normale Satelliten bei uns). Unabhängig davon sind manche Raspis auch alte Laptops o.ä. - Raspi ist hier nur ein Hardware-Beispiel. Einen Blick wert wäre auch das Banana Pi.

    Die Ergebnisse schwanken logischerweise mehr als bei einem Server in einem RZ - ist ja auch DSL. Von meinem hier aus habe ich Schwankungen von ca. 500ms für HTTPS auf unsere Website.

    Konkret kann man damit hervorragend Peering Probleme erkennen - wenn alle Telekom Raspis nicht mehr mit AWS reden können, bzw nur noch extrem langsam (passiert ab und zu mal), kann man das dort hervorragend sehen.

    Die Raspis sind jew. lokal wie folgt eingerichtet und dürfen nicht anders deployed werden:
    - nur mit Kabel an den Router
    - müssen in eingenem VLAN sein und dürfen die anderen Netze nicht erreichen
    - all das nochmal local auf dem raspi via IPtables

    Somit ist das imho weitestgehend save.
    A service is only a service if its monitored.
  • Du meinst mehrere IPv6 Adressen auf den VPN Server binden und die dann ans VPN weitergeben? Könnte man auch machen.. Find ich ein wenig aufwändig, um ehrlich zu sein. Ist es seitens des Bloonix Codes sehr viel Aufwand, den Port selbst bestimmbar zu machen?

    Statische ipv6 Adressen für die Raspis, die aus dem Inet erreichbar sind, werden nicht möglich sein. Das Raspi muss beim Mitstreiter einfach eingesteckt werden können und "go".

    Wenn das mit dem custom Port zu viel Action ist, wäre ipv6 de facto eine Ersatzlösung. An Adressen kommt man rel. günstig ran. Port wäre schon schöner, das skaliert halt wesentlich einfacher (port auf geht schneller als ein neues Netz beantragen und einrichten).
    A service is only a service if its monitored.

    The post was edited 2 times, last by pthurner ().

  • Ich habe noch ein wenig durch den Code gestöbert:

    check-http kann man ja normal auch vom agenten ausführen lassen. Damit er das mit Satelliten tut, wird check-http via check-by-satellite ausgeführt. Check-by-satellite hat den Port hardgecoded in: github.com/bloonix/bloonix-plu…s/check-by-satellite#L410

    Source Code

    1. - peerport => 5464,
    2. + peerport => $location->{port},


    Nun muss das location dict (hash in pl?) ja irgendwo her kommen, das passiert in sub get_locaitons:
    github.com/bloonix/bloonix-plu…s/check-by-satellite#L304

    Nach meinem Verständnis wird das Dict von ? in folgenden Zeilen abgeholt:
    github.com/bloonix/bloonix-plu…ck-by-satellite#L309-L314
    Der Rest von sub get_locations ist nach meinem Verständnis für Sortierungsaufgaben und caching foo (?) zuständig.

    Beim abholen des dicts ist mir unklar, welchen $fh (file handler?) er hier wohin aufmacht.

    Naheliegend ist (für mich), dass sich das ganze direkt an den Server wendet. Dort gibt es auch ein bisschen Code dafür:
    github.com/bloonix/bloonix-ser…oonix/Server.pm#L352-L356

    Fair enough - weiter zu:
    github.com/bloonix/bloonix-ser…oonix/Server.pm#L352-L356

    Sieht so aus, als wird dort alles abgeholt. Ein Blick in die DB verrät:

    Brainfuck Source Code

    1. MariaDB [bloonix]> select * from location;
    2. +----+-----------------+--------------------------------------+-------------------+---------+-----------+-------------+---------------------------------------------------------+
    3. | id | ipaddr | hostname | city | country | continent | coordinates | description |
    4. +----+-----------------+--------------------------------------+-------------------+---------+-----------+-------------+---------------------------------------------------------+
    5. | 1 | 1.2.3.4 | at.satellite.example.com | Vienna | AT | EU | 0,0 | www.edis.at KVM Server |


    D.h. wenn der server sagt get_locations bekommt er ein dict mit allen Feldern zurück die in der DB sind, auch das Feld coordinates, welches in der WebUI nicht existiert (und für alle Satellites leer ist).

    Nun zur WebUI (hier hörts bei mir leider recht schnell auf). Mein erster (grep) Blick fällt Richtung source/js/bloonix-locations.js, in source/js/class-lang müsste man wohl eine Übersetzung hinzufügen, in schema/mysql/location.sql braucht es das extra SQL Feld für Port, dann gibts noch lang/* (auch noch Übersetzungen?).

    public/js/bloonix.src.js scheint dann irgendwie compiliert zu werden.

    Soweit mein Überblick ;) Ich mache mich dann mal an einen Test-Umbau und melde mich, wenns / wos kracht. Ich denke alles bis auf dass man den Port in der WebUI einstellen kann sollte ich nun hinbekommen.
    A service is only a service if its monitored.
  • So habs. War total easy.. Stand zuvor wohl aufm Schlauch. Anyhow:

    check-by-satellite plugin beibringen, den Port auszulesen:

    Difference-File

    1. blu@aptenodytes ~/code/git/github.com/bloonix/bloonix-plugins-basic$ git diff
    2. diff --git a/plugins/check-by-satellite b/plugins/check-by-satellite
    3. index ea33d38..f7857a6 100755
    4. --- a/plugins/check-by-satellite
    5. +++ b/plugins/check-by-satellite
    6. @@ -407,7 +407,7 @@ sub connect {
    7. my %opts = (
    8. peeraddr => $location->{ipaddr},
    9. - peerport => 5464,
    10. + peerport => $location->{port},
    11. use_ssl => "yes",
    12. ssl_verifycn_name => $location->{hostname},
    13. recv_timeout => 60
    Display All


    Bloonix-webgui SQL schema für locations um Port erweitern:

    Difference-File

    1. blu@aptenodytes ~/code/git/github.com/bloonix/bloonix-webgui$ git diff
    2. diff --git a/schema/mysql/location.sql b/schema/mysql/location.sql
    3. index 40db309..60ae32b 100644
    4. --- a/schema/mysql/location.sql
    5. +++ b/schema/mysql/location.sql
    6. @@ -1,6 +1,7 @@
    7. CREATE TABLE `location` (
    8. `id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    9. `ipaddr` VARCHAR(159) NOT NULL,
    10. + `port` BIGINT NOT NULL DEFAULT '5464',
    11. `hostname` VARCHAR(50) NOT NULL,
    12. `city` VARCHAR(50) NOT NULL,
    13. `country` VARCHAR(50) NOT NULL,
    Display All


    Fertig - bis auf die WebGUI, die schau ich mir später nochmal an.
    A service is only a service if its monitored.
  • Nun zur WebGUI. Hier, was ich bis dato gefunden habe:

    Difference-File

    1. blu@aptenodytes ~/code/git/github.com/bloonix/bloonix-webgui$ git diff lang/en
    2. diff --git a/lang/en b/lang/en
    3. index 002f65c..e8bc3b5 100644
    4. --- a/lang/en
    5. +++ b/lang/en
    6. @@
    7. -1165,6 +1165,7 @@ schema.use
    8. schema.location.attr.id: ID
    9. schema.location.attr.ipaddr: IP
    10. schema.location.attr.hostname:
    11. +schema.location.attr.port: Port
    12. # ...So auch für lang/de und lang/it...
    13. blu@aptenodytes ~/code/git/github.com/bloonix/bloonix-webgui$ git diff source/js/bloonix-locations.js
    14. diff --git a/source/js/bloonix-locations.js b/source/js/bloonix-locations.js
    15. index ca346e0..e1328aa 100644
    16. --- a/source/js/bloonix-locations.js
    17. +++ b/source/js/bloonix-locations.js
    18. @@ -55,6 +55,9 @@ Bloonix.listLocations = function() {
    19. name: "ipaddr",
    20. text: Text.get("schema.location.attr.ipaddr")
    21. },{
    22. + name: "port",
    23. + text: Text.get("schema.location.attr.port")
    24. + },{
    25. name: "continent",
    26. text: Text.get("schema.location.attr.continent")
    27. },{
    28. @@ -115,6 +118,13 @@ Bloonix.getLocationFormElements = function() {
    29. maxlength: 39,
    30. required: true
    31. },{
    32. + element: "input",
    33. + type: "text",
    34. + name: "port",
    35. + text: Text.get("schema.location.attr.port"),
    36. + maxlength: 5,
    37. + required: true
    38. + },{
    39. element: "select",
    40. name: "continent",
    41. text: Text.get("schema.location.attr.continent"),
    Display All


    Nun teste ich gerade der Faulheit halber auf einem apt-get installierten Server in Vagrant. Wie kriege ich den denn dazu, sein js neu zu minifyen?

    Auch sollte für das Port Feld bereits ein Default-Wert "5464" drin stehen - wie mach ich das am schlausten?
    A service is only a service if its monitored.
  • Moin zusammen,

    ich finde die Idee echt nicht so schlecht. Ich würde es vielleicht nochmal in eine andere Richtung erweitern wollen. Leider fehlt mir hier das entsprechende KnowHow um es selbst umzusetzen.
    Kann von euch vielleicht jemand einen Docker mit Debian 8 und einem Satelliten erstellen. Damit könnte man direkt ohne großen Aufwand auf jedes Docker fähige System einen Satelliten bereitstellen.
    Diesen Docker könnte man dann z.B. auf einem Synology oder jedem anderem NAS sofort bereitstellen. Selbst auf einem Plesk Server wird mit Onxy demnächst Docker unterstütz werden.

    Jonny wrote:

    Einen Satellite auf einem Rasp hinter einer privaten DSL Leitung halte ich für keine stabile Sache.

    Ausserdem sollte sich jeder bewußt sein, dass wenn Kunden (oder wer auch immer) Checks einrichten können, mit den Checks das Netz hinter der DSL Leitung ausspionieren können.


    Dieses Problem was Jonny hier erwähnt, kann man doch ganz einfach mit einer iptables Regel das alle Class A-E Netzwerke nicht erreicht werden können.
  • Zu DSL - das raspi sollte via Kabel an der Fritz Box hängen, auch muss die Fritz Box ein VLAN für das Raspi erstellen können. Wer das nicht bereitstellen kann, darf nicht mitmachen.
    Den Rest machen wir per iptables / shorewall. Ich bau dann einen Installer o.ä. dafür, dass der Aufwand dafür bei der Einrichtung möglichst gering bleibt.

    Leider hänge ich derzeit immernoch an der Web-GUI (also dort die Einstellung mit dem Port auch verfügbar zu machen).

    Satellit via Docker auf Synology NAS usw finde ich beschrenkt gut, da man dort (weiss ich nicht genau) wahrscheinlich nicht so gut mit iptables rum rocken kann. Wenn man das nur für privat macht, ist das ja egal.

    Anyhow - Docker Satellite Image bauen wir gerade, dann kann man das machen. Da hab ich noch gar net dran gedacht, danke für den Tipp.

    PS: DSL Satelliten realisieren wir dann via Masquerade von einem Server im Inet via VPN zum Raspi. Das muss die NAS dann ggf. auch können (also OpenVPN o.ä., damit der Satellit überhaupt erreichbar ist). Die ganze Technik stellen wir dann auf github wenns fertig ist (geplant 01.01.17)
    A service is only a service if its monitored.

    The post was edited 1 time, last by pthurner ().