Toon posts:

TCP reverse proxy voor SSH en MySQL

Pagina: 1
Acties:

Vraag


  • MartenBE
  • Registratie: December 2012
  • Laatst online: 27-01 11:54
Hallo iedereen,

Op mijn werk ben ik een klein minidatacenter aan het uitbouwen. Nu zouden we graag servers aanbieden aan groepen studenten voor een projectvak (ik werk aan een school). Elk groepje studenten heeft een VM nodig met ssh toegang en een databank op. Ik heb alles uitgewerkt zodat er VMs aangemaakt worden en er toegang is tot internet enzo. Het enige probleem: we hebben (hopelijk voorlopig) slechts 1 IP-adres. Graag zou ik de structuur uitbouwen zodat de studenten er aan kunnen als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VM 1
    groep1.example.com:22 (ssh)
    groep1.example.com:443 (https)
    groep1.example.com:3306 (mysql)

VM 2
    groep2.example.com:22 (ssh)
    groep2.example.com:443 (https)
    groep2.example.com:3306 (mysql)

VM 3
    groep3.example.com:22 (ssh)
    groep3.example.com:443 (https)
    groep3.example.com:3306 (mysql)

    ...


Nu is een HTTPS reverse proxy geen probleem: op dit moment is example.com:443 geforward naar een interne VM met een nginx ingesteld als reverse proxy. Helaas, ssh en mysql (en in de toekomst andere zaken) kunnen niet zomaar via een HTTP reverse proxy geredirect worden. Dit moet via een TCP reverse proxy gebeuren. Het kan in nginx via stream modules, maar het voelt aan alsof het eigenlijk niet meer tot het takenpakket van nginx behoort. Daarom dat ik eens wou polsen of er betere manieren zijn of software bestaat om dit te doen? Ik heb al zitten kijken naar Traefik en HAProxy, maar het eerste is vooral op containers gericht en het tweede vooral op load balancing. IPv6 is op dit moment nog geen oplossing (maar kijken we naar voor in de toekomst).

Alle reacties


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Daar is geen oplossing voor. HTTP ondersteunt reverse proxy'en omdat in de http req de servernaam wordt meegegeven, maar voor ssh en mysql zijn dat soort dingen er niet.

Je kunt imo het beste gewoon één jumphost-vm inrichten vanwaar je studenten naar hun eigen vm verbinden voor ssh, en dat is dan ook bruikbaar voor mysql middels forwarding. Voor http kun je dan haproxy of nginx of traefik of eender welke oplossing voor http proxying gebruiken.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • brambo123
  • Registratie: December 2006
  • Laatst online: 09:52
Voor HTTP(S) wordt gebruikt gemaakt van SNI.
Komt er eigenlijk op neer dat er eerst een naam wordt gestuurd, en daarna pas de verbinding verder wordt opgebouwd.
Voor zover mij bekend heeft SSH en MYSQL daar geen ondersteuning voor.
En zonder die ondersteuning heeft je reverse proxy geen enkel idee welke server je verbinding mee probeert te maken.

Een paar anders opties:
- Port forwarding met andere poort nummers.
- Verbinding opbouwen op basis van extern ip adres van gene die inlogt (whitelist achtig idee)
- extraip.com

  • Oon
  • Registratie: Juni 2019
  • Niet online
Zoals al gezegd, reverse proxy voor SSH is niet mogelijk op één IP-adres. SSH maakt altijd verbinding met een IP-adres, niet met een hostname.
Oplossing daar is verschillende poorten gebruiken, dus bijvoorbeeld 221 voor groep1, 222 voor groep 2, 223 voor groep 3.

Voor MySQL zou ik sowieso via SSH verbinden, dan kun je die koppelen aan de server/groep waar die bijhoort. Je doet dan een SSH tunnel naar groep3, en dan verbind je veilig met localhost (of een interne verwijzing naar een andere server). MySQL kun je dan netjes afschermen in de firewall, want die heeft geen key auth, dus kan niet beveiligd worden.

  • Faifz
  • Registratie: November 2010
  • Laatst online: 05-02 11:16
Oon schreef op maandag 7 februari 2022 @ 19:08:
Zoals al gezegd, reverse proxy voor SSH is niet mogelijk op één IP-adres.
Eigenlijk wel. Hoogstwaarschijnlijk wordt dit geload-balanced in een pool met bv een web-server, database of whatever en round-robin als algoritme. Maar dan kom je op een random server terecht ipv de server dat je echt wilt. Dus dat is niet praktisch en ja SSH routing decisions blijven beperkt tot en met L4 (TCP-poort + IP).

Routing op basis van host headers (HTTP) is niet van toepassing en daar heb je volledig gelijk in.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 20:14
MartenBE schreef op maandag 7 februari 2022 @ 18:54:
Daarom dat ik eens wou polsen of er betere manieren zijn of software bestaat om dit te doen?
Machines waar je studenten op laat rommelen wil je sowieso liever niet direct aan het internet verbinden, anders mag je in no time cryptominers opruimen.

Port forwarden via de SSH van de VMs die je toch al hebt (op verschillende poorten gemapped) werkt, maar om het praktisch werkend te krijgen moet iedereen goed begrijpen hoe het forwarden van poorten werkt met een SSH client naar keuze. Gegarandeerd dat iemand het alsnog niet voor elkaar krijgt, en zo wel dan werkt het nog niet heel ideaal.

De meest praktische oplossing is een VPN. Mag je zelf kiezen uit OpenVPN, WireGuard of iets anders. Daarbij twee moderne suggesties: Headscale (selfhosted versie van Tailscale) en Nebula.

Voordeel van eender welke VPN is dat het zwaartepunt bij jou ligt (configuratie van de server en het regelen van configuratiebestanden). Als jij je werk goed gedaan hebt hoeft de student alleen maar te dubbelklikken en kan hij/zij bij iedere poort op de VM.

  • amx
  • Registratie: December 2007
  • Laatst online: 05-02 20:32
CyBeR schreef op maandag 7 februari 2022 @ 19:03:
Daar is geen oplossing voor. HTTP ondersteunt reverse proxy'en omdat in de http req de servernaam wordt meegegeven, maar voor ssh en mysql zijn dat soort dingen er niet.

Je kunt imo het beste gewoon één jumphost-vm inrichten vanwaar je studenten naar hun eigen vm verbinden voor ssh, en dat is dan ook bruikbaar voor mysql middels forwarding. Voor http kun je dan haproxy of nginx of traefik of eender welke oplossing voor http proxying gebruiken.
sslh kan dit

  • Djordjo
  • Registratie: Mei 2007
  • Niet online
Hoe dan? sslh kan volgens mij alleen onderscheid maken op basis van protocol. Hier wil je onderscheid kunnen maken voor verkeer met hetzelfde protocol.

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 18:23
Als iedereen met unieke usernames kan werken, kan je dit wel proxyen op basis van de username. Ik heb daar ooit dit voor gemaakt. Dat draaide destijds in productie met enkele tienduizenden users. Of het nog steeds gebruikt wordt weet ik niet.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


  • Tazzios
  • Registratie: November 2001
  • Laatst online: 18:40
Met stunnel op een extra server erbij en stunnel op de clients(studenten) moet het wel lukken.

  • amx
  • Registratie: December 2007
  • Laatst online: 05-02 20:32
Djordjo schreef op maandag 22 augustus 2022 @ 14:12:
[...]

Hoe dan? sslh kan volgens mij alleen onderscheid maken op basis van protocol. Hier wil je onderscheid kunnen maken voor verkeer met hetzelfde protocol.
socat

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 18:45

DataGhost

iPL dev

Je kan wel tooltjes blijven linken maar misschien moet je je inlezen wat ze precies doen, dan kan je direct uitleggen hoe je deze zou moeten gebruiken hiervoor (en zien dat je suggestie niet gaat werken). Het SSH-protocol heeft gewoon niet de mogelijkheid om op basis van alleen de hostname naar een andere server geroutet te worden want de hostname wordt simpelweg niet meegestuurd in het request.

Oplossingen voor TS die ik zo gauw zie zijn het gebruik maken van een VPN waarbij er hostnames voor de verschillende machines zijn die naar de relevante interne IP's wijzen, en anders het gebruiken van verschillende poorten voor elke VM.

Trouwens, IPv6 wordt op steeds meer plekken ondersteund en hiermee is heel je probleem direct verdwenen aangezien elke VM een eigen extern IP kan krijgen. Ik neem aan dat voor groepX.example.com eigenlijk alleen HTTPS relevant is, dat kan je gelukkig prima proxyen met SNI achter hetzelfde IPv4-adres. Dan kan je voor elke groep een A-record maken naar het algemene IPv4-adres, een AAAA-record aanmaken wat direct naar het interne IP wijst en nog een extra AAAA-only subdomein (ssh.groepX.example.com ofzo) waarmee ze dan direct naar de VM's kunnen verbinden zonder dat er per ongeluk het algemene IPv4-adres gebruikt wordt.

Dus iets als:
groepX.example.com A [IPv4 van reverse proxy]
groepX.example.com AAAA [IPv6 van VM]
ssh.groepX.example.com AAAA [IPv6 van VM]
mysql.groepX.example.com AAAA [IPv6 van VM]

Blijft nog wel de vraag waarom je iets als MySQL open wilt zetten naar het internet, daar zou ik minimaal TLS op afdwingen voor zover je dat nog niet had bedacht.

[Voor 39% gewijzigd door DataGhost op 22-08-2022 19:59]


  • amx
  • Registratie: December 2007
  • Laatst online: 05-02 20:32
DataGhost schreef op maandag 22 augustus 2022 @ 19:50:
[...]
Het SSH-protocol heeft gewoon niet de mogelijkheid om op basis van alleen de hostname naar een andere server geroutet te worden want de hostname wordt simpelweg niet meegestuurd in het request.
Je bedoelt denk ik dat omdat het verzoek naar de domeinnaam of het ene publieke ip wordt verzonden, de hostname van de ssh host niet gespecificeerd is.

socat proxycommand

stunnel kan dit ook prima inderdaad.
IPV6 kan ook inderdaad, echter ipv6 is 10 years away from being implemented

  • fastedje
  • Registratie: Oktober 2016
  • Laatst online: 07-02 14:17
Je kunt imo het beste gewoon één jumphost-vm inrichten vanwaar je studenten naar hun eigen vm verbinden voor ssh, en dat is dan ook bruikbaar voor mysql middels forwarding. Voor http kun je dan haproxy of nginx of traefik of eender welke oplossing voor http proxying gebruiken.
In je ~/.ssh/config (of /etc/ssh/ssh_config) la je ook een host definiëren die via een jumphost verbinding maakt. De jumphost heeft het publieke IP/Port en de interne hospublN IP.

Voor ssh kan je ook gebruik maken van SSH Certificaten. Het voordeel daarcan is dat je met rollen (principals) kan bepalen wie wanneer bij welke machine kan. Als jet certificaat is verlopen stop automatisch de toegang. Nog een voordeel: je kan in /var/log/secure precies zien welk cert waneer verbinding maakt.

Met public keys werken kan wel, maar dat wordt op grote schaal al snel onoverzichtelijk en het risico bestaat dat je toegang vergeet weg te halen.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee