У меня возникли проблемы с доступом к экземпляру AWS RDS в частной подсети с помощью диспетчера сеансов через экземпляр ec2 (Ubuntu).
Переадресация портов с помощью AWS Session Manager -
aws ssm start-session --target $INSTANCE_ID \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":[3307],"localPortNumber":["8000"]}' \
--profile=production \
--region=us-east-1`
Теперь локальный порт 8000 успешно перенаправлен на порт 3307 EC2.
lsof -nP +c 15 | grep LISTEN
session-manager 59744 xrage 12u IPv4 0xa6c821d0a800e9a1 0t0 TCP 127.0.0.1:8000 (LISTEN)
Экземпляр EC2 имеет правило iptable, которое перенаправляет весь трафик через порт 3307 на хост rds через порт 3306 (ПОРТ MYSQL).
sudo iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 3307 -j DNAT --to-destination <rds_private_ip>:3306
Это позволило мне получить доступ к удаленному хосту через нужный порт из ec2, но удаленный хост по-прежнему недоступен локально через порт 8000.
Сетевые данные на локальной машине -
- Не использую прокси
- Брандмауэр отключен на Mac
Итак, очевидно, что настройка SSM работает, но что-то еще блокирует этот трафик. Нужна помощь.
решение1
Когда вы сказали, что удаленный хост может получить доступ к экземпляру MySQL, вы пробовали этот порт (telnet) или клиент командной строки MySQL, просто чтобы подтвердить?
Если предположить, что вышесказанное верно, я бы перешел к следующему шагу. Я понимаю, что AWS-StartPortForwardingSession должен покрыть этот сценарий: у вас есть что-то, работающее на вашем EC2, скажем, база данных MySQL, которую вы вручную накрутили и установили. Вы хотите перенаправить трафик с вашей рабочей станции (например) на экземпляр MySQL, работающий на EC2, через SSM. Именно для этого и был разработан AWS-StartPortForwardingSession.
В вашем случае EC2 — это скорее хост-бастион, а ваш экземпляр MySQL — тип RDS. Так что ваш EC2 ничего не размещает — это просто шлюз для подключения к вашему RDS.
Если предположить, что приведенное выше предположение верно, я бы вместо этого использовал AWS-StartSSHSession (https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html).
Полный ответ был бы подробным, но я сделал это всего несколько месяцев назад:https://medium.com/@clearwaterstream/recipe-connect-to-an-rds-database-in-a-private-subnet-from-your-workstation-over-https-c66db6ead9f0
решение2
27 мая 2022 г. AWSобъявленная поддержкадляПереадресация портов на удаленные хосты с помощью диспетчера сеансов:
Для начала установите SSM Agent версии 3.1.1374.0 или более поздней на управляемых экземплярах, с которыми вы устанавливаете сеанс переадресации портов. Вы можете запустить сеанс переадресации портов из командной строки, используя
AWS-StartPortForwardingSessionToRemoteHost
документ Session Manager.
Чтобы начать сеанс переадресации портов, выполните следующую команду из CLI. Замените значения <EC2_INSTANCE_ID>
, <RDS_DB>
, <RDS_PORT>
, и <LOCAL_PORT>
на свою информацию:
aws ssm start-session \
--target <EC2_INSTANCE_ID> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<RDS_DB>"], "portNumber":["<RDS_PORT>"], "localPortNumber":["<LOCAL_PORT>"]}'
Более подробную информацию можно найти в документации AWS:AWS Systems Manager — Руководство пользователя — Менеджер сеансов — Запуск сеанса (переадресация портов на удаленный хост).
Похожие записи в блоге AWS:
- Используйте переадресацию портов в AWS Systems Manager Session Manager для подключения к удаленным хостам
- Безопасное удаленное подключение к экземпляру базы данных Amazon RDS или Amazon EC2 с помощью предпочитаемого вами графического интерфейса.
Сопутствующие проблемы GitHub и запросы на извлечение:
- aws/amazon-ssm-agent — Проблема № 208 — Запрос функции: Переадресация на удаленный порт
- aws/amazon-ssm-agent — Проблема № 240 — Запрос функции: разрешить указание IP-адреса для AWS-StartSSHSession № 240
- aws/amazon-ssm-agent — запрос на извлечение № 389 — поддержка указания хоста для переадресации портов
Сопутствующий вопрос StackOverflow: