ローカル (127.0.0.1) MySQL トラフィックを外部 SQL サーバーに送信するにはどうすればよいですか?

ローカル (127.0.0.1) MySQL トラフィックを外部 SQL サーバーに送信するにはどうすればよいですか?

基本的に、Amazon Web Services に 2 つの EC2 インスタンスがあります。どちらも Ubuntu 11.10 x64 を実行しています。どちらもプライベート IP アドレスとパブリック (Elastic) IP アドレスを持っています。SQL データを適切に転送するために iptables を設定するのに問題があります。

サーバー 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 ポートを非公開 (外部からアクセスできない) にすることができますが、それでも接続する方法があります。

関連情報