по умолчанию локальная сторона (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