如何將本機 (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 連接埠私有(無法從外部存取),但我仍然有辦法連接它。

相關內容