Вопрос или проблема
У меня есть сервер WebSocket на node.js, работающий на экземпляре EC2 на порту 8080. Обычные соединения WebSocket (ws://
) работают нормально, но когда я пытаюсь установить безопасное соединение (wss://
), соединение WebSocket не удается.
Я понимаю, что запросы wss отправляются на порт 443, поэтому я использую ALB для перенаправления запросов с порта 443 на порт 8080. Поскольку я совсем нов в AWS, я не знаю, делаю ли я это правильно. Вот что я сделал.
- Сервер Node.js слушает на порту 8080 в экземпляре EC2.
- Вот входящие правила безопасности для этого экземпляра EC2
- Балансировщик нагрузки приложения с слушателем
HTTPS: 443
. Он перенаправляет трафик на мой экземпляр EC2 на порту 8080 с использованием протокола HTTPS. Я также прикрепил SSL сертификат к ALB.
Я просто не могу понять, что я делаю не так. Любая помощь приветствуется.
ОБНОВЛЕНИЕ:
- Я создал две группы безопасности (ec2-sg и alb-sg) и настроил их так, чтобы ec2-sg получал трафик от alb-sg.
Входящие правила безопасности (alb-sg)
Исходящее правило безопасности (alb-sg)
Входящие правила безопасности (ec2-sg)
Тем не менее, я не могу заставить это работать. Целевая группа проходит проверку работоспособности, я включил липкие сеансы, но соединение WebSocket постоянно не удается. Обычное соединение ws, которое раньше работало, тоже перестало работать. Это заставляет меня думать, что я что-то путаю с ALB (так как это работает без балансировщика нагрузки)
Обновление 2:
Я включил журналы доступа для моего балансировщика нагрузки. Вот журнал:
https 2021-10-08T08:55:39.157549Z app/alb-latest/3e73469ba9514449 167.94.138.60:32854 172.31.93.226:8080 -1 -1 -1 502 - 41 1215
"GET https://3.208.76.74:443/ HTTP/1.1" "-" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-1:144045735746:targetgroup/ec2-8080-server/2cbf4f7eb51c201e
"Root=1-6160078b-606aed86364c5e3f7db627f1" "-" "arn:aws:acm:us-east-1:144045735746:certificate/53a04011-1ea7-4689-b6c6-a7372e42191d" 0 2021-10-08T08:55:39.156000Z
"forward" "-" "-" "172.31.93.226:8080" "-" "-" "-"
Слушатели ALB Я также включил липкость на уровне группы для целевой группы на 1 день
Просто копирую и вставляю свой комментарий в ответ, если это решит проблему.
Группа безопасности ALB разрешает только исходящий трафик на порт 8080 в другую группу безопасности. Это означает, что она не сможет отправить ответ клиенту, который будет ждать на каком-то случайном порту, не равном 8080. Лучший подход – удалить исходящие правила и сосредоточиться на входящих правилах – группы безопасности являются состоянием, поэтому исходящие правила не обязательно требуются и усложняют ситуацию!
Ответ или решение
Решение проблемы с безопасным соединением WebSocket (WSS) на сервере EC2
Если вы сталкиваетесь с проблемами при установлении безопасного WebSocket соединения (WSS) на вашем сервере Node.js, запущенном на EC2, вы не одиноки. Давайте детально рассмотрим возможные причины и решения данной проблемы.
1. Подтверждение конфигурации ALB
Прежде всего, важно убедиться, что ваш Application Load Balancer (ALB) правильно настроен для обработки запросов WSS. Ваша конфигурация должна включать:
- Слушатель HTTPS на порту 443: Убедитесь, что у вас есть слушатель, который принимает соединения на порту 443 и перенаправляет их на ваш сервер на порту 8080.
- SSL-сертификат: Проверьте, что ваш ALB имеет установленный и корректно настроенный SSL-сертификат, который предназначен для обработки HTTPS-запросов.
2. Настройки групп безопасности
Ошибки в настройках групп безопасности могут быть основной причиной ваших проблем. В вашем случае, критично то, как настроены входящие и исходящие правила:
-
Группа безопасности ALB (alb-sg): Должна разрешать входящие соединения на порт 443 и отправлять ответы на любые исходящие соединения. Убедитесь, что у вас нет ограничений на исходящий трафик.
-
Группа безопасности EC2 (ec2-sg): Должна разрешать трафик по порту 8080 только от группы безопасности ALB. Следите за тем, чтобы вы не добавляли излишние ограничения, которые могли бы заблокировать соединения.
Рекомендация: Исключите сложные исходящие правила для групп безопасности. Помните, что группы безопасности AWS являются состояния (stateful), что означает, что возвращающийся трафик автоматически разрешен, если исходящий трафик был разрешен.
3. Проверка Логов ALB
Логи ALB, которые вы предоставили, показывают статус 502 Bad Gateway. Это означает, что ALB не смог установить соединение с вашим целевым экземпляром EC2 на порту 8080. Убедитесь, что ваш Node.js веб-сервер активно слушает на порту 8080 и что нет никаких проблем с кодом или зависимостями.
- Проверка состояния приложения: Запустите локально команду на вашем экземпляре EC2, чтобы подтвердить, что приложение действительно работает и слушает на нужном порту:
curl http://localhost:8080
4. Настройки WebSocket
Убедитесь, что вы правильно настраиваете ваш WebSocket клиент. Пример:
const socket = new WebSocket('wss://your_domain_or_IP');
5. Тестирование
После внесения изменений протестируйте соединение ещё раз. Если оно по-прежнему не работает, можно попробовать использовать инструменты отладки сетевого трафика, такие как tcpdump
или SSH-туннелирование, чтобы увидеть, на каком этапе теряется соединение.
6. Заключение
Следуя советам, представленным выше, вы должны быть в состоянии устранить большинство проблем, возникающих при установлении WSS соединений через ALB. Важно помнить, что нет универсального решения для всех случаев, и иногда потребуется индивидуальный подход в зависимости от конфигурации вашего приложения и AWS инфраструктуры.
Если у вас остались вопросы или проблемы, не стесняйтесь обратиться за дополнительной помощью в сообщества AWS или на специализированные форумы.