Nie można połączyć się z instancją RDS spoza VPC (ERROR 2003 (HY000) Nie można połączyć się z serwerem MySQL)

12

Stworzyłem VPC, a wewnątrz niego instancję RDS. Instancja RDS jest publicznie dostępna, a jej ustawienia są następujące:

Ustawienia RDS

Grupa zabezpieczeń dołączona do instancji RDS akceptuje cały ruch:

Ustawienia grupy zabezpieczeń

Wszystkie sieciowe listy ACL akceptują cały ruch. Jednak nie mogę uzyskać dostępu do mojej instancji z komputera spoza mojego VPC. Otrzymuję następujący błąd:

    root@vps151014:~# mysql -h mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com -P 3306 -u skullberry -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on 'mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com' (110)

Jeśli uruchomię to samo polecenie z EC2 w moim VPC, mogę się połączyć. Próbowałem połączyć się z kilku komputerów, wszystkie bez firewalla (tzn. Otwarty port 3306).

Oczywiście czegoś mi brakuje, ale wszystko wydaje się być poprawnie skonfigurowane. Co może być problemem?

dazedviper
źródło
1
Komunikat (110)o błędzie oznacza „upłynął limit czasu połączenia”, więc zdecydowanie jest to problem z łącznością IP. Wystąpienie RDS pokazuje, że jest powiązane z dwiema podsieciami. W konsoli VPC jaka jest domyślna trasa tych dwóch podsieci? Czy jest to „igw-xxxxxxxx” czy też „i-xxxxxxxx”?
Michael - sqlbot
Obie podsieci są domyślnie powiązane z główną tablicą tras VPC.
dazedviper,
1
Jawne powiązanie obu podsieci z niestandardową tabelą tras, która kieruje cały ruch wychodzący do bramy internetowej VPC, nie ma żadnej różnicy.
dazedviper,
1
Cóż, to kłótnia. Domyślna droga do „igw” wydawała się najbardziej prawdopodobnym brakującym elementem ... i w każdym razie powinna być konieczna, aby to zadziałało. Zakładając, że dałeś VPC wystarczająco dużo czasu na ponowną konfigurację w tle po odpowiedniej zmianie konfiguracji podsieci, nie mam pomysłów.
Michael - sqlbot
2
Ach, blok, którego potrzebujesz dla wszystkich adresów IP, to 0.0.0.0/0. Wyślę odpowiedź.
Michael - sqlbot

Odpowiedzi:

21

Aby instancja RDS w VPC była dostępna publicznie (Internet), wszystkie podsieci, do których jest ona podłączona, muszą być „publiczne” - w przeciwieństwie do „prywatnych” - podsieci VPC.

Podsieć publiczna jest zasadniczo zdefiniowana jako podsieć, w której obiekt bramy internetowej (igw-xxxxxxxx) jest drogą do „Internetu” lub przynajmniej do miejsc docelowych, do których należy uzyskać dostęp. Zazwyczaj jest to adres docelowy 0.0.0.0/0. Publicznych podsieci należy używać w przypadku instancji (w tym RDS), które będą miały powiązany publiczny adres IP i nie należy ich używać w instancjach, które nie będą miały publicznych adresów IP, ponieważ prywatne adresy nie działają w Internecie bez tłumaczenia.

Natomiast podsieć prywatna ma swoją tablicę routingu skonfigurowaną do osiągania miejsc docelowych w Internecie za pośrednictwem innego wystąpienia EC2, zwykle wystąpienia NAT. To pokazuje w tabeli tras VPC powiązanej z tą podsiecią jako i-xxxxxxxx, a nie „igw”. Ta maszyna (która sama w rzeczywistości będzie w innej podsieci niż ta, dla której działa jako miejsce docelowe trasy) służy jako tłumacz, umożliwiając instancjom dostępnym wyłącznie w adresie IP przezroczyste wysyłanie wychodzących żądań internetowych za pomocą publicznego komputera NAT IP dla potrzeb Internetu. Instancje z publicznym adresem IP nie mogą poprawnie współpracować z Internetem, jeśli są podłączone do prywatnej podsieci.

W tym konkretnym przypadku podsieci powiązane z instancją RDS nie zostały tak naprawdę skonfigurowane jako coś, co można by po prostu sklasyfikować jako prywatną lub publiczną podsieć, ponieważ podsieć w ogóle nie miała domyślnej trasy. Dodanie domyślnej trasy przez obiekt „igw” lub, podobnie jak OP, dodanie trasy statycznej do internetowego adresu IP, w którym potrzebna była łączność, do tabeli tras VPC dla podsieci rozwiązuje problem z łącznością.

Jednak ... Jeśli wystąpi podobny problem, nie możesz po prostu zmienić tabeli tras lub zbudować nowych tabel tras i powiązać z nimi podsieci, chyba że nic już nie działa poprawnie w podsieciach, ponieważ zmiana może być uzasadniona oczekuje się, że zerwie istniejącą łączność. W takim przypadku poprawnym przebiegiem byłoby zapewnienie wystąpień w różnych podsieciach poprawnych wpisów tablicy tras.

Podczas konfigurowania VPC idealnie jest jasno zdefiniować role podsieci i w pełni zapewnić niezbędne trasy przy pierwszym uruchomieniu VPC. Ważne jest również, aby pamiętać, że cała sieć LAN VPC VPC jest siecią definiowaną programowo. W przeciwieństwie do sieci fizycznej, w której router może stać się wąskim gardłem i często rozsądne jest umieszczanie maszyn o dużym natężeniu ruchu między nimi w tej samej podsieci ... przecinanie ruchu w podsieciach nie ma ujemnego wpływu na wydajność VPC. Maszyny powinny być umieszczane w podsieciach odpowiednich do potrzeb adresowania IP maszyny - adres publiczny, podsieć publiczna; brak adresu publicznego, prywatna podsieć.

Więcej dyskusji na temat logistyki prywatnych / publicznych podsieci w VPC można znaleźć w Dlaczego potrzebujemy prywatnej podsieci w VPC (w przepełnieniu stosu).

Michael - sqlbot
źródło
2

To już świetna odpowiedź, ale AWS tworzy dla ciebie publiczną podsieć, kiedy wybierzesz opcję „publicznie dostępną”. Dla mnie problemem była raczej domyślna grupa zabezpieczeń VPC. Szukałem w sieci ACL zasad - nie Security Group . (Wybranie opcji „publicznie dostępne” w RDS dodaje grupę zabezpieczeń, ale nie dodaje automatycznie reguł ruchu przychodzącego).

Kliknij RDS, a następnie zidentyfikuj i kliknij grupę zabezpieczeń. Następnie w „regułach ruchu przychodzącego” dodaj port 3306 i dodaj łączący się adres IPV4, xxxx / 32 (lub 0.0.0.0/32 - jeśli chcesz połączyć cały Internet - ale bądź ostrożny).

Charlie Dalsass
źródło
0

Sprawdź także, czy sieć, z którą jesteś połączony, nie blokuje połączeń z innym serwerem na porcie 3306. Tak było w przypadku mojego połączenia z moją siecią korporacyjną.

gary69
źródło