SSH-доступ на сервер за NAT-ом

12 февраля 2018

Дано: сервер с приватным IP-адресом, недоступный для обращений из Интернета — например, расположенный в локальной сети за NAT-ом.
Задача: предоставить к серверу SSH-доступ из внешнего мира.
Решение: постоянно установленная исходящая SSH-сессия с приватного сервера на публичный, перенаправляющая порт с публичного сервера на приватный.
Необходимое условие: во внешнем мире нам потребуется промежуточный SSH-сервер с публичным IP.

Настраиваем приватный сервер

Общая схема:

  • создаём псевдопользователя;
  • генерируем пару SSH-ключей;
  • публичный ключ копируем на внешний сервер;
  • параметры подключения сохраняем в ~/.ssh/config, чтобы не указывать их каждый раз в командной строке.

Команды (здесь и далее выполняются от имени суперпользователя):

useradd -s /bin/true -c Pseudo_user_for_ssh_rtunnel -m -r rtunnel
sudo -u rtunnel -H ssh-keygen
scp ~rtunnel/.ssh/id_rsa.pub central-server:/tmp/

EDIT (здесь и далее — создаем, редактируем, сохраняем файл) ~rtunnel/.ssh/config

Host rtunnel
      Hostname publuc-server.example.org
      User rtunnel
      RemoteForward 2222 127.0.0.1:22
      ServerAliveInterval 30
      ServerAliveCountMax 5

Настраиваем публичный сервер

Общая схема:

  • создаём псевдопользователя, под именем которого будет подключаться SSH-клиент с приватного сервера;
  • useradd вызываем с ключом «-r», который означает «Create a system account» (Создать системную учётную запись);
  • благодаря этому его имя, например, не появится в списке пользователей для входа в систему в графическом режиме.

Команды:

useradd -s /bin/true -c Pseudo_user_for_ssh_rtunnel -m -r rtunnel
mkdir ~rtunnel/.ssh
mv /tmp/id_rsa.pub ~rtunnel/.ssh
chown -R rtunnel ~rtunnel

Проверяем

На приватном сервере:

sudo -u rtunnel -H ssh -N rtunnel
  • ключ «-N» означает «Do not execute a remote command. This is useful for just forwarding ports» (Не выполнять никаких команд. Полезно для проброса портов без дополнительных действий);
  • этот режим можно задать только в командной строке, директивы в ~/.ssh/config для него не существует;
  • внешне SSH после успешного подключения будет висеть, не выполняя никаких действий.

На публичном сервере:

netstat -ntlp | grep 2222
ssh -p2222 127.0.0.1

Настраиваем автозапуск на приватном сервере

В качестве системы инициализации на приватном сервере должен использоваться Systemd (для большинства современных дистрибутивов это так).

EDIT /etc/systemd/system/rtunnel.service

[Unit]
Description = SSH Tunnel to local over tunnel to remote
After = network-online.target
Wants = network-online.target
#
[Service]
User = rtunnel
Type = simple
ExecStart = /usr/bin/ssh -N rtunnel
Restart = always
RestartSec = 30s
#
[Install]
WantedBy = multi-user.target

Регистрируем, включаем, запускаем, проверяем:

systemctl daemon-reload
systemctl enable rtunnel
systemctl start rtunnel
systemctl status rtunnel


← Назад в Блог