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/mysqlfwd
contenedor
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 mysql
no 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/ports
se 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 connect
y, como se dijo, un subsistema llamado mysql@<mydomain>
Este último se define /etc/ssh/sshd_config
con la línea
Subsystem mysql@<mydomain> /usr/bin/netcat localhost 3306
El usuario connect
existe 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.