У меня есть ситуация, когда наши серверы Ubuntu были развернуты в нескольких удаленных местах. Эти серверы находились за NAT операторского уровня, а также за внутренним NAT. Теперь из центра я хочу получить к нему доступ в любое время, но я также нахожусь за NAT, похожим на эти серверы.
Когда эти серверы подключены к сети, я хочу получить к ним доступ (через SSH или туннель SSH). Я знаю, что не могу получить доступ, как к серверам с общедоступным IP-адресом, но, возможно, каким-то образом я смогу получить к нему доступ через принцип работы TeamViewer. Для этого метода, если мне нужен еще один общедоступный сервер, я могу управлять им в Google Compute Engine.
Если у нас есть доступ к серверу с общедоступным IP-адресом, мы можем использовать его в качестве Шлюза. Мы могли достигнуть этого через Обратные соединения Перенаправления портов SSH. Скажем, у нас есть три экземпляра:
Общедоступный Сервер: Здесь у нас есть операционный сервер SSH и общедоступный IP-адрес (и/или доменное имя). Мы можем соединиться с этим сервером с парой общедоступной с закрытым ключом, которая не является паролем, защищенным (ссылка).
Частный Сервер: Здесь у нас есть операционный сервер SSH. Это находится позади Брандмауэра (NAT, ISP, и т.д.) и не имеет общедоступного IP-адреса, но мы можем установить соединение SSH с него на Общедоступный Сервер, таким образом, здесь у нас есть также клиент SSH.
Клиентская Машина: Здесь у нас (нужно к) есть только клиент SSH. Мы можем установить соединение SSH к Общедоступному Серверу. Мы хотим установить соединение SSH с этого экземпляра на Частный Сервер.
На основном уровне мы могли применить по крайней мере два сценария.
Сценарий 1. Где мы не хотим открывать дополнительные порты в Брандмауэре Общедоступного Сервера:
Сценарий 2. Где мы склонны открыть дополнительный порт в Брандмауэре Общедоступного Сервера:
Основное преимущество Сценария 1 состоит в том, что мы не должны думать, насколько безопасный наш Частный Сервер. Основное преимущество Сценария 2 состоит в том, что мы ommit один шаг, но в этом случае мы должны думать о безопасности Частного Сервера, потому что это становится достоянием общественности доступное через переданный порт. Кроме того, эти сценарии могли быть применены к другому порту и сервисам, не только SSH, например, к HTTP.
Установите соединение 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
Мы можем легко автоматизировать эту задачу на системной перезагрузке следующим заданием Крона (или мы могли создать обслуживание, которое должно быть лучшим подходом):
@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…
Установите соединение 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.