Wie leite ich lokalen (127.0.0.1) MySQL-Verkehr an einen externen SQL-Server weiter?

Wie leite ich lokalen (127.0.0.1) MySQL-Verkehr an einen externen SQL-Server weiter?

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/mysqlfwdDatei 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 mysqles 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/portsist 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 connectund, wie gesagt, ein Subsystem namens mysql@<mydomain>Letzteres wird /etc/ssh/sshd_configmit der Zeile

Subsystem mysql@<mydomain> /usr/bin/netcat localhost 3306

Der Benutzer connectexistiert 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.

verwandte Informationen