Доступ к удаленным нескольким серверам за NAT

У меня есть ситуация, когда наши серверы Ubuntu были развернуты в нескольких удаленных местах. Эти серверы находились за NAT операторского класса, а также за внутренним NAT. Теперь из центрального местоположения я хочу получить к нему доступ в любое время, но я также за NAT, похожим на эти серверы.

Когда эти серверы находятся в сети, я хочу получить к нему доступ (через SSH или SSH туннель). Я знаю, что не могу получить доступ к серверам с публичным IP-адресом, но, возможно, каким-то образом я смогу получить к нему доступ по принципу работы TeamViewer. Для этого метода, если мне нужен другой публичный сервер, я могу управлять им в Google Compute Engine.

1 ответ

Решение

Если у нас есть доступ к серверу с публичным IP-адресом, мы можем использовать его в качестве шлюза. Этого можно добиться с помощью соединений с переадресацией портов по обратному SSH. Допустим, у нас есть три экземпляра:

  • Общедоступный сервер: здесь у нас есть работающий SSH-сервер и общедоступный IP-адрес (и / или доменное имя). Мы можем подключиться к этому серверу с парой открытый-закрытый ключ, которая не защищена парольной фразой ( ссылка).

  • Частный сервер: здесь у нас есть работающий SSH-сервер. Он находится за брандмауэром (NAT, ISP и т. Д.) И не имеет общедоступного IP-адреса, но мы можем установить SSH-соединение с него на публичный сервер, поэтому здесь у нас также есть SSH-клиент.

  • Клиентская машина: здесь у нас (нужно) есть только SSH клиент. Мы можем установить SSH-соединение с публичным сервером. Мы хотим установить SSH-соединение от этого экземпляра до частного сервера.


Основной уровень

На основном уровне мы могли бы применить как минимум два сценария.

Сценарий 1. Где мы не хотим открывать дополнительные порты в брандмауэре публичного сервера:

  1. Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер.
  2. Установите соединение SSH с переадресацией портов с клиентского компьютера на общедоступный сервер.
  3. Подключитесь к частному серверу с клиентского компьютера через себя.

Сценарий 2. Где мы склонны открывать дополнительный порт в брандмауэре публичного сервера:

  1. Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер.
  2. Подключитесь к частному серверу с клиентского компьютера через общий сервер.

Основное преимущество сценария 1 заключается в том, что нам не нужно думать, насколько безопасен наш частный сервер. Основным преимуществом сценария 2 является то, что мы пропускаем один шаг, но в этом случае нам следует подумать о безопасности частного сервера, поскольку он становится общедоступным через перенаправленный порт. Кроме того, эти сценарии могут применяться к различным портам и службам, а не только к SSH, например, к HTTP.


Как применить сценарий 1 в Ubuntu

Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер

Мы могли бы сделать это командой:

ssh user-of-the-public-server@public-server -p 22 -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
  • -p 22 предоставляет порт SSH публичного сервера (это не обязательно).

  • -i ~/.ssh/pass-less/id_rsa предоставляет файл ключа аутентификации.

  • -R 2222:127.0.0.1:22 означает, что порт 2222 на (удаленном) общедоступном сервере будет перенаправлен на порт SSH (локального) частного сервера, который в данном случае 22,

Мы можем отодвинуть это соединение в фоновом режиме, добавив параметры -fTN (клиента OpenSSH - ссылка). Мы могли бы также использовать инструмент autossh чтобы быть уверенным, что соединение будет оставаться активным в течение длительного периода времени ( ссылка):

autossh user-of-the-public-server@public-server -p 22 -fTN -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa

Мы можем упростить приведенную выше команду путем реализации следующих строк в нашем ~/.ssh/config файл:

Host public-server-reverse
    HostName 100.100.100.100  # this is the IP address or the domain name of the Public Server
    IdentityFile ~/.ssh/pass-less/id_rsa
    User user-of-the-public-server
    Port 22
    RemoteForward 2222 localhost:22

В этом случае приведенная выше команда станет:

autossh public-server-reverse -fTN

Мы можем легко автоматизировать эту задачу при перезагрузке системы с помощью следующего задания Cron (или мы можем создать сервис, который должен быть более подходящим):

@reboot sleep 45 && autossh public-server-reverse -fTN

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

ssh user-of-the-private-server@localhost -p 2222    # provide an additional authentication data (for the Private Server) if it is needed…


Установите соединение SSH с переадресацией портов с клиентского компьютера на общедоступный сервер

Мы могли бы сделать это командой:

ssh user-of-the-public-server@public-server -p 22 -fTN -L 1111:127.0.0.1:2222 -i ~/.ssh/pass-less/id_rsa
  • -L 1111:127.0.0.1:2222 означает, что порт 1111 на (локальном) клиентском компьютере будет перенаправлен на (удаленный) порт публичного сервера 2222 (который направляется на порт SSH частного сервера). Обратите внимание, мы могли бы использовать -L 2222:127.0.0.1:2222,

  • -fTN эти параметры будут толкать соединение в фоновом режиме, как описано выше.

  • Мы можем также реализовать autossh а также ~/.ssh/config файл с директивой RemoteForward или же LocalForward,


Подключение к частному серверу с клиентского компьютера через себя

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

ssh user-of-the-private-server@localhost -p 1111    # provide an additional authentication data (for the Private Server) if it is needed…

Как применить Сценарий 2 в Ubuntu

Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер

Этот шаг идентичен первому из Сценария 1, но нужно выполнить несколько дополнительных действий.

Откройте перенаправленный порт 2222 на брандмауэре публичного сервера - это выходит за рамки этого ответа.

изменять /etc/ssh/sshd_config публичного сервера и добавьте следующую директиву, которая позволит открыть наш туннель SSH для публики (не забудьте перезапустить сервер: sudo systemctl restart sshd.service):

GatewayPorts yes

Сделайте наш SSH-туннель открытым для общественности. Этот шаг хорошо описан в вопросе: ( Как сделать ssh-туннель открытым для общественности?). Согласно ответам, мы могли бы добавить -g Опция для команд, устанавливающих соединение между Частным и Общим серверами:

autossh public-server-reverse -gfTN
@reboot sleep 45 && autossh public-server-reverse -gfTN

Или, в качестве альтернативы, вместо этого мы могли бы изменить ~/.ssh/config файл таким образом:

Host public-server-reverse
    HostName 100.100.100.100  # this is the IP address or the domain name of the Public Server
    IdentityFile ~/.ssh/pass-less/id_rsa
    User user-of-the-public-server
    Port 22
    RemoteForward \*:2222 localhost:22

Наконец мы должны killall autossh и снова установите соединение.


Подключение к частному серверу с клиентского компьютера через общий сервер

Выполнив вышеуказанный шаг, мы можем достичь нашей цели командой:

ssh user-of-the-private-server@public-server -p 2222    # provide an additional authentication data (for the Private Server) if it is needed… forward some ports, etc.
Другие вопросы по тегам