로컬(127.0.0.1) MySQL 트래픽을 외부 SQL 서버로 전달하는 방법은 무엇입니까?

로컬(127.0.0.1) MySQL 트래픽을 외부 SQL 서버로 전달하는 방법은 무엇입니까?

기본적으로 Amazon Web Services에는 두 개의 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 포트를 비공개로 유지할 수 있지만(외부에서 액세스할 수 없음) 여전히 연결할 수 있습니다.

관련 정보