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