Im Grunde habe ich zwei EC2-Instanzen auf Amazon Web Services. Auf beiden läuft Ubuntu 11.10 x64. Beide haben eine private und eine öffentliche (Elastic) IP-Adresse. Ich habe Probleme, iptables so einzurichten, dass SQL-Daten richtig weitergeleitet werden.
Ich möchte es so, dass, wenn ich eine Verbindung zu „127.0.0.1:3306“ auf Server A (auf dem kein SQL-Server installiert ist) herstelle, eine Weiterleitung an <private ip>:3306
(d. h. Server B – auf dem ein SQL-Server installiert ist) erfolgt.
Ich kann über die zugehörigen privaten IPs auf jeden Server (vom anderen aus) zugreifen. Ich möchte die Weiterleitung auch privat halten, ohne eine öffentliche IP verwenden zu müssen.
Gibt es eine einfache Möglichkeit, dies zu tun?
Antwort1
Ich denke, das hier könnte das sein, wonach Sie suchen:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to <private ip>:3306
Antwort2
Ich habe ein ähnliches Setup, aber etwas komplexer.
Auf meinem Laptop zu Hause habe ich eine /etc/xinetd.d/mysqlfwd
Datei mit
service mysqlfwd
{
type = UNLISTED
port = 3307 # could be 3306 as well if ther will never be a MySQL server installed here
socket_type = stream
protocol = tcp
wait = no
user = ports
server = /usr/local/bin/ports
server_args = -s mysql@<mydomain>
}
Dies mysql@<mydomain>
bezeichnet das auf dem Server definierte SSH-Subsystem. Da mysql
es keinen definierten Subsystemnamen gibt und auch keinen gibt, habe ich mich entschieden, selbst einen zu definieren (unter Verwendung der entsprechenden Namenskonvention)[http://tools.ietf.org/html/rfc4250#section-4.6.1].
Der verwendete Wert /usr/local/bin/ports
ist definiert als
#!/usr/bin/env python
def ssh(*args, **opts):
import subprocess
map= { False: 'no', True: 'yes' }
op = [ "-o%s=%s" % (k, map.get(v, v)) for k, v in opts.iteritems()]
args = op + list(args)
sp = subprocess.Popen(['ssh'] + args)
return sp
def ssh_conn(*args, **opts):
args = ['connect@myservernamehere', '-C' ] + list(args)
opts2 = dict(ControlPath='/tmp/ssh-%r@%h:%p')
opts2.update(opts)
return ssh(*args, **opts2)
def master():
sp = ssh_conn('-f', 'sleep', '15h', ControlMaster=True)
sp.wait()
def client(*args):
sp = ssh_conn(*args, **dict(ControlMaster=False))
sp.wait()
def main():
import sys
args = sys.argv[1:]
if not args:
master()
else:
client(*args)
if __name__ == '__main__':
main()
Auf dem besagten Server gibt es einen Benutzer namens connect
und, wie gesagt, ein Subsystem namens mysql@<mydomain>
Letzteres wird /etc/ssh/sshd_config
mit der Zeile
Subsystem mysql@<mydomain> /usr/bin/netcat localhost 3306
Der Benutzer connect
existiert lediglich, um eine Plattform zur Verfügung zu haben, die er bedienen kann und außer der Annahme meines „Portweiterleitungsschlüssels“ über seine verfügt ~/.ssh/authorized_keys
, über keine besonderen Funktionen, Eigenschaften oder ähnliches.
Auf diese Weise kann mein Server seinen MySQL-Port privat halten (nicht von außen zugänglich), aber ich habe trotzdem eine Möglichkeit, eine Verbindung herzustellen.