Conexiune MySQL prin tunel SSH – cum se specifică un alt server MySQL? (Programare, Mysql, Tunel Ssh)

Mad Marvin a intrebat.

Am ~50 de baze de date, toate configurate la nume de gazdă diferite, cu cerința de a mă conecta la ele printr-un tunel SSH.

De exemplu:

  • Gazdă SSH la ssh.example.com

  • Gazdă MySQL la mysql1.example.com

Am reușit să creez tunelul folosind autossh (server web care rulează Debian), dar nu reușesc să îmi dau seama cum să mă conectez la un anumit nume de gazdă MySQL „dincolo” de tunelul SSH.

Tastând lsof -i -n | egrep '<ssh>' confirmă faptul că tunelul funcționează (trimite portul 3307 la ssh.example.com portul 3306)

Deci, atunci când încerc mysql -h 127.0.0.1 -P 3307 primesc Conexiune refuzată. Nu este prea ciudat, din moment ce nu este un server MySQL.

Întrebarea mea pentru voi:

Cum pot specifica mysql1.example.com gazdă DUPĂ crearea tunelului SSH? Am încercat să caut peste tot, dar nu reușesc să-mi dau seama.

Comentarii

  • Nu sunt familiarizat cu „autossh”, dar dacă aveți un tunel ssh funcțional pe care îl folosiți, aș spune că trebuie doar să înlocuiți 127.0.0.1 cu ținta reală? –  > Por Nanne.
  • @Nanne, vă mulțumim pentru comentariul dvs. Cu toate acestea, 127.0.0.1 este necesar pentru a activa tunelul, altfel va încerca doar să se conecteze direct la gazda de la distanță. –  > Por Mad Marvin.
5 răspunsuri
Mad Marvin

Rezolvat! Lucrul a fost să vă conectați la serverul corect atunci când creați tunelul în sine – ar fi trebuit să văd că unul vine.

ssh -f [email protected] -L 3307:mysql1.example.com:3306 -N

Apoi mysql -h 127.0.0.1 -P 3307 a funcționat așa cum era prevăzut. 🙂

Comentarii

  • ce este -N opțiunea pentru? –  > Por abbood.
  • @abbood opțiunea -N este pentru a crea doar tunelul, nimic mai mult după aceea. –  > Por Mad Marvin.
  • Este frumos! Vă mulțumim! –  > Por dotancohen.
  • Mai exact, trebuie să specificați adresa la care este legat serverul mysql. Căutați bind-address în fișierul my.cnf. Asta este ceea ce se află între cei doi separatori de două puncte. –  > Por Josh Liptzin.
  • 16

  • Doar o notă: este important să folosiți 127.0.0.1 în mysql pentru că dacă folosiți localhost P parametrul va fi ignorat. Mi-a luat ceva bătăi de cap să îmi dau seama de acest lucru. –  > Por fguillen.
sandra kevin

Am un blog frumos despre cum să vă conectați la MySQL folosind tunelul SSH. Este foarte bine explicat aici.

Comanda pentru a vă conecta la tunelul SSH:

ssh -L [listening port]:[REMOTE_MYSQL_HOST]:[REMOTE_MYSQL_PORT] [SSH_USER]@[SSH_HOST]

Comanda de conectare la MySQL:

localhost:[listening port]

Comentarii

  • acesta este un link mort –  > Por Matty H.
  • A trebuit să adăugați parametrul -N înainte de -L –  > Por Telmo Pimentel Mota.
ketankk

Atunci când nu aveți acces direct la mysql-server, utilizați jump-server.

De pe mașina ta, te conectezi(ssh) la jump-server și de acolo te conectezi la mysql-server.

Acest lucru poate fi evitat prin utilizarea ssh- tunneling.

Să presupunem că serverul dvs.

       jump server is `jump-ip`
       mysql server is `mysql-ip`
       your machine is `machine-ip`

Trebuie doar să deschideți clientul ssh (Putty în windows sau terminal în linux/ios).

Scrieți:

    ssh -L [local-port]:[mysql-ip]:[mysql-port] [jump-server-user]@[jump-ip]

După aceasta, puteți utiliza localhost și local-port pentru a accesa direct serverul mysql de pe mașina de la distanță.

De exemplu, adresa dvs. Jdbc pentru a accesa baza de date mysql, în acest caz, va fi

jdbc:mysql://localhost:[local-port]/[database-name]

Pentru utilizatorii de Windows, utilizarea lui Putty pentru a se conecta la serverul MySQL la distanță prin tunelare

Pasul 1: Introduceți gazda/IP a serverului Jump în fila Session (sesiune)

Pasul 2: Mergeți la SSH tab–> Tunnels: Introduceți HostName al serverului MySQL: Port ca destinație și Port sursă ca port local în care doriți să faceți un tunel pentru acest serviciu și faceți clic pe Add

Pasul 3: Reveniți la fila Session și faceți clic pe Open și introduceți acreditările dumneavoastră, dacă este bazat pe nume de utilizator/parolă.

Și utilizați aceleași credențiale ca cele menționate mai sus:

jdbc:mysql://localhost:[local-port]/[database-name]

Javeed Shakeel

Am creat un tunel către baza de date utilizând această comandă

ssh  -L 10000:localhost:3306  [email protected]<ip addess to connect DB> -N -f

-L este portul gazdei locale, este definit de utilizator, puteți furniza orice număr de port.

între 0 și 65535. De la 0 la 1023 sunt rezervate.

dacă utilizați autentificarea pe bază de cheie la server, ar trebui să

menționați cheia astfel.

ssh -i <path of the private key>  -L 10000:localhost:3306  [email protected]<ip addess to connect DB> -N -f

Serhii Kushchenko

Dacă folosiți Python, puteți încerca ceva de genul acesta:

from sshtunnel import SSHTunnelForwarder
import mysql.connector

server = SSHTunnelForwarder(
    ('aXXXXXX.ftp.XXhost.XXX'),
    ssh_password="XXXXXX",
    ssh_username="XXX_X",
    remote_bind_address=('aXXXXXX.mysql.XXhost.XXX', 3306)
)

server.start()

conn2 = mysql.connector.connect(
        host='127.0.0.1',
        port=server.local_bind_port,
        user='XXXXXX',
        passwd='XXXXXX',
        db='XXXXXX'
    )

# test

print(conn2)
cursor = conn2.cursor()     # get the cursor
cursor.execute("SHOW TABLES")    # execute 'SHOW TABLES' (but data is not returned)
print(cursor.fetchall())

# do something useful

server.stop()