Доступ к удаленным нескольким серверам за 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. Где мы не хотим открывать дополнительные порты в брандмауэре публичного сервера:
- Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер.
- Установите соединение SSH с переадресацией портов с клиентского компьютера на общедоступный сервер.
- Подключитесь к частному серверу с клиентского компьютера через себя.
Сценарий 2. Где мы склонны открывать дополнительный порт в брандмауэре публичного сервера:
- Установите соединение SSH с переадресацией портов с частного сервера на публичный сервер.
- Подключитесь к частному серверу с клиентского компьютера через общий сервер.
Основное преимущество сценария 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.