¿Cómo puedo dirigir el tráfico MySQL local (127.0.0.1) a un servidor SQL externo?

¿Cómo puedo dirigir el tráfico MySQL local (127.0.0.1) a un servidor SQL externo?

Básicamente, tengo dos instancias EC2 en Amazon Web Services. Ambos ejecutan Ubuntu 11.10 x64. Ambos tienen direcciones IP privadas y públicas (Elastic). Tengo problemas para configurar iptables para reenviar datos SQL correctamente.

Me gustaría que si me conecto a "127.0.0.1:3306" en el Servidor A (que no tiene un servidor SQL instalado), se reenvíe al <private ip>:3306(también conocido como Servidor B, que sí tiene un servidor SQL instalado).

Puedo acceder a cada servidor (desde el otro) utilizando las IP privadas asociadas. También me gustaría mantener el reenvío privado sin tener que utilizar una IP pública.

¿Hay una forma fácil de hacer esto?

Respuesta1

Creo que esto podría ser lo que estás buscando:

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to <private ip>:3306

Respuesta2

Tengo una configuración similar, pero un poco más compleja.

En la computadora portátil de mi casa, tengo un /etc/xinetd.d/mysqlfwdcontenedor

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>
}

Esto mysql@<mydomain>denota el subsistema SSH definido en el servidor. Como mysqlno hay ni tiene un nombre de subsistema definido, elegí definir uno yo mismo usando (la convención apropiada para nombres)[http://tools.ietf.org/html/rfc4250#section-4.6.1] .

El utilizado /usr/local/bin/portsse define como

#!/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()

En dicho servidor, hay un usuario llamado connecty, como se dijo, un subsistema llamado mysql@<mydomain>Este último se define /etc/ssh/sshd_configcon la línea

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

El usuario connectexiste solo para tener a mano una plataforma para operar, excepto aceptar mi "clave de reenvío de puerto" a través de su ~/.ssh/authorized_keys, sin características especiales, propiedades o similares.

De esta manera mi servidor puede mantener privado su puerto MySQL (no accesible desde el exterior), pero de todos modos tengo una manera de conectarlo.

información relacionada