Damit haben wir nun (zumindest direkt vom Hostsystem aus) "entfernten" Zugriff auf den Gast mittels SSH.
Der einfachste Weg den Gast auch "von außen" erreichbar zu machen, wäre nun den HostPort (in diesem Fall 22222) über SuSEfirewall2 bzw. durch eine entsprechende Portweiterleitung in Eurem Router zugänglich zu machen (sofern das überhaupt erwünscht ist).
3. Erreichbarkeit des Servers im Gast "von außen" auf (s)einem Standardport (SuSEfirewall2 + "REDIRECT"-Regel im Host)
Nun läuft aber der SSH-Server durch die über VirtualBox eingerichtete Portweiterleitung auf dem "ungewöhnlichen" Port 22222, für SSH ist das Verlegen auf einen "non-standard" Port vielleicht sogar keine so schlechte Idee (auch wenn es -das muss ich nun einfach sagen- _keine_ Sicherheitsmaßnahme ist), aber wie sieht es aus, wenn man z.B. einen im Gast laufenden Serverdienst auf seinem Standardport von "außen" erreichbar machen will und dieser =< 1024 ist?
Weiter oben wurde mehrfach betont, daß man als "HostPort" (und auch für den RDP-Zugriff) einen Port > 1024 wählen soll, der Grund hierfür liegt darin, daß unter Linux ein nicht-privilegierter Benutzer keinen Port zwischen 1 und 1024 öffnen darf (deshalb heißen diese auch "privileged ports").
Welche Lösung gibt es nun für dieses Problem?
a) die offensichtliche und _absolut inakzeptable_ Lösung, daß man auch als "HostPort" einen "privileged port" konfiguriert und dadurch die virtuelle Maschine als root starten muss
b) Eine erneute "Umleitung" mittels netfiler/iptables, welche eingehende Anfragen auf einem "privileged" Port des Hosts auf den entsprechenden "non-privileged" Port "umbiegt", auf welchem der Dienst eigentlich im Hostsystem "lauscht"
Die folgende Anleitung bezieht sich ausschließlich auf die Einrichtung dieser "REDIRECT"-Regel mittels SuSEfirewall2, wer eine andere Distribution als openSUSE oder auf openSUSE ein anderes Frontend zur Verwaltung von iptables verwendet, der möge die entsprechende Dokumentation konsultieren.
Zum Glück bietet SuSEfirewall2 eine sehr einfach zu konfigurierende Einstellungsmöglichkeit für diese Aufgabe an, die Regel nennt sich "FW_REDIRECT" und kann entweder durch Bearbeiten der Datei "/etc/sysconfig/SuSEfirewall2" oder über "YaST => System => /etc/sysconfig-Editor => nach FW_REDIRECT suchen" erledigt werden.
Folgendes findet man als Erklärung zu dieser Regel:
Code:
## Type: string
#
# 15.)
# Which accesses to services should be redirected to a local port on
# the firewall machine?
#
# This option can be used to force all internal users to surf via
# your squid proxy, or transparently redirect incoming webtraffic to
# a secure webserver.
#
# Format: list of <source network>[,<destination network>,<protocol>[,dport[:lport]]
# Where protocol is either tcp or udp. dport is the original
# destination port and lport the port on the local machine to
# redirect the traffic to
#
# An exclamation mark in front of source or destination network
# means everything EXCEPT the specified network
#
# Example: "10.0.0.0/8,0/0,tcp,80,3128 0/0,172.20.1.1,tcp,80,8080"
#
# Note: contrary to previous SuSEfirewall2 versions it is no longer necessary
# to additionally open the local port
FW_REDIRECT=""
Da wir eingehende Pakete aus dem Internet auf die lokale Adresse des Hosts "umleiten" wollen, würde die entsprechende Regel also allgemein so aussehen.
Code:
FW_REDIRECT="0/0,127.0.0.1/0,tcp,Standardport_des_Dienstes,"HostPort"_des_Dienstes_welcher_über_VBoxManage_festgelegt_wurde"
- Das "Quellnetzwerk" wird als "0/0" festgelegt, damit hat jede IP Zugriff (aka "das Internet"), wer z.B. nur Zugriff aus seinem LAN erlauben möchte, der gibt hier die entsprechenden Daten ein (z.B. 192.168.0.0/24, wenn das eigene LAN aus den Adressen von 192.168.0.1-192.168.0.255 besteht)
- Das Zielnetzwerk ist 127.0.0.1 (aka "localhost"), also die lokale Adresse der Hostmaschine
- Der Quellport ist der Port, über welchen man Zugriff "von außen" erlauben will (bei einem Webserver würde sich z.B. 80 anbieten)
- Der Zielport ist der "HostPort" der zuvor über VBoxManage eingerichteten Weiterleitung
Möchten wir also den SSH-Server unserer virtuellen Maschine, welchen wir lokal auf dem Host auf Port 22222 erreichen können, von außen auf Port 22 verfügbar machen, dann lautet die Regel
Code:
FW_REDIRECT="0/0,127.0.0.1/0,tcp,22,22222"
4. Anwendungsbeispiel: Webserver in einer Gastmaschine auf Port 80 aus dem Internet erreichbar machen
a) Vorgaben
- Auf dem Gast "openSUSE-11.2-64" läuft ein Webserver (z.B. Apache2) auf Port 80
- Der Gast ist in VirtualBox über Netzwerkkarte Nr.1 via NAT eingerichtet, Netzwerkkarte ist aus der e1000-Familie
- Der Webserver soll über Port-Forwarding auf Port 8888 im Host erreichbar sein
- Der Websever soll aus dem Internet auf Port 80 über die externe IP bzw. deren URL (Stichwort DynDNS) des Hosts erreichbar sein
b) Einrichtung der Weiterleitung Gast Port 80 => Host Port 8888 über VBoxManage
Das Ganze Spielchen geht analog zur Weiterleitung des SSH-Servers im vorigen Teil, GuestPort ist 80, HostPort ist 8888 und der Dienst wird "stilecht" als "GastIndianer" bezeichnet:
Code:
VBoxManage setextradata "openSUSE-11.2-64" "VBoxInternal/Devices/e1000/0/LUN#0/Config/GastIndianer/Protocol" TCP
VBoxManage setextradata "openSUSE-11.2-64" "VBoxInternal/Devices/e1000/0/LUN#0/Config/GastIndianer/GuestPort" 80
VBoxManage setextradata "openSUSE-11.2-64" "VBoxInternal/Devices/e1000/0/LUN#0/Config/GastIndianer/HostPort" 8888
c) Einrichtung der "Umleitung" Anfrage aus dem Internet auf Port 80 => Port 8888 auf dem Host via SuSEfirewall2
Das Quellnetzwerk ist also "0/0", das lokale Netzwerk ist localhost (127.0.0.1), Protokoll ist TCP, Quellport ist 80 und Zielport ist 8888.
Man öffnet die Datei "/etc/sysconfig/SuSEfirewall2" als root mit einem Texteditor, sucht nach "FW_REDIRECT" und trägt folgende "Umleitung" ein (farbig markiert),
Code:
FW_REDIRECT="0/0,127.0.0.1/0,tcp,80,8888"
speichert die Datei ab und abschließend sicherheitshalber als root ein
Code:
rcSuSEfirewall2 restart
um diese Regel zu aktivieren.
Danach sollte man auch von "außen" Zugriff auf seinen Webserver in der virtuellen Maschine haben.
Wer hinter einem Router sitzt, muss natürlich noch zusätzlich dort eine entsprechende Portweiterleitung einrichten (man konsultiere hierzu das Handbuch des Routers).
Greetz,
RM
Lesezeichen