Биндинг на 0.0.0.0 удаленной машины при SSH туннелировании (SSH -R)

Для быстрого поднятия VPN туннеля можно использовать SSH. Есть возможность поднять туннель для подключения с локального хоста к удаленному, это называется Local TCP forwarding (SSH -L) и обратная ситуация — когда нужно удаленному хосту дать пробросить порт к локальному — Remote TCP forwarding (SSH -R).

Была задача — сделать временный доступ к БД, расположенной на локальном компьютере (host_local), имеющего «серый» адрес со стороны приложения, который находится в docker контейнере на удаленном сервере (host_remote).

Было решено организовать VPN тоннель с помощью Remote TCP forwarding с host_local до host_remote, затем приложение из docker контейнера просто подключается на внешний порт host_remote.

Т.к. схема делалась временная, то опустим вопрос необходимости root доступа.

На host_local необходимо выполнить следующую команду:

На remote_host смотрим слушающие порты через netstat -anp и обнаруживаем, что биндинг (bind) идет на 127.0.0.1, вместо указанного 0.0.0.0. Следовательно, с внешнего ip host_remote порт будет недоступен. Можно попробовать проблему решить через iptables, пробросив порт с внешнего ip на внутренний, но т.к. для меня эта тема несколько отдаленная, то нашел причину — почему при явном указании bind 0.0.0.0 — происходит bind на 127.0.0.1.

Кроется она в настройках ssh сервера, на host_remote нам нужно добавить следующий конфиг в /etc/ssh/sshd_config:

После перезапускаем ssh сервер одним из способов (зависит от ОС):

Снова поднимаем туннель и радуемся, что проброшенный порт доступен с внешнего ip host_remote (не забываем открыть в фаерволе его).

И вырезка с man ssh, прочитав которую с самого начала поиска решения проблемы — сэкономила бы мне очень много времени:

By default, TCP listening sockets on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server’s GatewayPorts option is enabled (see sshd_config(5)).