Basicamente, tenho duas instâncias EC2 na Amazon Web Services. Ambos estão executando o Ubuntu 11.10 x64. Ambos têm 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 possui um servidor SQL instalado), ele encaminhasse para <private ip>:3306
(também conhecido como Servidor B - que possui um servidor SQL instalado).
Consigo acessar cada servidor (do outro) usando os IPs privados associados. Eu também gostaria de manter o encaminhamento privado, sem precisar usar um IP público.
Existe uma maneira fácil de fazer isso?
Responder1
Acho que pode ser isso que você está procurando:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to <private ip>:3306
Responder2
Eu tenho uma configuração semelhante, mas um pouco mais complexa.
No meu laptop doméstico, tenho um /etc/xinetd.d/mysqlfwd
arquivo 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>
}
Isso mysql@<mydomain>
denota o subsistema SSH definido no servidor. Como mysql
não existe e não possui um nome de subsistema definido, optei por definir um sozinho usando (a Convenção para Nomes apropriada)[http://tools.ietf.org/html/rfc4250#section-4.6.1] .
O usado /usr/local/bin/ports
é 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 nomeado connect
e, como dito, um subsistema denominado mysql@<mydomain>
Este último é definido /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 em mãos, exceto aceitar minha "chave de encaminhamento de porta" por meio de seu ~/.ssh/authorized_keys
, sem recursos especiais, propriedades ou similares.
Dessa forma, meu servidor pode manter sua porta MySQL privada (não acessível de fora), mas mesmo assim tenho uma maneira de conectá-la.