Как направить локальный (127.0.0.1) трафик MySQL на внешний сервер SQL?

Как направить локальный (127.0.0.1) трафик MySQL на внешний сервер SQL?

По сути, у меня есть два экземпляра EC2 на Amazon Web Services. Они оба работают под управлением Ubuntu 11.10 x64. У обоих есть частный и публичный (Elastic) IP-адреса. У меня возникли проблемы с настройкой iptables для правильной пересылки данных SQL.

Мне бы хотелось, чтобы при подключении к «127.0.0.1:3306» на сервере A (на котором не установлен сервер SQL) осуществлялась переадресация на <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 закрытым (недоступным извне), но у меня все равно есть способ подключиться к нему.

Связанный контент