Создайте туннель S SH от хоста Jump до базы данных и получите доступ к базе данных через порт хоста Jump - PullRequest
2 голосов
/ 19 апреля 2020

Я пытаюсь создать туннель S SH между базой данных, на которой работает порт сервера, и другим сервером, как показано ниже.

MySQL:3306 <=====> Server-A:3306

И я хочу использовать Server-A:3306 в качестве URI базы данных для подключения к базе данных.

Я выполняю следующее на сервере A

ssh -f -N -i ~/keys/test.pem foo@foo.storesandbox.com -L5001:127.0.0.1:2001

Я вижу, что туннель запущен и работает. Но когда я использую publi c IP-адрес сервера-A и пытаюсь подключиться к базе данных, он не работает.

Если я создаю еще один туннель между сервером-A и тем местом, где я запускаю MySQL клиент. тогда это работает. Но я не хочу этого делать.

В чем может быть причина этой проблемы. Я довольно новичок в написании сценариев

1 Ответ

2 голосов
/ 20 апреля 2020

по умолчанию локальная сторона (s sh клиент) создает порт прослушивания в интерфейсе обратной связи с адресом 127.0.0.1, когда вы используете такую ​​команду

ssh me@server -L3306:localhost:3306

, если вы проверите netstat на своем хосте, вы увидите что-то вроде этого

sudo netstat -ntlp | grep 3306
tcp  0 0 127.0.0.1:3306  0.0.0.0:*   LISTEN 12354/ssh

Таким образом, приложения на вашем локальном узле могут подключаться к такому сопоставленному сервису, потому что петлевой интерфейс видим для самого хоста, но внешние узлы не имеют доступа к этому виртуальному интерфейсу, поэтому не могут устанавливать какие-либо подключения к Любая служба (порт), которая прослушивает этот единственный интерфейс.

Чтобы указать локальному клиенту s sh, чтобы он использовал общий подключенный порт к миру, вам нужно указать, чтобы он связывался с любым из всех интерфейсов (включая loopback). или указать c только интерфейс

# here you explicitly tell ssh client to accept connection to your tunnel
# from any client(i.e. bind listenning port to all interfaces)
ssh me@server -L0.0.0.0:3306:localhost:3306 
sudo netstat -ntlp | grep 3306 
tcp  0 0 0.0.0.0:3306   0.0.0.0:*   LISTEN 12354/ssh

#here you do the same thing by using -g option
ssh me@server -g -L3306:localhost:3306
sudo netstat -ntlp | grep 3306 
tcp  0 0 0.0.0.0:3306   0.0.0.0:*   LISTEN 12354/ssh

#and here is an example of how to bind to specific interfaces only
# 10.0.0.12 is an IP of one of interfaces on your node
# 10.1.0.156 is also IP address of one interfaces of your node
ssh me@server -L10.0.0.12:3306:localhost:3306 -L10.1.0.156:3306:localhost:3306

sudo netstat -ntlp | grep 3306
tcp  0 0 10.0.0.12:3306   0.0.0.0:*   LISTEN 12354/ssh
tcp  0 0 10.1.0.156:3306  0.0.0.0:*   LISTEN 12354/ssh

...