невозможно подключиться к экземпляру RDS AWS VPC (mysql или postgres)

(Я публикую этот вопрос постфактум из-за времени, которое потребовалось для поиска основной причины и решения. Также велика вероятность того, что другие люди столкнутся с той же проблемой)

У меня есть экземпляр RDS (в VPC), к которому я пытаюсь подключиться из приложения, работающего на классическом экземпляре EC2, подключенном через ClassicLink. Группы безопасности и DNS не проблема.

Я могу установить сокет-соединения с экземпляром RDS, но не могу подключиться к инструментам CLI (psql, mysql и т. д.) или инструментам DB GUI, таким как toad или mysql workbench.

Прямые сокетные соединения с помощью telnet или nc приводят к тому, что TCP-соединения находятся в состоянии «УСТАНОВЛЕНО» (вывод из netstat).

Соединения из DB CLI, инструментов GUI или приложений приводят к тайм-аутам и TCP-соединениям, которые застревают в состоянии «SYN».

ОБНОВЛЕНИЕ: основной причиной в моем случае была проблема с размером MTU и EC2 ClassicLink. Я разместил некоторую общую информацию об устранении неполадок ниже в ответе на случай, если другие люди столкнутся с аналогичными проблемами подключения RDS.


person ives    schedule 28.07.2015    source источник


Ответы (1)


Дополнительная информация для людей, которые могут столкнуться с похожими проблемами при подключении к RDS или RedShift:

1) Проверьте группы безопасности

Убедитесь, что группа безопасности для экземпляра RDS разрешает доступ из группы безопасности, к которой принадлежит ваш исходный сервер (или ее IP-адрес, добавленный напрямую, если он является внешним по отношению к AWS). Группа безопасности, на которую следует обратить внимание, указана в атрибутах экземпляра RDS в пользовательском интерфейсе консоли RDS (с именем «группа безопасности»).

ПРИМЕЧАНИЕ. Группы безопасности базы данных могут отличаться от групп безопасности AWS EC2. Если ваш экземпляр RDS находится в классическом/общедоступном EC2, вам следует проверить раздел «группа безопасности базы данных» пользовательского интерфейса RDS. Для пользователей VPC группа безопасности будет обычной группой безопасности VPC (имя sg-xxx будет указано в атрибутах экземпляра RDS).

2) Убедитесь, что DNS не является проблемой.

Amazon использует разделенный DNS, поэтому поиск DNS, внешний по отношению к AWS, возвращает общедоступный IP-адрес, а поиск внутри AWS возвращает частный IP-адрес. Если вы подозреваете, что проблема связана с DNS, подтвердили ли вы, что из разных зон доступности возвращаются разные IP-адреса? Если разные зоны доступности получают разные IP-адреса, вам необходимо обратиться в службу поддержки AWS.

3) Подтвердите подключение к сети, установив подключение через сокет.

Такие инструменты, как tracepath и traceroute, скорее всего, не помогут, поскольку в настоящее время RDS отбрасывает ICMP-трафик.

Проверьте подключение к порту, попытавшись установить подключение через сокет к экземпляру RDS через порт 3306 (mysql или 5432 для postgres). Начните с поиска IP-адреса экземпляра RDS и использования либо telnet, либо nc (обязательно используйте внутренний/частный IP-адрес при подключении из AWS):

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306

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

b) Если ваше подключение не установлено и время ожидания истекло, возможно, пакеты отбрасываются/игнорируются брандмауэром или пакеты возвращаются по другому сетевому пути. Вы можете убедиться в этом, запустив netstat -an | grep SYN (из другого сеанса ssh, ожидая истечения времени ожидания команды telnet/nc).

Соединения в состоянии SYN означают, что вы отправили запрос на соединение, но ничего не получили в ответ (SYN_ACK или reject/block). Обычно это означает, что брандмауэр или группа безопасности игнорируют или отбрасывают пакеты.

Это также может быть проблема с маршрутизацией NAT или несколькими путями от нескольких интерфейсов. Убедитесь, что вы не используете iptables или шлюз NAT между вашим хостом и экземпляром RDS. Если вы находитесь в VPC, также убедитесь, что разрешен исходящий/исходящий трафик с исходного хоста.

c) Если проверка подключения к сокету прошла успешно, но вы не можете подключиться к клиенту mysql (CLI, workbench, приложение и т. д.), просмотрите выходные данные netstat, чтобы узнать, в каком состоянии установлено соединение (замените xxxx фактическим IP-адресом экземпляра RDS):

netstat -an | grep x.x.x.x

Если вы устанавливаете соединение при использовании telnet или NC, но видите состояние «SYN» при использовании клиента mysql, возможно, вы столкнулись с проблемой MTU.

RDS на момент написания может не поддерживать пакеты ICMP, используемые для PMTUD (https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD). Это может быть проблемой, если вы пытаетесь получить доступ к RDS или RedShift, которые находятся в VPC, из классического экземпляра ec2 через ClassicLink. Попробуйте уменьшить MTU следующим образом, а затем повторите тестирование:

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400

Если более низкий MTU сработал, обязательно обратитесь в службу поддержки клиентов AWS за помощью и упомяните, что вы видите проблему с MTU при попытке подключения к вашему экземпляру RDS. Это может произойти, если TCP-пакеты инкапсулированы для туннелирования, что приводит к меньшему используемому MTU для пакетных данных/полезной нагрузки. Уменьшение MTU на исходном сервере позволяет упакованным пакетам по-прежнему соответствовать пределу MTU при прохождении через шлюз туннелирования.

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

person ives    schedule 28.07.2015