SSH Portforwarding

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
mopsy
Beiträge: 39
Registriert: 21.03.2009 12:26:23

SSH Portforwarding

Beitrag von mopsy » 27.08.2009 00:29:45

Hi,

ich möchte zwei Lenny Server per SSH-Tunnel verbinden. Auf dem einen läuft MySQL auf dem anderen Apache. Bisher greife ich vom Apache-Server einfach per Hostname auf die Datenbank zu, nun möchte ich die Verbindung absichern. Kann mir jemand ein Howto aus dem Hut zaubern? Hab nicht wirklich was passendes gefunden.

Der Tunnel soll direkt beim Systemstart aufgebaut werden und den Port 3306 vom Webserver zum Datenbankserver tunneln.

Gruß Stephan

Benutzeravatar
herrchen
Beiträge: 3257
Registriert: 15.08.2005 20:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Re: SSH Portforwarding

Beitrag von herrchen » 27.08.2009 01:45:03

mopsy hat geschrieben:Der Tunnel soll direkt beim Systemstart aufgebaut werden und den Port 3306 vom Webserver zum Datenbankserver tunneln.

Code: Alles auswählen

ssh -l username -L 3306:127.0.0.1:3306 datenbank.server.ext
Wenn Du für "username" einen Nutzer anlegst, der einen Key ohne Passwort verwendet, kannst Du den Befehl z.B. mittels "@reboot" in einer crontab ausführen.
Eine weitere Möglichkeit ist natürlich ein Initscript.

herrchen

mopsy
Beiträge: 39
Registriert: 21.03.2009 12:26:23

Re: SSH Portforwarding

Beitrag von mopsy » 27.08.2009 09:53:10

Hi,

das werde ich direkt mal ausprobieren. Wie kann ich die Verbindung dann noch überwachen? Damit sie - falls getrennt - sofort wieder aufgebaut wird?

UPDATE: Meinen SSH-Zugang habe ich nach diesem Howto abgesichert http://wiki.debianforum.de/SshLoginInKaefig und folgendes init Script angelegt:

Code: Alles auswählen

#! /bin/sh

DAEMON=/usr/bin/ssh

[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
        ssh -L 3306:127.0.0.1:3306 -i ~/.ssh/web2mysql mysql@DATENBANKHOSTNAME -p 63742
        ;;
  restart|force-reload)
        # Disconnect SSH Connection and restore
        ;;
  stop)
        # Disconnect SSH Connection
        ;;
  *)
        echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

exit 0
Dann das Script gespeichert unter /etc/init.d/web2mysql, ausführbar gemacht und mit update-rc.d web2mysql defaults angelegt.
Was passiert jetzt im laufenden Betrieb wenn die Verbindung getrennt wird?

Gruß Stephan

mopsy
Beiträge: 39
Registriert: 21.03.2009 12:26:23

Re: SSH Portforwarding

Beitrag von mopsy » 27.08.2009 18:34:06

So nach einigem rumprobieren klappt es immer noch nicht :(

Verstehe ich das schon richtig das das init Script auf dem Webserver gestartet wird und ich danach mit mysql -u root -pXXX direkt auf dem Datenbankserver rauskomme? Also das auch zB php Scripte mit Server=localhost zurechtkommen.
Selbst rausgefunden, wenn ich --protocol=TCP an mysql -u root -pXXX dranhänge klappt die Verbindung zu MySQL.

Beim init Script anlegen habe ich wohl einen Fehler gemacht, beim booten wird der Tunnel nicht automatisch aufgebaut und wenn ich das init Script mit /etc/init.d/web2mysql start aufrufe kann ich die Verbindung nur solange nutzen wie die Konsole geöffnet ist.

Gruß Stephan

mopsy
Beiträge: 39
Registriert: 21.03.2009 12:26:23

Re: SSH Portforwarding

Beitrag von mopsy » 28.08.2009 02:00:31

So, nach stundenlangen suchen und probieren klappt es nun endlich.

Falls es noch jemand brauchen kann hier mal ne Kurzanleitung.

Zuerst mal autossh installieren damit der Tunnel später überwacht werden kann.
aptitude -y install autossh

Jetzt das folgende Script nach /etc/init.d/sshportf speichern

Code: Alles auswählen

#!/bin/sh
### BEGIN INIT INFO
# Provides:          autossh
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: autossh-tunnel
# Description:       SSH-Portforwarding 
### END INIT INFO

KEYFILE="~/.ssh/sshuser"
DBHOSTNAME="domain.tld"
SSHUSER="sshuser"
SSHPORT="22"

APP="/usr/bin/autossh"
APPARG="-M 20000 -fN -L 127.0.0.1:3306:127.0.0.1:3306 -i ${KEYFILE} ${SSHUSER}@${DBHOSTNAME} -p ${SSHPORT}"

export AUTOSSH_GATETIME=30
export AUTOSSH_POLL=15

[ -x "$APP" ] || exit 0

case "$1" in
  start)
        su ${SSHUSER} -c "${APP} ${APPARG}"
        ;;
  *)
        echo "Usage: $0 {start}" >&2
        exit 3
        ;;
esac

exit 0
Ausführbar machen
chmod a+x /etc/init.d/sshportf
Runlevel setzen
update-rc.d sshportf defaults
Script starten
/etc/init.d/sshportf start

Das war's, jetzt steht der Tunnel und auch nach jedem Systemstart steht der Tunnel sofort zur Verfügung und man kann sich mit mysql -u USER -pPASS --protocol=TCP oder alternativ mysql -u USER -pPASS -h 127.0.0.1 zur Datenbank verbinden.
Die Verbindung muss über PublicKeys hergestellt werden - ich habe mir hierzu einen eigenen Benutzer sshuser mit minimalen Rechten eingerichtet. Das ist hier http://wiki.debianforum.de/SshLoginInKaefig sehr gut beschrieben.

Damit auch in Scripten die Verbindung zur Datenbank klappt muss man statt wie meist localhost die IP-Adresse 127.0.0.1 eingeben und schon läuft alles bestens.

Gruß Stephan

Antworten