如何将本地 (127.0.0.1) MySQL 流量定向到外部 SQL 服务器?

如何将本地 (127.0.0.1) MySQL 流量定向到外部 SQL 服务器?

基本上,我在 Amazon Web Services 上有两个 EC2 实例。它们都运行 Ubuntu 11.10 x64。它们都有私有和公共(弹性)IP 地址。我在设置 iptables 来正确转发 SQL 数据时遇到问题。

我希望这样,如果我连接到服务器 A(未安装 SQL 服务器)上的“127.0.0.1:3306”,它将转发到<private ip>:3306(又名服务器 B——安装了 SQL 服务器)。

我可以使用关联的私有 IP 访问每台服务器(从另一台服务器)。我也想保持转发的私密性,而不必使用公共 IP。

是否有捷径可寻?

答案1

我想这可能就是您正在寻找的:

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

答案2

我有一个类似的设置,但稍微复杂一些。

在我的家用笔记本电脑上,我有一个/etc/xinetd.d/mysqlfwd包含

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

mysql@<mydomain>表示服务器上定义的 SSH 子系统。由于mysql没有,也没有定义的子系统名称,我选择使用(适当的名称约定)自己定义一个子系统名称[http://tools.ietf.org/html/rfc4250#section-4.6.1] 。

使用的/usr/local/bin/ports定义为

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

在所述服务器中,有一个名为的用户connect,并且如上所述,有一个名为的子系统,mysql@<mydomain>后者是/etc/ssh/sshd_config用以下行定义的

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

用户的connect存在只是为了拥有一个可以操作的平台,除了通过其接受我的“端口转发密钥”之外~/.ssh/authorized_keys,没有特殊的功能、属性等。

这样我的服务器可以保持其 MySQL 端口私有(无法从外部访问),但我仍然有办法连接它。

相关内容