У меня есть три сервера A , B и C , а также мой localhost. Каждый сервер находится в соответствующей сети, и сервер C должен подключиться к базе данных mysql на сервере A через порт 3306, чтобы выполнить некоторые тесты.

Сценарий таков:

  • На сервере C я запускаю сценарии PHP чтобы открыть mysql connection с B (которое не является mysql-сервером)
  • Я могу SSH с локального хоста на сервер B
  • Я могу SSH с локального хоста на сервер A

Сервер A имеет сервер mysql (очевидно), но сервер B не имеет сервера mysql.

Я попробовал следующий метод:

  • Отобразите удаленный B: 3306 на localhost: 3337 , используя:

    ssh -R 3306:localhost:3337 b-user@B-server
    
  • Карта localhost: 3337 до A: 3306 , используя:

    ssh -L 3337:localhost:3306 a-user@A-server`
    
  • Протестируйте скрипт php, чтобы открыть соединение с 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();
    }
    

Когда я запускаю приведенный выше скрипт php, я получаю сообщение об ошибке:

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

Что-то не так в использовании портов?

ОБНОВИТЬ

На сервере B я установил mysql-client , а затем тестирование соединения с сервером A проходит хорошо:

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

Действительно, связь между A и B через localhost работает.

1 ответ1

0

-L (локальный) слушать на локальном хосте, где вы запускаете ssh. (это то, что вам нужно)

-R (удаленное) прослушивание на удаленном хосте, на хосте, к которому вы подключаетесь по ssh. он используется для обратного подключения.

1.1. Вам нужно подключить SSH от C до B и сопоставить локальный порт (3306 или любой нестандартный) с B:3306

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

1.2 затем подключите Mysql-клиент к localhost:3306

В этом случае Mysql соединение B -> C не зашифровано с помощью SSH.

2.1. Подключите SSH от C к A, используя B в качестве хоста бастиона. и сопоставьте локальный порт с локальным портом на A.

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

Или если OpenSSH достаточно новый

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

2.2 затем подключите Mysql-клиент к localhost:3306

3.1 Если вам не нужно шифрование для mysql и требуется максимальная производительность

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

3.2 затем подключите Mysql-клиент к B-серверу:3306

4.1 Используйте два туннеля ssh в последовательности (что пытается сделать Sim Sca, как я понимаю)

ssh -L 3306:localhost:3337 b-user@B-server ssh -N -L 3337:localhost:3306 a-user@A-server
  • соединитесь от C до B и сопоставьте местное (C) 3306 с B:3337
  • соединитесь от B до A и сопоставьте местный (B) 3337 с A:3306

4.2, затем подключите Mysql-клиент к localhost:3306

Мне не нравится этот способ, потому что нужно выбрать порт (3337) на B.

UPD для уточняющего вопроса:

По умолчанию ssh слушает только локально.

Когда вы отображаете удаленный B:3306 на localhost:3337, используйте:

ssh -R 0.0.0.0:3306:локальный хост:3337 b-пользователь @ B-сервер

слушать на всех IP

Если шифрование ssh не требуется для случая подключения mysql, 3 может повысить производительность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .