túnel SSH para conectar dois servidores através de um terceiro

0

Tenho três servidores A , B e C , além do meu localhost . Cada servidor está dentro de uma rede apropriada, e o servidor C deve se conectar a um banco de dados mysql no servidor A na porta 3306 para realizar alguns testes.

O cenário é o seguinte:

  • No servidor C , executo PHP scripts para abrir um mysql connection para B (que não é um servidor-mysql )
  • eu posso ssh de localhost para o servidor B
  • Eu posso ssh de localhost para o servidor A

Servidor Um possui um servidor mysql (obviamente), mas o servidor B não possui um servidor mysql.

Eu tentei o seguinte método:

  • Mapear remoto B: 3306 para localhost: 3337 , usando:

    ssh -R 3306:localhost:3337 b-user@B-server
    
  • Mapeie localhost: 3337 para A: 3306 , usando:

    ssh -L 3337:localhost:3306 a-user@A-server'
    
  • Teste o script php para abrir a conexão com B:

    $host= '<B-server>';
    $pwd = '<mysql-pwd>';
    $user= '<mysql-user>';
    $db  = "my_test_db";
    try {
        $pdo = new PDO("mysql:host={$host};dbname={$db};port=3306", $user, $pwd);
    } catch (PDOException $e) {
       print "Error!: " . $e->getMessage() . "<br/>";
       die();
    }
    

Quando executo o script php acima, recebo o erro:

Error!: SQLSTATE[HY000] [2002] Connection refused

Há algo errado nos usos portuários?

UPDATE

No servidor B , instalei mysql-client e, em seguida, testei a conexão com o servidor A vai bem:

mysql -u <sql-user> -p<sql-pass> --host 127.0.0.1 -P 3306

De fato, a comunicação entre A e B via localhost está funcionando.

    
por Sim Sca 16.02.2018 / 09:42

1 resposta

0

-L (local) escuta no host local, onde você executa o ssh. (é o que você precisa)

-R (remoto) escuta no host remoto, no host ao qual você se conecta pelo ssh. é usado para conexão reversa.

1.1 . Você precisa conectar ssh de C a B e mapeie a porta local (3306 ou qualquer não padrão) para B: 3306

ssh -L 3306:A:3306 b-user@B-server

1.2 então conecte o cliente Mysql ao localhost: 3306

Neste cenário, conexão Mysql B - > C não criptografado por ssh.

2.1 . Conecte o ssh de C a A usando B como host bastion. e mapeie a porta local para a porta local em A.

ssh -o ProxyCommand='ssh b-user@B-server nc A-server 22' -L 3306:localhost:3306 ssh a-user@A-server

Ou se o OpenSSH for novo o suficiente

ssh -o ProxyCommand='ssh b-user@B-server -W A-server:22' -L 3306:localhost:3306 ssh a-user@A-server

2.2 então conecte o cliente Mysql ao localhost: 3306

3.1 Se você não precisar de criptografia para o mysql e precisar de desempenho máximo

ssh b-user@B-host ncat --sh-exec "ncat A-server 3306" -l 3306 --keep-open

3.2 então conecte o cliente Mysql ao servidor B: 3306

4.1 Use dois ssh tunnel em sequência (o que o Sim Sca tenta fazer como eu entendo)

ssh -L 3306:localhost:3337 b-user@B-server ssh -N -L 3337:localhost:3306 a-user@A-server
  • conecte de C a B e mapeie local (C) 3306 para B: 3337
  • conecte de B a A e mapeie o local (B) 3337 para A: 3306

4.2 então conecte o cliente Mysql ao localhost: 3306

Eu não gosto desse jeito, porque preciso escolher porta (3337) em B.

UPD para a pergunta upd:

Por padrão, ssh escuta apenas localmente.

Quando você mapeia o controle remoto B: 3306 para localhost: 3337, use:

ssh -R 0.0.0.0:3306:localhost:3337 b-user@B-server

para ouvir em todos os IPs

Se a criptografia ssh não for necessária para o caso de conexão do mysql, 3 poderá obter um melhor desempenho.

    
por 16.02.2018 / 14:25