Como eu direcionaria o tráfego MySQL local (127.0.0.1) para um servidor SQL externo?

1

Basicamente, tenho duas instâncias do EC2 no Amazon Web Services. Ambos estão executando o Ubuntu 11.10 x64. Ambos possuem endereços IP privados e públicos (Elastic). Estou tendo problemas para configurar o iptables para encaminhar dados SQL corretamente.

Eu gostaria que, se eu me conectasse a "127.0.0.1:3306" no Servidor A (que não tem um servidor SQL instalado), ele encaminharia para <private ip>:3306 (também conhecido como Servidor B - que tem um servidor SQL instalado).

Consigo acessar cada servidor (do outro) usando os ip's privados associados. Gostaria de manter o encaminhamento privado também sem ter que usar um IP público.

Existe uma maneira fácil de fazer isso?

    
por Michael D 04.04.2012 / 04:42

2 respostas

1

Acho que isso pode ser o que você está procurando:

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to <private ip>:3306
    
por 04.04.2012 / 06:59
0

Eu tenho uma configuração semelhante, mas um pouco mais complexa.

No meu laptop de casa, eu tenho um /etc/xinetd.d/mysqlfwd contendo

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

Este mysql@<mydomain> indica o subsistema SSH definido no servidor. Como mysql não é, e não tem, um nome de subsistema definido, escolhi definir um por mim usando (a Convenção apropriada para nomes) [http://tools.ietf.org/html/rfc4250#section-4.6 .1].

O /usr/local/bin/ports usado é definido 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()

No referido servidor, existe um usuário chamado connect e, como dito, um subsistema chamado mysql@<mydomain> O último é definido em /etc/ssh/sshd_config com a linha

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

O usuário connect existe apenas para ter uma plataforma para operar, exceto aceitar minha "chave de encaminhamento de porta" por meio de seu ~/.ssh/authorized_keys , nenhum recurso especial, propriedades ou tal.

Desta forma, o meu servidor pode manter sua porta MySQL privada (não acessível de fora), mas eu tenho uma maneira de conectá-lo, no entanto.

    
por 04.04.2012 / 14:27