Туннель SSH через бастион Ubuntu к экземпляру в частной подсети - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть проблема, которую я не могу полностью понять, как ее решить. Вопрос очень распространенный, но я все еще не могу понять, что я делаю неправильно.

Согласно этому документу AWS: Сценарий 2: VPC с общедоступными и частными подсетями (NAT) У меня есть собственный VPC с двумя подсетями: частной и общедоступной. В общедоступной подсети я развернул Ubuntu 16.04 Instance с назначенным EIP. Он также имеет следующие правила входящей группы безопасности:

Type   Protocol Port Range Source            Description
SSH    TCP      22         xx.xx.xx.xx/32    Home IP

и исходящие соответственно:

Type   Protocol Port Range Source            Description
SSH    TCP      22         sg-xxprivatexx    Security group ID for instance in private subnet

выглядит хорошо, я могу ssh это снаружи от моего дома. Нет проблем.

В частной подсети я развернул еще одну машину Ubuntu 16.04 со следующей группой безопасности (правила для входящих подключений):

Type   Protocol Port Range Source            Description
HTTP   TCP      80         sg-xxpublicxxx    Security Group ID for bastion instance in public subnet
SSH    TCP      22         sg-xxpublicxxx    -

и никаких исходящих правил (на самом деле открыто 80, 443 исходящих порта, но, как мне кажется, это не интересная часть). И я все еще могу получить доступ к этой виртуальной машине, используя ssh из моего бастиона.

Сейчас я просто хочу сделать только одну простую вещь - запустить переадресацию порта ssh, чтобы я мог запустить localhost: 8080 в своем домашнем браузере ПК и увидеть веб-страницу, которую я опубликовал в своем личном экземпляре. Если я правильно понимаю из здесь и здесь (и из здесь также) я должен запустить что-то вроде:

 ssh -N -v -L 8080:10.0.1.112:80 ubuntu@3.121.46.99

Что, как я догадываюсь, в основном означает: просто перенаправить трафик с экземпляра частной подсети с IP 10.0.1.112:80 на мою localhost:8080 через мою виртуальную виртуальную машину с именем пользователя ubuntu, размещенную на EIP 3.121.46.99.

Отладка заканчивается строками:

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:ZyVHgnF8z5vE5gfNr1S2JDfjhdydZVTNevPRgJZ+sRA /home/matterai/.ssh/key.pem
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/matterai/.ssh/id_rsa
debug1: Trying private key: /home/matterai/.ssh/id_dsa
debug1: Trying private key: /home/matterai/.ssh/id_ecdsa
debug1: Trying private key: /home/matterai/.ssh/id_ed25519
debug1: No more authentication methods to try.
matterai@3.121.46.99: Permission denied (publickey).

Я играю вокруг этого несколько дней, и я все еще не могу понять, что я делаю неправильно. Это так странно: я могу ssh -A (чтобы разрешить пересылку) на свой бастион, я могу ssh на свой частный экземпляр с бастиона. Но я не могу установить SSH туннель, чтобы увидеть мою веб-страницу (в будущем это будет mongodb) без ошибки. Нужен совет или укажите правильное направление, пожалуйста! Спасибо.

UPD # 1

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

ubuntu@bastion: ssh -v -N -L 5000:localhost:8000 ubuntu@10.0.1.68

После этого на локальной / домашней машине запускается команда:

matterai@homepc: ssh -v -N -L 5000:localhost:5000 ubuntu@3.121.46.99

Когда я делаю запрос к localhost:5000 на моей локальной машине, я вижу страницу результатов. Могу ли я и как, если это возможно, чтобы объединить эти две команды? (спойлер: да, это возможно: смотрите ответ!)

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

У вас, похоже, все настроено правильно, но ошибка говорит о том, что он не может найти закрытый ключ для использования для соединения.

Чтобы проверить переадресацию портов, начните с использования команды ssh, которая входит в ваш публичный экземпляр.

Затем возьмите эту точную команду и просто добавьте: -L 8080:10.0.1.112:80

Если он работает для «обычного» ssh, то он будет работать и с переадресацией портов.

Кстати, в общем случае вам никогда не нужно изменять исходящие правила группы безопасности. Настройки по умолчанию разрешают весь исходящий трафик . Это «доверяет» приложениям, работающим на экземпляре, и позволяет им обмениваться данными в любом месте. Вам нужно будет ограничить такие правила только в том случае, если вы хотите обеспечить среду с высоким уровнем безопасности.

0 голосов
/ 20 апреля 2019

Хорошо, это легко. Надеюсь, мой ответ кому-нибудь поможет.

  1. Вам необходимо использовать опцию ssh -J для подключения через виртуальную машину вашего бастиона:
 -J [user@]host[:port]
         Connect to the target host by first making a ssh connection to
         the jump host and then establishing a TCP forwarding to the ulti‐
         mate destination from there.  Multiple jump hops may be specified
         separated by comma characters.  This is a shortcut to specify a
         ProxyJump configuration directive.
  1. Затем вам нужно перенаправить трафик с порта виртуальной машины назначения (:8000), с которого приложение (или база данных) запущено, на порт локального хоста (:5001), используя ssh -L:
 -L [bind_address:]port:host:hostport
 -L [bind_address:]port:remote_socket
 -L local_socket:host:hostport
 -L local_socket:remote_socket
         Specifies that connections to the given TCP port or Unix socket
         on the local (client) host are to be forwarded to the given host
         and port, or Unix socket, on the remote side.  This works by
         allocating a socket to listen to either a TCP port on the local
         side, optionally bound to the specified bind_address, or to a
         Unix socket.  Whenever a connection is made to the local port or
         socket, the connection is forwarded over the secure channel, and
         a connection is made to either host port hostport, or the Unix
         socket remote_socket, from the remote machine.

        Port forwardings can also be specified in the configuration file.
         Only the superuser can forward privileged ports.  IPv6 addresses
         can be specified by enclosing the address in square brackets.

        By default, the local port is bound in accordance with the
         GatewayPorts setting.  However, an explicit bind_address may be
         used to bind the connection to a specific address.  The
         bind_address of “localhost” indicates that the listening port be
         bound for local use only, while an empty address or ‘*’ indicates
         that the port should be available from all interfaces.
  1. Полная команда ssh будет выглядеть так:
matterai@homepc: ssh -v -N -A -J ubuntu@3.121.46.99 -L 5001:localhost:8000 ubuntu@10.0.1.112
...