[linux-l] Re: DB's im www

Volker Grabsch vog at notjusthosting.com
Fr Dez 22 14:12:47 CET 2006


On Fri, Dec 22, 2006 at 12:50:28PM +0100, Olaf Radicke wrote:
> Ja. Das ist auch (im gewissen Sinne) so gewollt. die Sitzungen werden 
> nur für eine einzige SQL offen gehalten. Dadurch ist es nötig das der 
> Login schnell geht. 
> 
> Ich denke ein VPN würde noch in die engere Wahl kommen.

Ja, mach das mal lieber.

Da es sich nur um einen einzigen Port handelt: Mach doch ein SSH-
Connection-Forwarding. Das ist sehr viel leichter zu realisieren als
ein VPN.

Entweder jede Client-Maschine macht einen SSH-Tunnel zum Server auf,
oder nur ein Rechner macht den Tunnel auf, und bietet den
Postgresql-Port dann allen anderen Rechnern im Netz an. Ich hab das
für dich mal ausprobiert:


------------------------------------------------------------------

Beispiel
========

    Server im Internet: psql.im-internetz.de
    Rechner im LAN:     psql.lan
    Clients:            client1.lan, client2.lan, ...


Anleitung
=========

    * auf psql.lan erzeugst du einen SSH-Public-Key:
            ssh-keygen -t rsa

    * auf psql.im-internetz.de erstellst du einen Dummy-SSH-Account:
        * nennen wir ihn "remote-psql"
        * in dessen .ssh/authorized_keys trägst du den Publiy-Key von
          psql.lan ein
        * In der /etc/shadow deaktiviere das Passwort für remote-psql

    * auf psql.lan führst du aus:
            ssh -L 0.0.0.0:5432:localhost:5432 \
                remote-psql at psql.im-internetz.de

Nun sieht es so aus, als ob Postgresql direkt auf psql.lan laufen
würde. Der SSH-Tunnel wird nur einmal aufgebaut und kann beliebig
viele Verbindungen annehmen. Die Geschwindigkeit ist dufte. Falls nicht,
lass SSH komprimieren (Option -C):

            ssh -C -L 0.0.0.0:5432:localhost:5432 \
                remote-psql at psql.im-internetz.de

Diese SSH-Befehle öffnen außerdem eine Shell. Wird diese z.B. mit "exit"
verlassen, "hängt" sie noch ein Weilchen, bis alle offenen Postgresql-
Verbindungen geschlossen wurden, und beendet sich dann.


Varianten
=========

Möchtest du den SSH-Befehl komplett im Hintergrund haben, nimm die
Option -f:

    ssh -f -C -L 0.0.0.0:5432:localhost:5432 \
        remote-psql at psql.im-internetz.de -- sleep 3600

Statt "sleep 3000" kannst du auch irgendeinen anderen nicht-interaktiven
Dummy-Befehl nehmen. Bei "sleep 3600" wird die Verbindung 1h offen sein.
Willst du eine unbegrenze Länge, dann nimm einen Befehl, der ewig läuft.
Da gibt es viele Möglichkeiten, ich nehmen hier einfach mal ein
1000-jähriges Sleep:

    ssh -f -C -L 0.0.0.0:5432:localhost:5432 \
        remote-psql at psql.im-internetz.de -- sleep 365000d

Andere gute Befehle sind:

    tail -f /etc/motd
    tail -n0 -f /etc/motd

Mehr ist mir nicht eingefallen. Ist ja im Prinzip auch egal. :-)


Warnung
=======

Bei meinen Tests tauchte in den "ssh -f" Befehlen eine Fehlermeldung auf:

    bind: Address already in use

Die kannst du ignorieren. Das ssh läuft trotzdem im Hintergrund, wie du
mit "ps ux" leicht überprüfen kannst, und ein "telnet localhost 5432"
bestätigt das Forwarding. Sorgen machen musst du dir nur bei dieser
Fehlermeldung:

    channel_setup_fwd_listener: cannot listen to port: 5432
    Could not request local forwarding.

Dann läuft auf dem Rechner entweder ein Postgresql (dann nimm einfach
nen anderen Post), oder du hast bereits einen der ssh-Forwarder
am Laufen. (ist mir beim Testen ein paar mal passiert :-))

------------------------------------------------------------------


So, das sollte für den Start genügen. SSH-Tunnel sind ne sehr feine
Sache, wenn es nur um einzelne Ports geht. Viel Spaß damit!

Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l