デフォルトでは、Amazon Web Servicesには2つのEC2インスタンスがあります。どちらもUbuntu 11.10 x64を実行します。どちらもプライベートとパブリック(弾力性)のIPアドレスを持っています。 SQLデータを正しく渡すためにiptablesを設定するのに問題があります。
<private ip>:3306
サーバーA(SQL Serverがインストールされていない)から「127.0.0.1:3306」に接続すると(SQL ServerがインストールされているサーバーBとも呼ばれます)に転送されるようにしたいと思います。
接続されたプライベート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ポートをプライベートに保つことができますが(外部からはアクセスできません)、それでも接続できます。